Node.js module.exports的用途是什么?你如何使用它?
Node.js module.exports的用途是什么?你如何使用它?
我似乎无法找到关于此的任何信息,但它似乎是Node.js的一个相当重要的部分,因为我经常在源代码中看到它。
根据Node.js文档:
模
对当前module
引用。 特别是module.exports
与exports对象相同。 有关更多信息,请参阅src/node.js
但这并没有真正的帮助。
module.exports
做了什么,一个简单的例子是什么?
module.exports
是作为require
调用的结果实际返回的对象。
exports
变量最初设置为同一个对象(即它是一个简写“别名”),所以在模块代码中,您通常会这样写:
var myFunc1 = function() { ... };
var myFunc2 = function() { ... };
exports.myFunc1 = myFunc1;
exports.myFunc2 = myFunc2;
导出(或“公开”)内部范围函数myFunc1
和myFunc2
。
在调用代码中,您可以使用:
var m = require('mymodule');
m.myFunc1();
最后一行显示require
的结果如何(通常)只是一个普通对象,其属性可以被访问。
注意:如果你覆盖exports
那么它将不再引用module.exports
。 所以如果你想分配一个新的对象(或一个函数引用)到exports
那么你也应该把这个新对象分配给module.exports
值得注意的是,添加到exports
对象的名称不必与您添加的值的模块内部作用域名称相同,因此您可以:
var myVeryLongInternalName = function() { ... };
exports.shortName = myVeryLongInternalName;
// add other objects, functions, as required
其次是:
var m = require('mymodule');
m.shortName(); // invokes module.myVeryLongInternalName
这已经得到解答,但我想补充一些说明......
您可以使用exports
和module.exports
将代码导入到您的应用程序中,如下所示:
var mycode = require('./path/to/mycode');
您将看到的基本用例(例如,在ExpressJS示例代码中)是,您可以使用require()
导入.js文件中的exports
对象的属性。
所以在一个简单的计数例子中,你可以有:
(counter.js):
var count = 1;
exports.increment = function() {
count++;
};
exports.getCount = function() {
return count;
};
...然后在您的应用程序(web.js或其他任何.js文件)中:
var counting = require('./counter.js');
console.log(counting.getCount()); // 1
counting.increment();
console.log(counting.getCount()); // 2
简而言之,您可以将所需的文件视为返回单个对象的函数,并且可以将属性(字符串,数字,数组,函数,任何内容)添加到通过设置exports
返回的对象中。
有时您会希望从require()
调用返回的对象成为您可以调用的函数,而不仅仅是具有属性的对象。 在这种情况下,您还需要设置module.exports
,如下所示:
(sayhello.js):
module.exports = exports = function() {
console.log("Hello World!");
};
(app.js):
var sayHello = require('./sayhello.js');
sayHello(); // "Hello World!"
出口和module.exports之间的区别在这里的答案更好解释。
请注意,NodeJS模块机制基于CommonJS模块,在RequireJS等许多其他实现中支持CommonJS模块,而SproutCore , CouchDB , Wakanda , OrientDB , ArangoDB , RingoJS , TeaJS , SilkJS , curl.js甚至Adobe Photoshop (通过PSLib )。 你可以在这里找到已知实现的完整列表。
除非你的模块使用节点特定功能或模块,我强烈建议您使用再exports
,而不是module.exports
这不是CommonJS的标准的一部分 ,然后大多没有其他实现的支持。
另一个NodeJS特有的功能是当你将一个引用分配给一个新的对象来exports
而不是像在Jed Watson在这个线程中提供的最后一个例子那样添加属性和方法。 我个人不鼓励这种做法,因为这打破了CommonJS模块机制的循环引用支持 。 然后,所有实现都不支持Jed示例,然后使用这种方式(或类似示例)编写Jed示例以提供更通用的模块:
(sayhello.js):
exports.run = function() {
console.log("Hello World!");
}
(app.js):
var sayHello = require('./sayhello');
sayHello.run(); // "Hello World!"
或者使用ES6功能
(sayhello.js):
Object.assign(exports, {
// Put all your public API here
sayhello() {
console.log("Hello World!");
}
});
(app.js):
const { sayHello } = require('./sayhello');
sayHello(); // "Hello World!"
PS:看起来Appcelerator还实现了CommonJS模块,但没有循环引用支持(请参阅:Appcelerator和CommonJS模块(缓存和循环引用))
链接地址: http://www.djcxy.com/p/2859.html上一篇: What is the purpose of Node.js module.exports and how do you use it?
下一篇: What is the equivalent of the C# 'var' keyword in Java?