如何在Node.js中自动重新加载文件?

关于如何在Node.js中实现文件自动重装的任何想法?每次更改文件时,我都无法重新启动服务器。显然,Node.js的require()功能不会重新加载文件(如果已经需要),因此我需要执行以下操作:

var sys     = require('sys'), 
    http    = require('http'),
    posix   = require('posix'),
    json    = require('./json');

var script_name = '/some/path/to/app.js';
this.app = require('./app').app;

process.watchFile(script_name, function(curr, prev){
    posix.cat(script_name).addCallback(function(content){
        process.compile( content, script_name );
    });
});

http.createServer(this.app).listen( 8080 );

app.js文件中,我有:

var file = require('./file');
this.app = function(req, res) { 
    file.serveFile( req, res, 'file.js');  
}

但这也不起作用-我在process.compile()声明“ require”未定义语句中遇到错误process.compile正在逃避app.js,但不知道node.js全局变量。

古一JinJin2020/03/17 17:02:36
const cleanCache = (moduleId) => {
    const module = require.cache[moduleId];
    if (!module) {
        return;
    }
    // 1. clean parent
    if (module.parent) {
        module.parent.children.splice(module.parent.children.indexOf(module), 1);
    }
    // 2. clean self
    require.cache[moduleId] = null;
};
HarryTony2020/03/17 17:02:36

对于使用Vagrant和PHPStorm的人,文件监视程序是一种更快的方法

  • 禁用文件的立即同步,因此您仅在保存时运行命令,然后为* .js文件和工作目录创建作用域并添加此命令

    流浪者ssh -c“ /var/www/gadelkareem.com/forever.sh重新启动”

在forever.sh哪里

#!/bin/bash

cd /var/www/gadelkareem.com/ && forever $1 -l /var/www/gadelkareem.com/.tmp/log/forever.log -a app.js
LGil2020/03/17 17:02:36

Nowadays WebPack dev server with hot option is used. you can add a script like this in your package.json : "hot": "cross-env NODE_ENV=development webpack-dev-server --hot --inline --watch-poll",

and every change in your files will trigger a recompile automatically

小卤蛋梅蛋蛋2020/03/17 17:02:36

另一个简单的解决方案是使用fs.readFile而不是使用require, 您可以保存包含json对象的文本文件,并在服务器上创建一个间隔来重新加载该对象。

优点:

  • 无需使用外部库
  • 与生产相关(更改时重新加载配置文件)
  • 易于实施

缺点:

  • 您无法重新加载模块-仅包含键值数据的json
神无老丝Davaid2020/03/17 17:02:36

我最近遇到了这个问题,因为通常的嫌疑人没有使用链接包。如果您像我一样,并且npm link在开发过程中充分利用了它来有效地处理由许多程序包组成的项目,那么依赖关系中发生的更改也会触发重新加载,这一点很重要。

在尝试了node-mon和pm2之后,即使按照他们的指示另外监视node_modules文件夹,他们仍然没有选择更改。尽管此处的答案中有一些自定义解决方案,但对于像这样的事情,使用单独的包装会更清洁。今天遇到了node-dev,它不需要任何选项或配置即可完美运行。

从自述文件:

与supervisor或nodemon之类的工具相比,它不会在文件系统中扫描要监视的文件。相反,它挂接到Node的require()函数中,以仅查看实际需要的文件。

梅古一小卤蛋2020/03/17 17:02:36

用这个:

function reload_config(file) {
  if (!(this instanceof reload_config))
    return new reload_config(file);
  var self = this;

  self.path = path.resolve(file);

  fs.watchFile(file, function(curr, prev) {
    delete require.cache[self.path];
    _.extend(self, require(file));
  });

  _.extend(self, require(file));
}

您现在要做的就是:

var config = reload_config("./config");

和配置将自动重新加载:)

理查德前端2020/03/17 17:02:36

这是在Windows中使用的低技术方法。将其放在一个名为的批处理文件中serve.bat

@echo off

:serve
start /wait node.exe %*
goto :serve

现在,不要node app.js从cmd shell运行,而要运行serve app.js

