【问题标题】:Node.js: How to make modules available to multiple files?Node.js:如何使模块可用于多个文件?
【发布时间】:2015-09-27 16:18:01
【问题描述】:

在我编写的一个 Ruby 程序中,我在“入口点”文件的顶部“需要”所有我需要的文件和模块。例如:

#Sets an absolute path for wherever the program is run from
#this_file = __FILE__
#BASEDIR = File.expand_path(File.join(this_file, '..'))
this_file = __FILE__
this_file_folder_nav = File.join(this_file, '..')
BASEDIR = File.expand_path(this_file_folder_nav)


#Required Gems
require 'ap'
require 'docx'
require 'sanitize'
etc

#Required files
require_relative "lib/commodity/stories.rb"
require_relative 'lib/worldgrowth/worldgrowth.rb'
require_relative "lib/prices/prices.rb"
require_relative 'lib/prices/prices_module.rb'
etc

I can access all the classes defined in the files above. And I can access classes defined in the 'stories.rb' in pirces_module.rb. All the required gems are accessible in all the files

问题:这是一种好的做法吗?这对我来说似乎很方便,我想在 node.js 中做同样的事情。

但是,我发现我必须在将使用该模块的所有文件上写 var module = require('someModule')。如果我有一个 node.js 应用程序的入口点文件,是否可以做类似于我在 Ruby 中所做的事情?

【问题讨论】:

    标签: ruby node.js require


    【解决方案1】:

    假设您想让核心模块“http”对您的其他文件可用。在您的入口点文件中,您可以 require('http') 并将该对象附加到 global 对象。此外,您的入口点文件将需要您可能拥有的其他文件。像这样:

    var http = require('http')
    global.http = http;
    
    var other = require('./other')
    

    现在,另一个文件可以访问 http 模块,您可以执行以下操作:

    http.createServer(function (req, res) {
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.end('Hello World\n');
    }).listen(1337, "127.0.0.1");
    
    console.log('Server running at http://127.0.0.1:1337/');
    

    【讨论】:

    • 您永远不应该将模块附加到全局对象。这会破坏可测试性和封装性,因此是非常不可取的。
    • @BrandonSmith 我明白了...您将如何尝试解决使模块在不同文件中可用的问题?我认为尝试做他想做的事情可能是不好的做法。
    • 显而易见的解决方案是处理不便之处并在需要的任何地方添加需求。一个更简洁的替代方法是创建一个实用程序模块来导出您经常需要的项目。然后,您可以将您的实用程序包含在一个要求中。最后,像 Electrolyte 这样的依赖注入器可以让重复调用同一个模块变得不那么痛苦。
    【解决方案2】:

    您可以创建一个需要所有其他模块的模块,然后在任何需要的地方都需要它。类似:

    var Common = {
      util: require('util'),
      fs:   require('fs'),
      path: require('path')
    };
    
    module.exports = Common;
    
    // in other modules
    var Common = require('./common.js');
    

    这个例子取自this article

    【讨论】:

    • 除了,这意味着您必须将所有内容都称为Common.util.method(),而不仅仅是util.method(),在我的书中,它是倒退而不是前进。我只是对每个文件中需要的所有模块做一个简单的require()。它使其余的代码更简单。
    • 这并没有解决使用模块名称的需要,它解决了每个文件需要三个(或更多)模块的需要。像这样你只需要一次
    • 我宁愿在模块文件的顶部额外输入一次以包含像 var util = require('util'); 这样的模块,而不是每次使用像 @ 这样的模块中的方法时都必须额外输入987654327@ 在您的计划中。我只是不认为按照你的建议做是净赢。它将一些require() 语句保存在一个地方,并且每次您在整个模块中使用方法时都会进行更多输入。这就是我的观点。我知道您正在尝试回答 OP 的问题,但我不认为这样做会更好。
    • 确实这是我的问题的答案。只是不是一个很好的:p。当然有更好的方法来做到这一点?我几乎很想使用 Gulp 将所有文件预编译成一个“构建”..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多