关于我如何在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全局变量的线索。


当前回答

加载器是我的解决方案快速加载一个目录,递归。

可以返回

{'path/to/file': 'fileContents…'} 或 {path: {to: {file: 'fileContents'}}}

它有回调函数,当文件被更改时将被调用。

它处理的情况是文件足够大,以至于watch在写入完成之前就被调用。

我已经在项目中使用它一年左右了,最近才添加了承诺。

帮我进行战斗测试!

https://github.com/danschumann/loaddir

其他回答

我尝试过pm2:安装简单,使用也很方便;结果令人满意。但是,我们必须考虑我们想要哪个版本的pm2。PM 2运行时是免费版,而pm2 plus和pm2 enterprise则不是免费的。

至于Strongloop,我的安装失败或没有完成,所以我不能使用它。

我正在制作一个相当小的节点“东西”,能够加载/卸载模块(所以,也就是说,你可以重新启动你的应用程序的一部分,而不会使整个应用程序关闭)。 我加入了一个(非常愚蠢的)依赖管理,所以如果你想停止一个模块,所有依赖于它的模块也会停止。

到目前为止一切顺利,但是我遇到了如何重新加载模块的问题。显然,只需要从“require”缓存中删除模块就可以完成工作。因为我不热衷于直接改变节点源代码,我想出了一个非常hack -hack的方法:在堆栈中搜索跟踪最后一次调用“require”函数,抓取对它的“cache”字段的引用和..那么,删除对节点的引用:

    var args = arguments
    while(!args['1'] || !args['1'].cache) {
        args = args.callee.caller.arguments
    }
    var cache = args['1'].cache
    util.log('remove cache ' + moduleFullpathAndExt)
    delete( cache[ moduleFullpathAndExt ] )

其实更简单:

var deleteCache = function(moduleFullpathAndExt) {
  delete( require.cache[ moduleFullpathAndExt ] )
}

显然,这工作得很好。我完全不知道参数["1"]是什么意思,但它在做它的工作。我相信节点总有一天会实现重载功能,所以我想现在这个解决方案也是可以接受的。 (顺便说一句。我的“东西”将在这里:https://github.com/cheng81/wirez,几周后去那里,你应该看到我在说什么)

解决方案: http://github.com/shimondoodkin/node-hot-reload

注意,您必须自己注意所使用的引用。

这意味着如果你这样做:var x=require('foo');y = x, z = x.bar;然后热装 它。

这意味着你必须在热reaload回调函数中替换存储在x、y和z中的引用。

有些人混淆了热重载和自动重启 我的nodejs-autorestart模块也有upstart集成,可以在引导时自动启动。 如果你有一个小的应用程序自动重启是可以的,但当你有一个大的应用程序热重载是更合适的。很简单,因为热重载更快。

我也喜欢我的节点流入模块。

没有一个恶魔是伟大的。我只是为调试和监视选项添加了更多参数。

package.json

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

执行命令:nodemon——watch server——inspect ./server/server.js

而:

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

——inspect开启远程调试。

./server/server.js入口。

然后添加以下配置以启动。json (VS Code)和开始调试随时。

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

注意,最好将nodemon安装为项目的开发依赖项。所以你的团队成员不需要安装它或记住命令参数,他们只需要npm运行dev并开始黑客。

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

这是相当简单的,只是做这个自己没有任何依赖…内置的文件监视器已经足够成熟,它不像以前那么糟糕

你不需要任何复杂的子进程产卵/杀死和管道性病进出…你只需要一个简单的网络工作者,这就是全部!web Worker也是我在浏览器中使用的工具…所以坚持使用网络技术吧!Worker也将登录到控制台

import { watch } from 'node:fs/promises'
import { Worker } from 'node:worker_threads'

let worker = new Worker('./app.js')

async function reloadOnChange (dir) {
  const watcher = watch(dir, { recursive: true })
  for await (const change of watcher) {
    if (change.filename.endsWith('.js')) {
      worker.terminate()
      worker = new Worker('./app.js')
    }
  }
}

// All the folder to watch for
['./src', './lib', './test'].map(reloadOnChange)

这可能不是最好的解决方案,如果你使用javascript以外的任何东西,不依赖于一些构建过程。