以这种方式创建它没有问题。模块定义了它们在 module.exports 对象中返回的内容。顺便说一句,您实际上并不需要自执行函数 (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
或者,正如许多模块所做的那样,如果您想导出一些实用功能(并使其他功能保持“私有”),您可以这样做:
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 关键字。因此,他们正在创建一个全局变量。
这就是为什么他们可以在require 定义全局变量的模块后访问它。
顺便说一句,exports 参数在他们的情况下是无用的。这甚至会产生误导,因为它实际上是 global 对象(相当于浏览器中的 window),而不是 module.exports 对象(函数中的 this 是全局对象,如果是严格模式,它将是 undefined已启用)。
结论
不要像他们那样做,这是个坏主意。全局变量是个坏主意,最好使用 node 的理念,并将所需的模块存储在一个变量中,以便重复使用。
如果你想拥有一个可以在客户端使用并在 node.js 中测试的对象,这里有一个方法:
你的Module.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 ) );
为了避免创建global 变量,您可以将其缩短为:
( 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 :-)
仅供参考,.. 表示“父目录”。这是获取模块的相对路径。如果文件在同一目录中,您将使用.。