背景
最近在用typescript写工具库的时候,无意中在 webpack中看到了两个关键字,commonjs 和 commonjs2. 瞬间产生了好奇。后面看了issues才得知它们与模块化 导出有着密切关系。
CommonJs spec defines only exports. But module.exports is used by node.js and many other CommonJs implementations.
commonjs mean pure CommonJs
commonjs2 also includes the module.exports stuff.
大致意思是:
CommonJs规范仅定义出口。但是模块。使用出口节点。js和许多其他CommonJs的实现。
commonjs的意思是纯commonjs
commonjs2还包括模块。出口的东西。
这里引用了 https://github.com/webpack/webpack/issues/1114 的回答,commonjs vs commonjs2 这两个概念问题迎刃而解。大家可自行阅览
那到底module.exports vs exports 区别是什么呢?
自己查阅了很多文章,仍然很懵,但觉得这篇文章https://www.sitepoint.com/understanding-module-exports-exports-node-js/ 解释得比较到位。
我所理解的关键点:
1.require的大致实现:
var require = function(path) {
// ...
return module.exports;
};
2.module.exports => {} <= exports 指向同一个对象。 两者最好不要同时使用。
// exports 仅适用于:
exports.a = 'xxx';
// module.exports 适用于
module.exports = 'xxx';
module.exports.a = 'xxx';
那么问题来了好像export能做的,module.export都能满足。所以产生疑问,知识才有了拓展的可能。
3.其实2中的疑问一点也没错,nodejs 官方文档中提及https://nodejs.org/docs/latest/api/modules.html#modules_exports_alias exports
只是module.exports的一个别名 还提示当你搞不清楚的时候,就用module.exports。
总结
1.commonjs 规范只定义了exports,而 module.exports是nodejs对commonjs的实现,实现往往会在满足规范前提下作些扩展,我们这里把这种实现称为了commonjs2
2.module.exports 是nodejs对commonjs的具体实现。exports 只是它的一个别名。搞不清楚关系的时候可以不用这个别名。
戏言: 不知不觉头发丝儿又少了几根,“呜呜呜呜,码仔痛哭“