我是NodeJS的新手,所以我可能会犯一些错误。
我在一个名为myapp的外部文件中编写了一堆代码。我为Windows启动NodeJS,从解释器窗口输入:
var myapp = require('d:/myapp.js');
然后我可以在外部模块中使用我的函数和变量。
问题是,如果我更新myapp中的代码,那么解释器不会重新读取该文件,而是使用旧版本。
现在,这是正常的吗?如何解决这个问题?
P.S。:我在网上花了好几个小时,在包括这个在内的很多论坛上搜索过。比其他任何东西都更令人困惑。
感谢。
答案 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')
将返回用作缓存模块的键的文件名。