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

3
我正在使用类似于airbnb's rendr的东西,即我自己实现的在客户端和服务器之间共享backbone代码的方法,使用相同的Backbone模型、视图、集合和模板来构建完整的HTML。我的文件/模块被定义为requirejs模块,这样我就可以轻松地在客户端上分享它们。 在开发模式下,我希望requirejs在我刷新浏览器时(无需重新启动服务器)从磁盘重新获取/重新加载任何模块,以便我获取服务器呈现的最新模板和JavaScript,最终提供给我最新的HTML。
当在nodejs上使用requirejs时,像以下这样添加bust参数到urlArgs的技巧不起作用,即服务器不会重新加载/重新获取任何模块。
urlArgs: "bust=v2" 

我想知道在node中是否可以重新加载/刷新来自磁盘空间的requirejs模块而无需重启服务器?具体来说,这对于 require-text插件的模板非常有用。此外,仅对一组受限制的模块应用重新加载将是不错的选择。

你又来了! :P 它到底是怎么“不工作”的?此外,我发现在开发过程中使用 urlArgs: "bust=" + (new Date()).getTime() 更好。还有,为什么你不使用 Node 的 require 系统呢? - c24w
嗨 c24w :-) 我更新了我的答案。希望现在更清楚了。 - forste
2个回答

2
我从未做过这个,但是快速搜索显示有几个选项,包括自动重启服务器:

您也可以像这样创造性地做一些类似的事情:

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

您几乎肯定可以清除 RequireJS 在缓存中的版本,强制其重新加载,尽管我怀疑节点会再次提供旧文件。

最后,也许看一看热重载,它似乎可以绕过缓存而无需重启服务器(示例)。


感谢提示 delete require.cache[],在 webpack watch 或 webpack dev server 中,我需要始终获取一些 postcss 所需文件的最新内容。 - mikep

1

和原帖一样,我也在寻找一种使node和RequireJS开发更加简单快捷的方式。在我的情况下,我正在使用grunt中的watch任务结合RequireJS,并希望能够让RequireJS始终从文件系统获取最新的模块版本。幸运的是,我发现了一个非常简单的解决方案

我不得不稍微修改了Henning Kvinnesland的建议,加上了timeout,但现在它工作得很完美:

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);
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接