Node.JS加载模块asynchronous

我想有能力加载一个已经改变的模块。 我当然不得不先卸载模块 。 由于这是一个web服务器安装程序,我问是否有一种方法以asynchronous方式加载模块,以避免在更新文件的读取期间冻结web服务器。

一会儿Node.JS移除了require.async函数。 那么,在最新版本的Node.JS上,推荐的select是什么?

  • 我应该先读取整个文件,然后使用Module库来parsing文件内容。 (而不是采取文件名读取和内部parsing的默认function)如何?
  • 我应该把这个工作外包给一些开源库吗? 哪一个?
  • 我应该写我自己的模块处理程序 – 我自己的requireAsync实现? (我知道该怎样。)

注意:除了加载asynchronous模块,我不想做任何事情,所以请不要build议我用新的web服务器路由框架来replace我的设置。

我发布了这个答案,但是欢迎您发表一个改进。

请参阅Node.JS源代码 。

Module.prototype.require = function(path) { return Module._load(path, this); };

_load版本

 Module._load = function(request, parent, isMain) { var filename = Module._resolveFilename(request, parent); if (Module._cache[filename]) return Module._cache[filename].exports; if (NativeModule.exists(filename)) { if (filename == 'repl') { // special case, needs the real require. var replModule = new Module('repl'); replModule._compile(NativeModule.getSource('repl'), 'repl.js'); NativeModule._cache.repl = replModule; return replModule.exports; } return NativeModule.require(filename); } var module = new Module(filename, parent); if (isMain) process.mainModule = module, module.id = '.'; Module._cache[filename] = module; var hadException = true; try { module.load(filename); hadException = false; } finally { if (hadException) delete Module._cache[filename]; } return module.exports; }; 

我的require.async.js版本就像

 var NativeModule = require('native_module'); var fs = require('fs'); if(!require.async) require.async = function (path, callback) { module.exports(path, this, callback); } // Comment out if you dislike using globals module.exports = function(request, parent, callback) { var filename = Module.resolve(request, parent); // This is a Sync function. TODO, change it to an async function with a callback. if (Module.cache[filename]) callback(Module.cache[filename].exports); else if (NativeModule.exists(filename)) callback(new Error('What are you thinking?')) else fs.readFile(filename, 'utf8', function(err, file) { if (Module.cache[filename]) callback(null, Module.cache[filename].exports); // For the case when there are two calls to require.async at a time. else if(err) callback(err) else { var module = new Module(filename, parent); try { module._compile(file); Module.cache[filename] = module; } catch(ex) { callback(err) } if(Module.cache[filename]) callback(null, module.exports) } } 

注意事项

  • 在代码中有一个TODO,它使多个调用stat成为asynchronous。 文件的实际读取是常规的asynchronous,所以这是很好的。
  • 如果你是asynchronous加载一个模块,并且你正在加载的模块是同步加载另一个模块,那么你还没有完全与代码asynchronous – 有你。
  • 它使用一个私有方法 – _compile