Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.JS中的热插拔。可能的_Javascript_Node.js - Fatal编程技术网

Javascript Node.JS中的热插拔。可能的

Javascript Node.JS中的热插拔。可能的,javascript,node.js,Javascript,Node.js,是否可以在Node.JS中实现或至少模拟代码?如果是,如何进行 热插拔(通常称为热插拔)是替换或添加 不停止或关闭系统的组件。二郎与 Lisp支持本机热交换 是的,您可以使用eval在节点中热插拔代码 let fn=()=>console.log('foo'); fn();//福 eval(`fn=()=>console.log('bar');`);//热插拔fn的来源 fn();//酒吧 对于commonjs模块(原始node.js模块系统),您可以通过删除其缓存并重新要求来热交换模块: de

是否可以在Node.JS中实现或至少模拟代码?如果是,如何进行

热插拔(通常称为热插拔)是替换或添加 不停止或关闭系统的组件。二郎与 Lisp支持本机热交换


是的,您可以使用
eval
在节点中热插拔代码

let fn=()=>console.log('foo');
fn();//福
eval(`fn=()=>console.log('bar');`);//热插拔fn的来源
fn();//酒吧
对于commonjs模块(原始node.js模块系统),您可以通过删除其缓存并重新要求来热交换模块:

delete require.cache[require.resolve('my-module')];
require('my-module');
我不确定这是否适用于es6模块

当然,在加载模块的任何地方都需要这样做,因为否则代码将使用仍然在RAM中的模块的早期版本返回的对象和函数

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

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

另外,javascript是一种解析和编译的快速语言(因为您需要将源代码发送到web页面)

Webpack的老把戏

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


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

@baao我认为标记为重复的问题在这里并没有真正的帮助。在浏览器中热插拔代码与在节点中热插拔代码完全不同。正在寻找Node.JS解决方案。重新打开它…可能在非常有限的范围内,但仅与闭包、模块等中状态变量的代码协作。。。在一般意义上,仅仅“重新加载”node.js模块并让使用该模块的所有代码继续正常工作是不可能的,而是自动开始使用新代码。如果查看所有可用于更新正在运行的服务器(如nodemon或node supervisor)中代码的工具,它们都会重新启动服务器。您可以查看或。不确定这些是否符合您的要求。我不是反对者,但您可能需要详细说明答案。=]增加了一个例子。