这将打开一个运行服务器的新Shell窗口。批处理文件将一直阻塞(由于/wait),直到您关闭shell窗口为止,此时原始cmd shell将询问“终止批处理作业(Y / N)”?如果您回答“ N”,则服务器将重新启动。

每次您要重新启动服务器时,请关闭服务器窗口并在cmd shell中回答“ N”。

Sam猴子2020/03/17 17:02:36

您可以NPM使用nodemon如果使用Express Generator,则可以在项目文件夹中使用以下命令:

nodemon npm start

或使用调试模式

DEBUG=yourapp:* nodemon npm start

您也可以直接运行

nodemon your-app-file.js

希望对您有所帮助。

Mandy小胖Pro2020/03/17 17:02:36

不必使用nodemon或类似的其他工具。只需使用您的IDE的功能。

最好的一种是IntelliJ WebStorm,它具有针对node.js的热重装功能(服务器和浏览器自动重装)

Eva2020/03/17 17:02:36

node-dev很棒。npminstall node-dev

重新加载服务器时,它甚至会发出桌面通知,并会在消息中显示成功或错误。

使用以下命令在命令行中启动您的应用程序:

node-dev app.js

米亚卡卡西L2020/03/17 17:02:36

解决此问题的另一种方法是永远使用

Forever的另一个有用功能是,它可以选择在任何源文件已更改时重新启动应用程序。这使您不必在每次添加功能或修复错误时都手动重新启动。要在此模式下永久启动,请使用-w标志:

forever -w start server.js
阿飞阳光2020/03/17 17:02:36

编辑:我的答案已过时。Node.js是一项快速变化的技术。

我也想知道重新加载模块。我修改了node.js,并在nathly / node的 Github上发布了源代码唯一的区别是功能require它有一个可选的第二个参数reload

require(url, reload)

app.js在当前目录中重新加载,请使用

app = require("./app", true);

像这样写,你就可以自动重新加载:

process.watchFile(script_name, function(curr, prev) {
    module = reload(script_name, true);
});

我看到的唯一问题是变量module,但是我现在正在研究它。

达蒙西门十三2020/03/17 17:02:36

有一个最近的线程关于Node.js的邮件列表,在这个问题上。简短的答案是不,目前无法自动重新加载所需的文件,但是一些人已经开发了添加此功能的补丁程序。

理查德小胖Harry2020/03/17 17:02:36

nodemon是一个伟大的。我只是添加更多用于调试和监视选项的参数。

package.json

  "scripts": {
    "dev": "cross-env NODE_ENV=development nodemon --watch server --inspect ./server/server.js"
  }

命令: nodemon --watch server --inspect ./server/server.js

鉴于:

--watch server重新启动应用程序时更改.js.mjs.coffee.litcoffee,并.json在文件中的server文件夹(包括子文件夹)。

--inspect 启用远程调试。

./server/server.js 入口点。

然后将以下配置添加到launch.json(VS Code),并随时开始调试。

{
    "type": "node",
    "request": "attach",
    "name": "Attach",
    "protocol": "inspector",
    "port": 9229
}

请注意,最好将其安装nodemon为项目的dev依赖项。因此,您的团队成员无需安装它或记住命令参数,他们只需npm run dev开始进行黑客攻击。

nodemon文档上查看更多信息https : //github.com/remy/nodemon#monitoring-multiple-directories

番长阳光2020/03/17 17:02:36

您可以通过安装Node-Supervisor

npm install supervisor

参见http://github.com/isaacs/node-supervisor

小宇宙神乐2020/03/17 17:02:35

nodemon首先出现在google搜索中,并且似乎可以解决这个问题:

npm install nodemon -g
cd whatever_dir_holds_my_app
nodemon app.js
Green猴子2020/03/17 17:02:35

节点主管很棒

在保存时重新启动的用法:

npm安装主管-g
主管app.js

由伊萨克- http://github.com/isaacs/node-supervisor

SamGreen2020/03/17 17:02:35

一个很好的,最新的替代方法supervisornodemon

监视node.js应用程序中的任何更改并自动重启服务器-非常适合开发

使用方法nodemon

$ npm install nodemon -g
$ nodemon app.js