2015-07-03 40 views
3

我如何需要全局模块,以便我可以在不同的模块中使用它,而无需再次需要它? 还是我每次都必须这样做? 有没有最佳做法呢?Node.js全局需求

继承人是我正在谈论的一个例子。 可以说,我有一个index.js这样的:

var a = require('a.js'), 
utils = require('utils.js'); 

var str = 'hello this is a test'; 
str = a.change(str); 

utils.return(str); 

a.js

var utils = require('utils.js'); 

exports.change = function(str) { 
    str = str.replace('test', 'example'); 
    utils.return('i changed test to example!'); 
    return str; 
} 

utils.js

exports.return = function (msg) { 
    console.log(msg); 
} 

你看我有需要('utils.js')两次,但我宁愿要求一次e index.js,并将其作为utils在index.js和a.js中提供。 有没有什么好的方法来实现这个目标?

+2

我其实有类似的问题以及(stackoverflow.com/questions/31196572/parse-is-undefined-in-node-js-controller)。期待看到你的问题的答案。它也可以解决我的问题。 – Amir

回答

6

nodejs开发中的常规做法是在每个模块中只需要require()模块。模块本身由nodejs缓存,因此每次都返回相同的模块,并且实际上并未反复加载。这样做而不是创建全局变量通常会使代码更加模块化并且可重用,因为每个模块都唯一地指定(使用require()语句)需要什么,而不是拥有一堆依赖于一些预先存在的全局配置的模块,这会创建更多的依赖关系,加载顺序问题等...

可以在一堆其他模块上创建一个模块,并将结果合并到一个新的主模块中(如果相关或有用的话),以便仅其他模块必须要求新的主模块。

建议不要使用全局变量来代替仅使用require()语句。请记住,在nodejs编程中,大多数require()语句只是在服务器初始化时运行,并且它们被缓存,所以没有必要避免使用require()而不是全局提供的好处和模块性。


我不会亲自推荐这个,因为它具有模块化食堂,但在具体的例子,你也可以通过utils模块到a.js构造:

var utils = require('utils.js'); 
var a = require('a.js')(utils); 
+0

感谢您的回答。问题是,我有一个高度模块化的项目,并且其他模块需要很多模块。这会导致在我编写的每个模块开始时出现大量的require语句,这在我看来非常难看。我知道所需的模块被缓存,这不是我的问题。我只想摆脱每个模块中巨大的需求块。 –

+0

@JohnJackson - 那么,你已经模块化了很多,你现在想要用一堆全局变得模块化?你能看到这里的讽刺吗?如果你愿意,你肯定可以自由使用全局变量,并以某种方式仔细控制加载顺序 - 我只是不知道任何人认为这是一个好的设计模式。而且,它首先打破了模块化的许多优点,因为使用全局变量的模块将不再是自包含的并且可以独立使用(没有某个主机首先创建适当的全局变量)。 – jfriend00

+0

@JohnJackson - FYI具有易于维护,可重复使用和模块化的设计,但它有一定的成本。在这种情况下,听起来你已经将事物设计成小块模块。剩下的实际使用它的方法是在每个模块中插入必要的'require()'语句。如果你真的不喜欢那样,那么你只是抛弃了模块化设计的大部分优点(除了有很多小文件外)。模块化的最大优点是易于重用,如果你依赖一群全局变量,你就不会有这种情况。 – jfriend00