我是否应该在每个文件中都需要一个模块或者需要它一次并将其作为参数传递?

时间:2015-01-14 17:46:49

标签: javascript node.js

假设我有50个模块,每个模块都需要Underscore库。最好像50次一样加载Underscore:

//a module
var _ = require('underscore');

或者更好地从主文件中传递它:

//app.js
var _ = require('underscore');
require('./app_modules/module1.js')(_); // passing _ as argument
require('./app_modules/module2.js')(_); // passing _ as argument
require('./app_modules/module3.js')(_); // passing _ as argument
(..)

它有什么不同吗?

2 个答案:

答案 0 :(得分:5)

模块在第一次加载后被缓存,因此你可以在每个文件中都要求它。 require()来电Module._load

Module._load = function(request, parent, isMain) {
  // 1. Check Module._cache for the cached module. 
  // 2. Create a new Module instance if cache is empty.
  // 3. Save it to the cache.
  // 4. Call module.load() with your the given filename.
  //    This will call module.compile() after reading the file contents.
  // 5. If there was an error loading/parsing the file, 
  //    delete the bad module from the cache
  // 6. return module.exports
};

请参阅:http://fredkschott.com/post/2014/06/require-and-the-module-system/

答案 1 :(得分:0)

第一种选择通常是最好的。

由于要求被缓存,因此选择第二个选项时性能没有提高。使用第一个选项的优点是它更容易理解,并且您不需要使每个模块都作为函数使用Underscore库作为参数。

但是,您可能希望能够轻松更改正在使用的库。如果是这种情况,第二个选项是有意义的,因为您只需要更改主文件中的库。无论如何,我相信这是用例并不常见,所以可能你使用第一个选项很好。