- CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。(这里指的是基础数据类型,如果是引用类型还是引用)
- CommonJS 模块是运行时加载,ES6 模块是编译时加载(静态加载)。
两者的区别其实可以看webpack的实现,具体解析写在代码注释里面(这里参考的是webpack5的实现)
function __webpack_require__(moduleId) {
// 缓存模块,确保模块函数只执行一次
if(__webpack_module_cache__[moduleId]) {
return __webpack_module_cache__[moduleId].exports;
}
var module = __webpack_module_cache__[moduleId] = {
exports: {}
};
// Execute the module function
__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
return module.exports;
}
// webpack_require方法一致,主要的区别在于cmd 和 esm模块的写法
let webpack_modules = {
'cmd-mod': (module, _, __webpack_require__) => {
let a = 1
module.exports = a
},
// 这里的__webpack_exports__就是传入的module.exports
'es-mod': (_, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__)
//__ webpack_required__.d 做的事情就是通过defineProperty劫持get,返回第二个参数的内容,因此不管在哪里去引用这个模块,返回的都是这个闭包中a,因此是值的引用
__webpack_require__.d(__webpack_exports__, {
'default': __WEBPACK_DEFAULT_EXPORT__
})
let a = 1
__WEBPACK_DEFAULT_EXPORT__ = a
}
}