从Webpack打包后的文件分析导入的原理

主流框架中,不论是 React 还是 Vue,都是使用 Webpack 进行资源的打包,这篇文章我们试着分析打包后的 bundle 文件来了解下其是如何进行静态和动态导入的。

文章目录结构如下:

  • bundle 文件分析

  • 静态导入文件

  • 动态导入文件

bundle 文件分析

下面是代码整体的目录结构:

markdown

入口文件 main.js

import a from './a'
import b from './b'

a.js

const asyncText = 'async'
export default asyncText

b.js

import c from './c'
const b = 'b'
export default b

c.js

export const c = 1

打包后的 bundle 文件过于冗长,删繁就简之后让我们看看他的主体部分:

我们看到整个文件就是一个自执行函数,所传入的参数是经过分析过后的文件路径,我们先来认识两个参数和一个函数:

  • modules:缓存 module 代码块,每个 module 有一个 id,开发环境默认以 module 所在文件的文件名标识,生产环境默认以一个数字标识。modules 是一个 object, key 为 module id,value 为对应 module 的源代码块。

  • installedModules:缓存已经加载过的 module,简单理解就是已经运行了源码中 import a from 'xxx' 这样的语句。installedModules 是一个 object, key 为 module id,value 为对应 module 导出的变量。

  • __webpack_require__: 根据传入的 moduleId,判断是否加载过该模块,加载过则直接返回,未加载过则执行该模块代码。

静态导入文件

根据上面的内容分析,整个自执行函数执行的时候,传入的参数是根据我们文件内容生成的路径,参数内容如下。

{
  "./src/a.js":
    function (module, __webpack_exports__, __webpack_require__) {
    "use strict";
    __webpack_require__.r(__webpack_exports__);
    const asyncText = "async";
    __webpack_exports__["default"] = asyncText;
  },
  "./src/b.js":
    function (module, __webpack_exports__, __webpack_require__) {
    "use strict";
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值