浅析Node模块中module.exports与exports的关系

Node.js遵循CommonJS规范的模块机制,一个JS文件即被视为一个独立的模块。在模块内部能够经过2种方式导出模块:javascript

  1. module.exports
  2. exports

module.exports是一个对象引用,这个对象具备如下特征:java

  1. 默认值:{}
  2. 模块始终导出该对象

exports也是一个对象引用,它与module.exports默认指向同一个对象bash

console.log(module.exports === exports);	// true
复制代码

因此若是咱们只是向module.exports(或exports)追加须要导出的内容时,采用哪一种方式均可以,由于二者始终指向同一个对象ui

module.exports.a = 1;

console.log(module.exports);	// { a: 1 }
console.log(exports);			// { a: 1 }

exports.b = 2;
console.log(module.exports);	// { a: 1, b: 2 }
console.log(exports);			// { a: 1, b: 2 }
复制代码

但若是给module.exports(或exports)从新赋值,那么就会出现一些意想不到的效果。假设咱们使用以下的方式导出模块spa

// foo.js
module.exports = {
	a: 1
}
exports.b = 2;
复制代码
// main.js
var foo = require('./foo');

console.log(foo);	// { a: 1 },导出的对象并不包含b
复制代码

出现上面结果的缘由是:module.exports在被’=’赋值时,其实是新生成了一个{a: 1}对象,而且断开module.exports与默认对象{}的引用,从而指向{a: 1}这个新生成的对象;然而exports此时仍是指向默认对象{}exports.b = 2;其实是向这个默认对象添加了b,而不是module.exports所指的那个对象;而且Node模块最终只会导出module.exports所指向的那个对象(或值),因此就出现了上面的结果。code

归纳一句话就是:给模块对象的从新复制致使module.exports与exports分别指向了不一样的对象对象

‘最好的证实就是用代码演示’,因此咱们代码证实一下上面的分析ip

// foo.js
module.exports = {
  a: 1
}
exports.b = 2;

console.log(module.exports === exports);	// false
console.log(module.exports);				// { a: 1 }
console.log(exports);						// { b: 2 }
复制代码
// main.js
var foo = require('./foo');

console.log(foo);	// { a: 1 }
复制代码

那么是否有办法修补上面的问题呢?答案是:有的,问题的关键是:module.exports与exports指向了不一样的对象,那么咱们就将它们指回同一个对象get

// foo.js
module.exports = {
  a: 1
}

console.log(module.exports === exports);	// false

exports = module.exports;
exports.b = 2;

console.log(module.exports === exports);	// true
console.log(module.exports);				// { a: 1, b: 2 }
console.log(exports);						// { a: 1, b: 2 }
复制代码

因此,导出模块时咱们最好采用以下形式:string

exports = module.exports = {
	a: 1
}

console.log(module.exports === exports);	// true
console.log(module.exports);				// { a: 1 }
console.log(exports);						// { a: 1 }
复制代码

以上就是对module.exports与exports二者关系的浅显分析,但愿对你们有所帮助,若有错误,欢迎指正~

原文地址:www.guoyunfeng.com/2018/06/06/…

相关文章
相关标签/搜索