javascript - 将所有内容加载到 Node.js 中的一个变量中是个好主意吗?

标签 javascript node.js

以下面为例:

// 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 并获取您的导出。

您显示的代码更像是“推送”模型,您加载另一个模块,然后将变量传递给它,这是另一种合理的做事方式,有时逻辑上效果更好。

但是......您分享的一些内容以及分享它们的方式对我来说似乎并不理想。

<小时/>

在您展示的特定示例中,共享您正在共享的一些内容有点奇怪。例如,无需共享 MomentParser 变量。如果另一个模块需要其中一个模块,它应该只执行自己的 require('moment'); 并以这种方式获取模块。

这使得你的其他模块更加独立(它需要它需要的东西)。 require 子系统会缓存模块,因此当您在同一模块上执行第二个 require() 时,它不会物理地重新加载模块。

偶尔会有理由共享代码中的 AppHTTP 变量,因为这些是您不希望有多个实例的实例,而不是模块。我可能不会将它们放在一个大对象中,而是只将它们传递给实际需要它们的模块。当您将很多东西放入一个对象中并将整个对象传递给其他几个模块(每个模块仅使用该对象中的一些东西)时,很难判断什么真正依赖于什么。另一方面,如果您只传递另一个模块所需的内容,那么代码就非常清楚另一个模块真正使用的内容。

关于javascript - 将所有内容加载到 Node.js 中的一个变量中是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26415435/

相关文章:

JavaScript promise 和递归 : is this a stack bomb?

javascript - Nuxt.js:方法中的迭代会导致问题

javascript - 如何使用 mongoose 将对象数组保存在 mongodb 中?

node.js - 当一个特定的时候沉默 JSHint

javascript - 如何编写一个输出 react 传单标记的组件?

javascript - 为什么我应该在 JSX 返回中指定换行元素 : <div> or <React. Fragment> 或 <>?

javascript - 在 php 中使用 header 将自定义字符串返回到前端

node.js - 如何在grpc双向rpc中发送消息而不需要从grpc Node 客户端进行缓冲

sql - 无法使用 google cloudSQL 连接所需的端口

node.js - 拒绝访问异常 : User is not authorized to perform dynamodb BatchWriteItem on resource: table