Node.js module.exports的用途是什么?您如何使用它?
我似乎找不到关于这个的任何信息,但它似乎是Node.js的一个相当重要的部分,因为我经常在源代码中看到它。
根据Node.js文档:
单元参考电流单元特别是module.exports与导出对象相同。看见src/node.js获取更多信息。
但这并没有真正的帮助。
module.exports到底做什么?一个简单的例子是什么?
Node.js module.exports的用途是什么?您如何使用它?
我似乎找不到关于这个的任何信息,但它似乎是Node.js的一个相当重要的部分,因为我经常在源代码中看到它。
根据Node.js文档:
单元参考电流单元特别是module.exports与导出对象相同。看见src/node.js获取更多信息。
但这并没有真正的帮助。
module.exports到底做什么?一个简单的例子是什么?
当前回答
将程序代码划分为多个文件时,module.exports用于向模块的使用者发布变量和函数。源文件中的require()调用将替换为从模块加载的相应module.exports。
编写模块时记住
模块加载被缓存,只有初始调用评估JavaScript。可以在模块中使用局部变量和函数,而不需要导出所有内容。module.exports对象也可用作导出速记。但当返回一个单独的函数时,请始终使用module.exports。
根据:“模块第2部分-编写模块”。
其他回答
这已经得到了回答,但我想补充一些澄清。。。
您可以使用exports和module.exports将代码导入应用程序,如下所示:
var mycode=require('./path/to/mycode');
您将看到的基本用例(例如在ExpressJS示例代码中)是在.js文件中的exports对象上设置财产,然后使用require()导入该文件
因此,在一个简单的计数示例中,您可以:
(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
简单地说,您可以将所需文件视为返回单个对象的函数,并且可以通过在导出时设置它们,将财产(字符串、数字、数组、函数等)添加到返回的对象中。
有时您会希望require()调用返回的对象是可以调用的函数,而不仅仅是具有财产的对象。在这种情况下,还需要设置module.exports,如下所示:
(sayhello.js):
module.exports = exports = function() {
console.log("Hello World!");
};
(app.js):
var sayHello = require('./sayhello.js');
sayHello(); // "Hello World!"
这里的答案更好地解释了exports和module.exports之间的区别。
如果将对新对象的引用分配给exports和/或modules.exports,则必须注意以下几点:
1.以前附加到原始导出或模块的所有财产/方法都会丢失。导出当然会丢失,因为导出的对象现在将引用另一个新的对象
这一点很明显,但如果在现有模块的开头添加导出方法,请确保本机导出对象在末尾没有引用另一个对象
exports.method1 = function () {}; // exposed to the original exported object
exports.method2 = function () {}; // exposed to the original exported object
module.exports.method3 = function () {}; // exposed with method1 & method2
var otherAPI = {
// some properties and/or methods
}
exports = otherAPI; // replace the original API (works also with module.exports)
2.如果exports或module.exports中的一个引用新值,则它们不再引用同一对象
exports = function AConstructor() {}; // override the original exported object
exports.method2 = function () {}; // exposed to the new exported object
// method added to the original exports object which not exposed any more
module.exports.method3 = function () {};
3.狡猾的后果。如果同时更改了对exports和module.exports的引用,很难说哪个API是公开的(看起来module.export获胜)
// override the original exported object
module.exports = function AConstructor() {};
// try to override the original exported object
// but module.exports will be exposed instead
exports = function AnotherConstructor() {};
参考链接如下:
exports = module.exports = function(){
//....
}
导出或模块的财产。导出,例如函数或变量,将在外部公开
有一点你必须更加注意:不要覆盖导出。
为什么?
因为导出只是module.exports的引用,所以可以将财产添加到导出中,但如果覆盖导出,引用链接将断开。
很好的例子:
exports.name = 'william';
exports.getName = function(){
console.log(this.name);
}
坏例子:
exports = 'william';
exports = function(){
//...
}
如果您只想公开一个函数或变量,如下所示:
// test.js
var name = 'william';
module.exports = function(){
console.log(name);
}
// index.js
var test = require('./test');
test();
这个模块只公开了一个函数,name的属性对外是私有的。
将程序代码划分为多个文件时,module.exports用于向模块的使用者发布变量和函数。源文件中的require()调用将替换为从模块加载的相应module.exports。
编写模块时记住
模块加载被缓存,只有初始调用评估JavaScript。可以在模块中使用局部变量和函数,而不需要导出所有内容。module.exports对象也可用作导出速记。但当返回一个单独的函数时,请始终使用module.exports。
根据:“模块第2部分-编写模块”。
模块将相关代码封装为单个代码单元。创建模块时,这可以解释为将所有相关函数移动到文件中。
假设有一个文件Hello.js,其中包含两个函数
sayHelloInEnglish = function() {
return "Hello";
};
sayHelloInSpanish = function() {
return "Hola";
};
只有当代码的实用程序不止一次调用时,我们才编写函数。
假设我们想将函数的实用性增加到另一个文件,比如World.js,在这种情况下,导出一个文件会变成图片,可以通过module.exports获得。
您可以通过下面给出的代码同时导出这两个函数
var anyVariable={
sayHelloInEnglish = function() {
return "Hello";
};
sayHelloInSpanish = function() {
return "Hola";
};
}
module.export=anyVariable;
现在您只需要将文件名输入World.js即可使用这些函数
var world= require("./hello.js");