譬如我想用 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)。期盼大牛现身辟谣。
你需要 nodemon
或者 supervisor
或者 grunt
要么就用fs读文件吧
嗯,在用 grunt,先试试看 谢谢啦!
貌似也不错,可以写成 json
不过果然是不能通过编码的方式来取消 require 的缓存吗?
参考require.cache
代码上很简单
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()
目前最完美稳定的解决方法是 重启进程!!!!