在Node.JS中进行热交换。可能?

时间:2017-12-30 23:56:27

标签: javascript node.js

是否可以在Node.JS中实现或至少模拟代码hot swapping?如果是,怎么样?

  

热插拔(通常称为热插拔)正在替换或添加   组件没有停止或关闭系统。二郎和   Lisp支持本地热插拔。

3 个答案:

答案 0 :(得分:0)

对于commonjs模块(原始的node.js模块系统),您可以通过删除其缓存并重新要求它们来热交换模块:

delete require.cache[require.resolve('my-module')];
require('my-module');

我不确定这是否适用于es6模块。

当然,这需要在加载模块的任何地方进行,因为否则,您的代码将使用仍在RAM中的模块的先前版本返回的对象和函数。

触发级联重新加载的一种方法是使您的主代码也成为由需要它的简单脚本执行的模块。然后重新加载您的主模块将导致它重新加载它使用的其他模块。

您可能不需要热插拔

但是,在实际操作中,您可能会发现实际上并不需要热插拔。大多数node.js服务器需要几毫秒的时间才能启动。部分原因是node.js中的大多数I / O库延迟连接到外部服务。在执行其余代码之前,Node.js服务器通常不等待数据库连接成功。相反,它将在您第一次发出数据库请求时尝试连接到数据库。

此外,javascript是一种快速分析和编译的语言(由于您将源发送到网页,因此这是必需的)

答案 1 :(得分:0)

Webpack https://github.com/minimal-xyz/minimal-webpack-nodejs-hmr 的老技巧。

Webpack 支持模块热替换,Webpack 也支持编译 Node.js 应用程序,它可以结合这两个特性。注意:它是为开发而设计的,而不是为部署而设计的。

虽然它已经是一个可行的解决方案,但我认为 Webpack 包含太多的功能,这使得它非常沉重。我仍然希望有一天我们有更轻松的解决方案,比如它如何在 ClojureScript 中默认支持 HMR。

答案 2 :(得分:-1)

是的,您可以使用eval在Node中热交换代码。

let fn = () => console.log('foo');
fn(); // foo
eval(`fn = () => console.log('bar');`); // hot swap the source of fn
fn(); // bar