以下面为例:
// Load Required Modules
var Express = require('express'), // Express Framework
Session = require('express-session'); // Express Sessions
App = Express(), // Express Application
HTTP = require('http').Server(App), // HTTP Server
Parser = require('body-parser'), // Request Body Parser
Moment = require('moment'); // Date Manipulation And Formatting
var Application = {};
Application.ExpressFramework = Express;
Application.Express = App;
Application.Parser = Parser;
Application.Moment = Moment;
// Load Internal Modules
Application.Services = require('./modules/services')(Application);
Application.Models = require('./models')(Application);
etc
etc
Application.Services.Start();
正如您所看到的,所有内容都被加载到一个变量中,然后该变量被传递到所有模块,以便它们可以访问所有内容。
这是一种不好的做法吗?如果是的话,为什么? (不是寻求个人意见 - 根据 StackOverflow 规则,只是想知道这是否会导致负面性能)。
最佳答案
一般来说,如果您想将一组变量传递给一堆不同的模块,那么将它们分组为一个对象是一种自然的方法,这样您就可以只传递该单个对象,而不是一长串单独的变量变量。它也更具可扩展性。
node.js 模块模式还支持 exports
机制,作为实现此目的的一种方式,但它更多的是一种“拉”模型,其中另一个模型执行 require
并获取您的导出。
您显示的代码更像是“推送”模型,您加载另一个模块,然后将变量传递给它,这是另一种合理的做事方式,有时逻辑上效果更好。
但是......您分享的一些内容以及分享它们的方式对我来说似乎并不理想。
<小时/>在您展示的特定示例中,共享您正在共享的一些内容有点奇怪。例如,无需共享 Moment
或 Parser
变量。如果另一个模块需要其中一个模块,它应该只执行自己的 require('moment');
并以这种方式获取模块。
这使得你的其他模块更加独立(它需要它需要的东西)。 require
子系统会缓存模块,因此当您在同一模块上执行第二个 require()
时,它不会物理地重新加载模块。
偶尔会有理由共享代码中的 App
或 HTTP
变量,因为这些是您不希望有多个实例的实例,而不是模块。我可能不会将它们放在一个大对象中,而是只将它们传递给实际需要它们的模块。当您将很多东西放入一个对象中并将整个对象传递给其他几个模块(每个模块仅使用该对象中的一些东西)时,很难判断什么真正依赖于什么。另一方面,如果您只传递另一个模块所需的内容,那么代码就非常清楚另一个模块真正使用的内容。
关于javascript - 将所有内容加载到 Node.js 中的一个变量中是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26415435/