在博客浏览:https://ssshooter.com/2019-03…
这个小漫笔用于疾速明白 nodejs 模块(也就是 CommonJS 范例)。
实质
module.exports
用于暴露一个值,这个值默许是对象,也能够掩盖为原始值。
尝试在一个文件中直接 log 出 module 的值,能够获得:
{
id: '.',
exports: {}, // 默许空对象
parent: null,
filename: '/Users/a10.12/webpack-learning/src/module.js',
loaded: false,
children: [],
paths:
[ '...' ]
}
你须要经由过程修正 module 的 exports 属性来输出你须要输出的东西,而 require
用于导入一个模块,module.exports
的值是什么,require
拿到的就是什么。
运用
比方有 module.js
module.exports = {
s: 2,
}
在 index.js 中引入
let v = require('./module.js')
console.log(v) // 输出为 { s: 2 }
原始值的状况也一样
module.exports = 2
let v = require('./module.js')
console.log(v) // 输出为 2
由于 module.exports 默许是个对象,在输出对象的时刻天然有这么一种写法:
module.exports.s = 2
如许 require 获得的也是{ s: 2 }
。
简写
大概是大佬们以为 module.exports 写起来太长,因而把 exports 援用到了 module.exports,所以搜检这两个东西是不是相称时,返回 true
:
console.log(exports === module.exports) // true
有了这个特征,在导出对象时能很方便地这么写:
exports.s = 2
let v = require('./module.js')
console.log(v) // 输出为 2
然则你却不能这么写:
// 如许
exports = 2
// 或如许
exports = {
s: 2,
}
// 都是不能够的
let v = require('./module.js')
console.log(v) // 输出为 {}
缘由正如上面所说,exports 原本就只是一个对 module.exports 的援用,你能够对这个援用的对象增加属性,然则一旦用上面两种要领掩盖了 exports 对 module.exports 的援用,exports 就即是无效了。
末了提示,假如前面说的看不懂,能够须要加深对 ECMAScript 援用值和原始值的明白…