这种方式创建没有问题。模块定义了module.exports
对象中的返回内容。顺便说一下,你实际上不需要自执行函数(SEF),它不会像浏览器中那样造成全局泄漏。
示例
module1.js:
module.exports = {
module: { 'version': '0.1.1' }
};
main.js:
var module1 = require( './module1.js' );
一旦你理解了这个过程,如果你想要的话,你可以轻松地立即导出版本号:
module1.js:
module.exports = '0.1.1';
main.js:
var module1 = require( './module1.js' );
console.log( module1 === '0.1.1' );
或者如果你需要一些逻辑处理的话,你可以像这样简单地扩展你的 module1.js
文件:
module.exports = ( function() {
return version;
} () );
或者,就像许多模块一样,如果您想要导出一些实用函数(并保持其他函数“私有”),您可以这样做:
module.exports = {
func1: function() {
return someFunc();
},
func2: function() {},
prop: '1.0.0'
};
function someFunc() {
}
所以,在 main.js 中:
var module1 = require( './module1.js' );
module1.func1();
module1.func2();
module1.prop;
module1.someFunc();
您的特殊情况
关于您的特殊情况,我不建议像他们那样做。
如果您在这里看一下:https://github.com/jasondavies/science.js/blob/master/science.v1.js
您会发现他们没有使用var
关键字。因此,他们创建了一个全局变量。
这就是为什么一旦他们require
定义全局变量的模块后,就可以访问它。
顺便说一句,在他们的情况下,exports
参数是无用的。甚至是误导性的,因为它实际上是global
对象(相当于浏览器中的window
),而不是module.exports
对象(函数中的this
是全局对象,如果启用了严格模式,则为undefined
)。
结论
不要像他们那样做,这是个坏主意。全局变量是个坏主意,最好使用节点的哲学,并将所需模块存储在可重复使用的变量中。
如果您想在客户端使用并在node.js中进行测试的对象,则可以这样做:
yourModule.js:
var global = module ? module.exports : window.yourModule;
( function( exports ) {
var yourModule = {};
exports = yourModule;
} ( global ) );
您可以采用以下方式缩短代码,以避免创建全局变量:
global
。
( function( exports ) {
var yourModule = {};
exports = yourModule;
} ( module ? module.exports : window.yourModule ) );
这样,您就可以在客户端使用它,像这样:
yourModule.someMethod(); // global object, "namespace"
在服务器端:
var yourModule = require( '../yourModule.js' );
yourModule.someMethod(); // local variable :-)
仅供参考,..
表示 "上级目录"。这是获取模块的相对路径。如果文件与当前目录在同一级别,则使用 .
。