带有require的node.js中的命名空间

我正在玩一个个人项目并且学习发誓。 这是一个小型的客户端库,testing在誓言中完成。 因此,我必须build立和testing这样写的文件:

(function(exports) { var module = export.module = { "version":"0.0.1" }; //more stuff })(this); 

在我的testing中(基于science.js ,d3等)需要这样的模块:

 require("../module"); 

当我试图运行testing时,我继续得到一个“模块未定义的错误”,所以我去了一个repl,跑了:

 require("../module") 

并返回:

 { module: { version: "0.0.1" } } 

我意识到我可以做这样的事情:

 var module = require("../module").module; 

但感觉就像我正在用这种方式创build一个问题,特别是因为我基于这个项目的库以我描述的格式进行。

我希望我的项目的行为类似于我以此为基础的项目,其中:

 require("../module"); 

在这个命名空间中创build一个variables:

 module.version; //is valid. 

我已经在各种图书馆看到了这一点,我正在遵循T的格式和思维过程,但相信我可能会错过某些我不知道的需求行为。

这样做没有问题。 模块定义了它们在module.exports对象中返回的module.exports 。 顺便说一句,你并不需要自我执行function(SEF),没有像浏览器一样的全局泄漏:-)

例子

module1.js:

 module.exports = { module: { 'version': '0.1.1' } }; 

main.js:

 var module1 = require( './module1.js' ); // module1 has what is exported in module1.js 

一旦你了解了它的工作原理,你可以马上导出版本号,如果你想:

module1.js:

 module.exports = '0.1.1'; 

main.js:

 var module1 = require( './module1.js' ); console.log( module1 === '0.1.1' ); // true 

或者如果你想要一些逻辑,你可以像这样轻松地扩展你的module1.js文件:

 module.exports = ( function() { // some code return version; } () ); // note the self executing part :-) // since it's self executed, the exported part // is what's returned in the SEF 

或者,正如许多模块所做的那样,如果要导出一些实用程序function(并将其他function保留为“私有”),则可以这样做:

 module.exports = { func1: function() { return someFunc(); }, func2: function() {}, prop: '1.0.0' }; // This function is local to this file, it's not exported function someFunc() { } 

所以,在main.js中:

 var module1 = require( './module1.js' ); module1.func1(); // works module1.func2(); // works module1.prop; // "1.0.0" module1.someFunc(); // Reference error, the function doesn't exist 

你的特殊情况

关于你的特殊情况,我不会推荐像他们这样做。

如果你看这里: https : //github.com/jasondavies/science.js/blob/master/science.v1.js

你看到他们没有使用var关键字。 所以,他们正在创build一个全局variables

这就是为什么一旦他们require定义全局variables的模块,他们就可以访问它。

顺便说一下, exports论点在他们的情况下是无用的。 它甚至是误导,因为它实际上是global对象(相当于浏览器中的window ),而不是module.exports对象(在函数中是全局对象,如果启用了严格模式,它将是undefined )。

结论

不要像他们这样做,这是一个坏主意。 全局variables是一个坏主意,最好使用节点的理念,并将需要的模块存储在一个可重用的variables中。

如果你想有一个可以在客户端使用的对象,并在node.js中进行testing,这里有一个方法:

yourModule.js:

 // Use either node's export or the global object in browsers var global = module ? module.exports : window.yourModule; ( function( exports ) { var yourModule = {}; // do some stuff exports = yourModule; } ( global ) ); 

为了避免创buildglobalvariables,你可以缩短这个:

 ( function( exports ) { var yourModule = {}; // do some stuff exports = yourModule; } ( module ? module.exports : window.yourModule ) ); 

这样,你可以在客户端使用它:

 yourModule.someMethod(); // global object, "namespace" 

而在服务器端:

 var yourModule = require( '../yourModule.js' ); yourModule.someMethod(); // local variable :-) 

只是FYI, ..意思是“父目录”。 这是获取模块的相对path。 如果文件在同一个目录下,你可以使用.