javascript - Node.js的 module.exports目的是什么,怎么使用?

  显示原文与译文双语对照的内容

Node.js的 module.exports目的是什么,怎么使用?

我似乎找不到任何关于这个的信息,但它似乎是 node.js 中相当重要的一部分,我在源代码中经常看到它。

根据 Node.js 文档列表:

磅模块

对当前 module的引用。 特别是 module.exports 与导出对象相同。 有关更多信息,请参见 src/node.js

但这并不是真正的帮助。

module.exports 到底做了什么,一个简单的例子是什么?

时间:

module.exports 是实际作为 require 调用结果返回的对象。

exports 变量最初设置为同一个对象( 例如 。 它是一个 shorthand"别名",所以在模块代码中,你通常会编写如下内容:


var myFunc1 = function() {.. . };
var myFunc2 = function() {.. . };
exports.myFunc1 = myFunc1;
exports.myFunc2 = myFunc2;

导出( 或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或或者或"公开")的内部作用域函数 myFunc1myFunc2

在调用代码中,你将使用:


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 和/or modules.exports 分配一个新对象引用,你必须注意以下几点:

1.以前附加到原始 exports 或者 module.exports的所有属性/方法当然都是丢失的,因为导出的对象现在将引用另一个新

这一个是不大,但如果将导出的方法的开头添加现有模块,请确保本机导出的对象不是引用另一个对象在最后


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 。棘手的结果。如果你将引用更改为 exportsmodule.exports,很难说哪个API是公开的( 看起来像 module.exports wins )


//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() {}; 

module.exports 属性或者导出对象允许模块选择应该与应用程序共享的内容

enter image description here

module_export上的一个不错的视频可以在下面的中找到

引用链接如下所示:


exports = module.exports = function(){
//....
}

exports 或者 module.exports的属性,如函数或者变量,将在外部公开

你必须多加注意: 不导出 override

为什么?

因为只导出 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();

这里模块只公开了一个函数,而名称的属性对于外部是私有的。

...