ES6模块与CommonJS模块的差异

  1. CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。(这里指的是基础数据类型,如果是引用类型还是引用)
  2. 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
   }
}

你可能感兴趣的:(ES6模块与CommonJS模块的差异)