Node.js:如何重新加载模块

时间:2015-11-05 14:18:00

标签: node.js module reload

我是NodeJS的新手,所以我可能会犯一些错误。

我在一个名为myapp的外部文件中编写了一堆代码。我为Windows启动NodeJS,从解释器窗口输入:

var myapp = require('d:/myapp.js');

然后我可以在外部模块中使用我的函数和变量。

问题是,如果我更新myapp中的代码,那么解释器不会重新读取该文件,而是使用旧版本。

现在,这是正常的吗?如何解决这个问题?

P.S。:我在网上花了好几个小时,在包括这个在内的很多论坛上搜索过。比其他任何东西都更令人困惑。

感谢。

3 个答案:

答案 0 :(得分:4)

我通过在require语句上方添加以下内容来解决此问题:

Object.keys(require.cache).forEach(function(key) { delete require.cache[key] })

来自@Dancrumb的评论here

答案 1 :(得分:2)

注释中建议使用some answers here

但是它们不是REPL友好的,甚至可能使用额外的模块。

这里是一个单行解决方案,您可以在另一个问题的讨论中得到启发,将其粘贴到REPL中:

function nocache(module) {require("fs").watchFile(require("path").resolve(module), () => {delete require.cache[require.resolve(module)]})}

该功能将在每次文件更改时从缓存中删除您的模块。 要使用它,只需将其粘贴到REPL中,调用uncache("d:/myapp.js"),然后正常使用require

> function nocache(module) {require("fs").watchFile(require("path").resolve(module), () => {delete require.cache[require.resolve(module)]})}
> nocache("d:/myapp.js");
> var myapp = require("d:/myapp.js");
......
> myapp = require("d:/myapp.js");
....

答案 2 :(得分:0)

其他答案(一式两份,由@mihai提出)都是正确的,但对于此特定示例,最直接的答案是

firebase deploy

该模块缓存在delete require.cache['d:/myapp.js']; 中,该密钥键入 full 文件名。在这种特殊情况下,将使用完整文件名( require.cache)进行加载,因此解决该问题的方法非常简单。

但是,在大多数情况下,甚至不使用完整文件名。例如,d:/myapp.js将用于加载文件系统模块,但是开发人员会丢失完整且正确的文件名。这样,require('fs')将返回用作缓存模块的键的文件名。