Webpack 打包commonjs 和esmodule 模块的产物对比

本文探讨Webpack打包CommonJS和ESModule模块的差异。通过实例分析,展示了CommonJS打包后的模块以键值对形式存在,值是封装的函数,而ESModule则通过方法动态挂载属性,值可变。还提到了ESModule代码执行顺序的特性以及两者在值动态变化和属性修改上的不同。
摘要由CSDN通过智能技术生成

这篇文章不涉及 Webpack 的原理,只是观察下 Webpackcommonjsesmodule 模块打包后的产物,读完后会对模块系统有个更深的了解。

环境配置

Webpack 只配置入口和出口,并且将 devtool 设置为 false,把 sourcemap 关掉。

// webpack.config.js
const path = require("path");

module.exports = {
    entry: "./src/commonjs/index.js",
    output: {
        path: path.resolve(__dirname, "./dist"),
        filename: "main.js",
    },
    devServer: {
        static: path.resolve(__dirname, "./dist"),
    },
    devtool: false,
}; 

npm 安装三个 node 包。

npm i -D webpack webpack-cli webpack-dev-server 

更详细的过程可以参考 2021年从零开发前端项目指南

小试牛刀

先简单写行代码测试一下:

// src/commonjs/index.js
document.write("hello, liang"); 

打包产物:

(() => {
    var __webpack_exports__ = {};
    document.write("hello, liang");
})(); 

只是简单的包了层 IIFE

commonjs 模块

写一个 add 模块函数

// src/commonjs/add.js
console.log("add开始引入");
module.exports.add = (a, b) => {
    return a + b;
};
exports.PI = 3.14; 

然后 index.js 进行调用。

// src/commonjs/index.js
console.log("commonjs开始执行");
const { add } = require("./add");
document.write("1+1=", add(1, 1)); 

image-20220503162217512

分析一下打包产物。

变成了 key、value 的键值对,key 是文件名,value 是封装为一个函数的模块,提供 moduleexports 参数。

这里我们只有一个模块,所以只有一个 key

var __webpack_modules__ = {
  "./src/commonjs/add.js": (module, exports) => {
    console.log("add开始引入");
    module.exports.add = (a, b) => {
      return a + b;
    };
    exports.PI = 3.14;
  },
}; 

提供一个 __webpack_require__ 方法用来导入上边 __webpack_modules__ 中的模块。

function __webpack_require__(moduleId) {
  var module  = {
    exports: {},
  });

  __webpack_modules__[moduleId](
    module,
    module.exports,
    __webpack_require__
  );

  return module.exports;
} 

因为 moduleexports 都是对象,所以在 __webpack_modules__ 中给 exports 添加值就是改变这里外边的值。

最后把 module.exports 返回即可。

此外,我们可以添加一个 __webpack_module_cache__ 变量来保存已经导出过的对象。

var __webpack_module_cache__ = {};

function __webpack_require__(moduleId) {
  // 如果已经被导出过,直接返回缓存
  var cachedModule = __webpack_module_cache__[moduleId];
 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值