Javascript 在运行时重新加载模块
我正在考虑使用Socket.IO将一个要求很高(流量很大)的基于Socket的体系结构从.NET移植到Node.JS 我当前的系统是在.NET中开发的,使用一些脚本语言,在运行时加载,因此如果需要,我可以通过向服务器发出重新加载命令来进行热修复,而无需重新启动不同的服务器/调度程序进程 我最初是这样构建的,正如我所说的,如果需要,我可以进行热修复,还可以使用透明的修复程序保持系统可用 我不熟悉Node.JS,但这正是我想要完成的:Javascript 在运行时重新加载模块,javascript,node.js,Javascript,Node.js,我正在考虑使用Socket.IO将一个要求很高(流量很大)的基于Socket的体系结构从.NET移植到Node.JS 我当前的系统是在.NET中开发的,使用一些脚本语言,在运行时加载,因此如果需要,我可以通过向服务器发出重新加载命令来进行热修复,而无需重新启动不同的服务器/调度程序进程 我最初是这样构建的,正如我所说的,如果需要,我可以进行热修复,还可以使用透明的修复程序保持系统可用 我不熟悉Node.JS,但这正是我想要完成的: 在运行时按需加载javascript文件,将它们存储在变量中的
- 在运行时按需加载javascript文件,将它们存储在变量中的某个位置,并调用脚本函数
谢谢 如果我正确理解了你的问题。您可以查看该模块 或者,如果您希望能够重新加载
所需的
文件,则必须清除缓存并重新加载文件,这是可以做到的。检查代码,你会明白的
模块在第一次加载后被缓存。这意味着
(除其他事项外)每个对require(“foo”)的调用都将得到
返回的对象完全相同,如果它将解析为相同的
文件
多次调用require('foo')可能不会导致模块代码丢失
执行多次。这是一个重要特征。有了它,
可以返回“部分完成”的对象,从而允许传递
即使会导致循环,也要加载依赖项
可以找到更多信息
delete require.cache[require.resolve('./mymodule.js')]
require
)/myModule.js
module.invalidable = true;
var count = 0;
exports.count = function() {
return count++;
}
require('module-invalidate');
var myModule = require('./myModule.js');
console.log( myModule.count() ); // 0
console.log( myModule.count() ); // 1
mySystem.on('hot-reload-requested', function() {
module.invalidateByPath('./myModule.js'); // or module.constructor.invalidateByExports(myModule);
console.log( myModule.count() ); // 0
console.log( myModule.count() ); // 1
});
主模块/index.js
module.invalidable = true;
var count = 0;
exports.count = function() {
return count++;
}
require('module-invalidate');
var myModule = require('./myModule.js');
console.log( myModule.count() ); // 0
console.log( myModule.count() ); // 1
mySystem.on('hot-reload-requested', function() {
module.invalidateByPath('./myModule.js'); // or module.constructor.invalidateByExports(myModule);
console.log( myModule.count() ); // 0
console.log( myModule.count() ); // 1
});
对不起-我不确定我是否理解这个问题-你想做什么?您是否询问如何将
require
与您自己的自定义脚本一起使用?因为你问的是如何将导入的脚本重新加载到主脚本?实际上,我想在运行时加载外部javascript文件,能够修改这些文件及其函数并重新加载它们,而无需终止并重新启动Node.JS进程。请不要对多个问题给出相同的答案。发布一个好的答案,然后投票/标记以重复结束其他问题。如果问题不是重复的,请根据问题定制您的答案。