【问题标题】:In Node.js, how can I load my modules once and then use them throughout the app?在 Node.js 中,如何加载我的模块一次,然后在整个应用程序中使用它们?
【发布时间】:2013-12-15 19:51:30
【问题描述】:

我想创建一个全局模块文件,然后让我的所有文件都需要该全局模块文件。在该文件中,我将加载所有模块一次并导出已加载模块的字典。

我该怎么做?

我实际上尝试过创建这个文件......每次我require('global_modules') 时,所有模块都会不断重新加载。这是 O(n)。

我希望文件是这样的(但它不起作用):

//global_modules.js - only load these one time
var modules = {
    account_controller: '/account/controller.js',
    account_middleware: '/account/middleware.js',
    products_controller: '/products/controller.js',
    ...
}
exports.modules = modules;

【问题讨论】:

    标签: javascript node.js require


    【解决方案1】:

    1。使用魔法变量(声明时不带var

    使用神奇的全局变量,不带var

    例子:

    fs = require("fs");
    

    而不是

    var fs = require("fs");
    

    如果你在声明变量时没有输入var,那么这个变量将会是一个magic global

    我确实推荐这个。特别是,如果您处于严格模式 ("use strict"),则根本无法正常工作。

    2。使用global.yourVariable = ...

    附加到global 对象的字段成为全局变量,可以从应用程序中的任何位置访问。

    所以,你可以这样做:

    global.fs = require("fs");
    

    这并不像 1. 那样糟糕,但仍应尽可能避免。


    你的例子:

    假设您有两个文件:server.js(主文件)和global_modules.js 文件。

    server.js 你会这样做:

    require("./global_modules");
    

    global_modules.js 你将拥有:

    _modules = {
        account_controller: require('/account/controller.js'),
        account_middleware: require('/account/middleware.js'),
        products_controller: require('/products/controller.js'),
        ...
    }
    

    global._modules = {...}
    

    server.js你将能够做到:

    _modules.account_controller // returns require('/account/controller.js'),
    

    【讨论】:

    • 我需要在 app.js 中输入var 吗? (当我第一次在整个应用程序的第一行加载这个文件时)。
    • @TIMEX 查看编辑。你只需要 require 模块文件。
    • 我有 40 个模块。在每个模块中,我都想要求所有其他模块。它不会加载1600次? (40 x 40)
    • @TIMEX 不,您只在主脚本中调用一次(server.jsapp.js)。然后在 之后 require("./global_modules") 加载的其他 40 个文件中,您可以执行 _modules.something,其中 _modules 是一个全局对象,包含您在 @ 中设置的字段987654345@文件。
    • 哦!!!我懂了。我不需要将它包含在其他模块中。明白了。这是推荐的做法吗?
    【解决方案2】:

    require 已经做到了。尝试加载一个模块,修改它,然后在另一个地方或文件中再次加载它:

    var fs = require('fs'):
    console.log(fs.hey);
    fs.hey = 'HEY TIMEX, WHATS UP?';
    //another place of the same process
    var fs = require('fs');
    console.log(fs.hey);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多