带有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 ) );
为了避免创buildglobal
variables,你可以缩短这个:
( 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。 如果文件在同一个目录下,你可以使用.
。