有没有一种方法可以在 node.js 运行时更改它?

5

有没有一种方法可以在node.js运行时更改它?

比如在它运行时编辑JavaScript文件,然后随着其运行相应地进行更改。


可能重复的问题 http://stackoverflow.com/questions/6310722/refresh-node-js-script - Jamund Ferguson
5个回答

6

是的。

你需要通过另一个监视脚本更改的文件来加载你的文件。每当脚本重新启动时,你可能需要一些设置/拆卸代码来运行。

var fs = require('fs');
var file = 'file.js';

var script;
function loadScript() {
  if (script) {
    if (typeof script.teardown === 'function') {
      script.teardown();
    }
    delete require.cache[file];
  }

  script = require(file);
}

fs.watch(file, function(event, filename) {
  if (event !== 'change') return;
  loadScript();
});

loadScript();

fs.watch API 在不同平台上并不完全一致,在某些情况下也可能无法使用。


2

1

不,这是不可能的。当你启动一个Node服务器/应用程序时,它会加载当前版本的文件。如果你在启动后进行更改,它将无法识别。你必须杀掉该应用程序并重新启动才能使这些更改生效。

有一些像node-dev这样的实用程序可以自动完成此操作。它们监视文件系统以进行更改,并根据需要重启应用程序(以及其他一些功能,例如Growl通知)。

我更喜欢手动重启应用程序。这样你就知道它运行的确切版本,并可以多次保存对文件的更改,然后再决定何时再试一次。


1
你可以使用 nodemon
nodemon会监视启动nodemon的目录中的文件,如果有任何文件更改,nodemon会自动重新启动您的node应用程序。
是与Node开发完美搭配的解决方案。

非常适合开发。但如果我理解正确,它会重新启动您的服务器,因此您不能在不重新启动的情况下使用它来修复正在运行的生产服务器。 - bvdb

0

这是完全可能的。

只需不要在头文件中要求您的模块;相反,需要时通过调用加载它们。

此外,您还可以调用require.undef('./myModule')在包含新模块之前放弃现有版本。如果您想在运行时添加新行为,可以扫描文件系统以查找任何新模块名称。

我已经多次使用node实现了插件模式,因此子模块更新将包括新插件,这些插件将在运行时被捕获。

享受吧。


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