【问题标题】:Hot swapping in Node.JS. Possible?Node.JS 中的热交换。可能的?
【发布时间】:2017-12-30 23:56:26
【问题描述】:

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

热插拔(通常称为热插拔)是替换或添加 组件,而无需停止或关闭系统。二郎和 Lisp 原生支持热交换。

【问题讨论】:

  • @baao 我不认为标记为重复的问题在这里真的很有帮助。在浏览器中进行热交换代码与在 Node.js 中进行完全不同。正在寻找 Node.JS 解决方案。
  • 重新打开它....
  • 也许在非常有限的范围内,但仅与闭包、模块等中的状态变量的代码合作......在一般意义上,仅仅“重新加载”一个 node.js 是不可能的模块并让使用该模块的所有代码仍然可以正常工作,但会自动开始使用新代码。如果您查看所有可用于在运行的服务器中更新代码的工具,例如 nodemon 或 node-supervisor,它们都会重新启动服务器。
  • 您可以查看noduleslive-node。不确定这些是否符合您的要求。

标签: javascript node.js


【解决方案1】:

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

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

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

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

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

您可能不需要热插拔

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

此外,javascript 是一种快速解析和编译的语言(因为您将源代码发送到网页,所以很有必要)

【讨论】:

    【解决方案2】:

    Webpack 的老把戏https://github.com/minimal-xyz/minimal-webpack-nodejs-hmr

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我不是反对者,但您可能想详细说明答案。 =]
      • 添加了一个例子。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      相关资源
      最近更新 更多