webpack
webpack 是静态资源打包工具。随着现代前端项目变大, webpack 已成为前端工程化的模块管理工具,提升开发效率的利器。
1|0相关概念
模块概念 | 含义 |
---|---|
module | 模块,在 webpack 中所有资源都是模块 |
chunk | 多个模块的集合组成的代码块 |
bundle | 打包输出后的文件,是 chunk 最终输出的结果 |
配置概念 | 含义 |
---|---|
entry | 模块入口 |
output | 文件打包后的输出地址 |
loader | 模块加载器 |
plugin | 扩展插件 |
文件缓存 | 含义 |
---|---|
hash | 哈希值是一套带上 MD5 的算法,此处指与整个 webpack 构建相关,所有文件同有一个 hash 值,所以不能实现缓存功能 |
chunkhash | 与 chunk 对应的哈希值,当分入口或抽取公用代码时,可保证 chunk 的内容不变则不更改 chunkhash |
contenthash | 文件内容所对应的哈希值,当一个模块引入 css 时,通常 css 会使用插件单独分离,如果是同一模块,修改一处都会改变 chunkhash 的值,所以缓存的效果也不如 contenthash |
2|0基本配置
-
entry 入口配置
与 context 配置一起共同组成模块入口。(context 的作用即确定根路径,使得 entry 的写法更简便,在多入口配置情况下比较明显)
entry 主要接收三种类型数据, string 类型与 array 类型的相对路径 和 object 类型。- 为 string 类型, 只生成一个 chunk, chunk 的名称为 main。
- 为 array 类型的时候, 也只生成一个 chunk, 搭配 output.library 配置使用时,只有数组最后一个模块将被导出。
- entry 为 object 类型则生成多个 chunk,每个 chunk 的名称对应 object 的 name,object 的 value 可以是 string 和 array。
- entry 支持函数,甚至支持异步操作(大部分配置也支持), 函数执行的结果为 entry 函数的返回值。
-
output
输出相关的配置- filename:打包输出的文件名,string 类型,单入口可以直接写文件名,多入口则必须借助 chunk 的变量。
变量名 含义 id 标识符,从 0 开始递增 name chunk 名称 hash webpack 打包 的 hash 值 chunkhash chunk 内容的 hash 值 hash 与 chunkhash 可以指定长度: [chunkhash:5]
- path: string 类型,文件输出的路径与目录。
- publicPath: string 类型, 静态类型的请求位置。
- 相对路径:相对于访问的
html
- 绝对路径: 基于 host。
- CDN 地址:
- 相对路径:相对于访问的
-
mode 工作模式
webpack 4 对各种配置增加了默认值,mode 定义了 development 与 production 两种常用的场景配置,各模式下相应的启动不同的插件或插件的配置。
3|0webpack 输出结果分析
先以开发模式为例
最外层结构是一个立即执行 的匿名函数 称之为 webpack 的 启动函数
,而打包后的代码则作为参数执行。
webpackBootstrap 内部函数分析
其余 __webpack_require__
上的标识:
现假设打包前代码为:
将打包结果的格式化可得:
执行分析:
-
执行 bootstrap 中的
__webpack_require__(__webpack_require__.s = "./src/index.js")
; -
__webpack_require__
内部查询不到缓存,新建一个module
,此时: -
执行
index.js
中的__webpack_require__("./src/sync.js")
,依旧没有在缓存中查找到结果,创建新module
。 -
在
sync.js
中的module.exports
增加add
属性,取值为function() { return add; }
。 -
sync.js
的module.l
标记为true
,以便下次直接调取, 返回其执行结果module.exports
。 -
index.js
中的_sync_js__WEBPACK_IMPORTED_MODULE_0__
接收sync.js
中的module.exports
,即依赖模块所封装的对象。 -
继续执行
index.js
脚本后,标记module.l
并导出结果, 完成启动函数。
生产模式:
生产模式下做了更多的优化,比如代码压缩、函数变量转移、使用 treesharking 将多余代码删除。
如上,启动函数的原理并没有变化,只是作为参数的模块变为了数组形式,且经过分析 index.js
没有导出结果也没有任何视图相关变化,打包后经过优化直接删除模块内部函数与其先关依赖。
动态导入的处理:
启动函数增加内容:
动态导入的文件结构
动态加载模块的文件将单独打包成 bundle,分析动态加载过程:
main.js
的入口函数执行过程中执行了__webpack_require__.e(0)
。__webpack_require__.e
开始导入异步资源,window['webpackJsonp']
作为缓存,对加载过的模块标记为 0(打包时已做判断)。- 首次加载异步模块,创建 chunk 队列,创建 script 标签,异常处理等。
- 文档中插入 script 标签,加载 0.js 内容并执行。
- 此时的
window['webpackJsonp'].push
已经改为了webpackJsonpCallback
。(webpackJsonp 存在变量名冲突的全局环境污染的风险) webpackJsonpCallback
函数内部也有一套installedChunks
缓存机制, 并把异步模块添加到modules
中。parentJsonpFunction(data)
是执行启动函数中所替换了的jsonpArray.push.bind(jsonpArray)
的push
,等于是添加到window['webpackJsonp']
中。resolves
队列中执行webpackJsonpCallback
中的promise
至结束。
__EOF__

本文链接:https://www.cnblogs.com/qingzhao/p/16501136.html
关于博主:I am a good person
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具