在Node REPL中动态重新加载模块

Ser*_*rov 6 javascript node.js read-eval-print-loop

我正在用REPL测试我的模块,如下所示:

repl.start({
    input: process.stdin,
    output: process.stdout
})
    .context.MyModule = MyModule;
Run Code Online (Sandbox Code Playgroud)

有没有办法在我更改并保存模块时自动重新加载模块,而无需退出并再次运行repl?

fur*_*oid 2

您可以使用该chokidar模块并强制重新加载(您将丢失模块中的运行时上下文,但它应该自动重新加载)。

var ctx = repl.start({
    input: process.stdin,
    output: process.stdout
})
    .context;

ctx.MyModule = require('./mymodule');

chokidar.watch('.', {ignored: /[\/\\]\./}).on('all', function(event, path) {
    delete require.cache['./mymodule'];
    ctx.MyModule = require('./mymodule');
});
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,我很乐意尝试一下并找到可行的解决方案。


编辑:如果它没有干净地进行垃圾收集(有任何打开的句柄/侦听器),则每次重新加载时都会泄漏。您可能需要添加一个“clean-exit”函数来MyModule优雅地停止一切,然后在手表处理程序中调用它。