防止RequireJS在Nodej上缓存所需的脚本

时间:2013-04-03 13:33:34

标签: node.js caching requirejs

我正在使用类似airbnb's rendr的内容,即my own implementation of sharing backbone code between client and server,使用我在客户端上使用的相同Backbone模型,视图,集合和模板在服务器上构建完整的HTML。我的文件/模块被定义为requirejs模块,这样我就可以在客户端上轻松共享它们。 在开发模式中,我希望requirejs在刷新浏览器时重新/重新加载光盘中的任何模块(无需重新启动服务器),因此我的服务器渲染使用最新的模板和javascript最终为我提供最新的HTML。

在使用nodejs的服务器上使用requirejs时,the trick of appending bust parameters to the urlArgs如下所示不起作用,即服务器不会从光盘重新加载/重新获取任何模块

urlArgs: "bust=v2" 

我想知道,如果在节点中重新加载/重新获取需要来自光盘空间的模块而无需重新启动服务器吗?具体来说,这对the require-text plugin模板非常有用。另外,将重新加载仅应用于一组受限制的模块会很好。

2 个答案:

答案 0 :(得分:1)

我从来没有这样做,但快速搜索显示a few options,包括自动重启服务器:

你也可以做一些类似的创意:

  • delete require.cache['/home/shimin/test2.js']

你几乎可以肯定地清除了RequireJS在缓存中的版本,强制它重新加载它,虽然我怀疑该节点只会再次提供旧文件。

最后,也许看看热重新加载,它似乎可以解决缓存问题而无需重启服务器(example)。

答案 1 :(得分:1)

与OP一样,我一直在寻找一种方法,使用RequireJS在节点中进行开发更容易,更快捷。就我而言,我在节点中使用RequireJS和grunt watch任务,并且希望能够强制RequireJS始终从文件系统获取最新版本的模块。幸运的是,我发现了一个非常simple solution

我不得不通过添加超时来稍微修改Henning Kvinnesland的建议,但现在它的工作就像一个魅力:

var requirejs = require('requirejs');
// Set up requirejs.config here...
// Disable caching of modules
requirejs.onResourceLoad = function(context, map) {
    setTimeout(function() {
        requirejs.undef(map.name);
    }, 1);
};