有没有办法取消 node.js 对 require 模块的缓存?
发布于 1年前 作者 leungwensen 2580 次浏览

譬如我想用 express 写这样一个 router:

function (req, res) {
    try {
        var title        = req.param('title'),
            viewTemplate = 'path/to/template',
            config       = require('path/to/config') || {};

        res.render(viewTemplate, config);
    } catch (e) {
        // handleErr('400', res);
    }
};

它的功能是响应 ‘/:title’ URL, 用 ‘path/to/config’ 中的配置数据去渲染 ‘path/to/template’ 里的模板文件,返回页面。

调试的时候遇到一个有点麻烦的地方,就是修改了配置数据之后,必须重启服务器才能看到修改后的结果。

也就是 config = require('path/to/config') || {} 这个值因为 require 的时候模块缓存的存在,刷新页面的时候并不会动态去重新加载一次 ‘path/to/config.js’ 文件,导致这个文件的修改只能通过重启才能体现。

有没有方法可以取消 require 的时候的缓存呢?对我来说,如果可以在开发的时候取消这个,开发起来就方便很多了。

顺便,stackoverflow 上面貌似说不可能(http://stackoverflow.com/questions/9210542/node-js-require-cache-possible-to-invalidate)。期盼大牛现身辟谣。

15 回复

你需要 nodemon 或者 supervisor 或者 grunt

要么就用fs读文件吧

嗯,在用 grunt,先试试看 谢谢啦!

貌似也不错,可以写成 json

不过果然是不能通过编码的方式来取消 require 的缓存吗?

代码上很简单

delete require.cache[‘path/to/config’] config = require(‘path/to/config’)

代码背后的东西不这么简单,比如说通知你其他的代码更新引用等等。如果只是配置的话应该还好

谢谢! 我看文档还是不熟啊

我觉得你这样是走进误区了,require,cache是非常节省资源的设计,你那样说明你误用require了,既然需要config.js中的配置来渲染数据,为啥配置要频繁改动,如果config频繁改动为什么不反悔一个对象通过穿进去的参数动态改变配置呢!

代码热更新可以使用 bearcat

watch感觉不可靠…

delete require.cache[require.resolve(path)]

@leungwensen 不是说grunt已经落伍,要用gulp么?

不能简单的直接取消 require 的缓存,因为有些模块在载入的时候会做一些初始化工作,如果 一刀切地 取消 require 的缓存,就会导致这些模块初始化多次,在实际使用的时候就会出问题。

另外,要实现代码热更新,编写程序的时候就必须为热更新而做很多改变,比如不能长期引用某个对象或函数,所有的东西都需要通过一个函数来动态返回最新的引用,然后再操作,总会另代码显得很怪,比如:

// 原来的使用方式
var my = require('./my_module');
my.doSomething1();
my.doSomething2();

// 新的使用方式
require('./my_module').doSomethig1();
require('./my_module').doSomethig2()

目前最完美稳定的解决方法是 重启进程!!!!

回到顶部