Webpack KING!! (一)
source map
webpack 中的几种不同的模式
devtool | performance | production | quality | comment |
---|---|---|---|---|
(none) | build: fastest rebuild: fastest | yes | bundle | Recommended choice for production builds with maximum performance. |
eval |
build: fast rebuild: fastest | no | generated | Recommended choice for development builds with maximum performance. |
eval-source-map |
build: slowest rebuild: ok | no | original | Recommended choice for development builds with high quality SourceMaps. |
cheap-source-map |
build: ok rebuild: slow | no | transformed | |
cheap-module-source-map |
build: slow rebuild: slow | no | original lines | |
source-map |
build: slowest rebuild: slowest | yes | original | Recommended choice for production builds with high quality SourceMaps. |
resolve
1 | resolve: { |
优化点
module.noParse
1 | RegExp` `[RegExp]` `function(resource)` `string` `[string] |
防止 webpack 解析那些任何与给定正则表达式相匹配的文件。忽略的文件中 不应该含有 import
, require
, define
的调用,或任何其他导入机制。忽略大型的 library 可以提高构建性能。
include/exclude
引入符合以下任何条件的模块。如果你提供了 Rule.include
选项,就不能再提供 Rule.resource
。
排除所有符合条件的模块。如果你提供了 Rule.exclude
选项,就不能再提供 Rule.resource
webpack.IgnorePlugin()
resourceRegExp
: A RegExp to test the resource against.contextRegExp
: (optional) A RegExp to test the context (directory) against.
1 | new webpack.IgnorePlugin({ resourceRegExp, contextRegExp }); |
DLLPlugin
1 |
|
happyPack
多线程打包
1 | use: 'Happypack/loader?id=optmize' |
tree shaking
require模块会讲export的内容放在Module.default上,故不支持tree shaking。
scope hosting
自动简化代码
Optimization
optimization.minimize
1 | boolean = true |
告知 webpack 使用 TerserPlugin 或其它在 optimization.minimizer
定义的插件压缩 bundle。
optimization.removeEmptyChunks
1 | boolean = true |
如果 chunk 为空,告知 webpack 检测或移除这些 chunk。将 optimization.removeEmptyChunks
设置为 false
以禁用这项优化。
optimization.mergeDuplicateChunks
1 | boolean = true |
告知 webpack 合并含有相同模块的 chunk。将 optimization.mergeDuplicateChunks
设置为 false
以禁用这项优化。
optimization.providedExports
1 | boolean |
告知 webpack 去确定那些由模块提供的导出内容,为 export * from ...
生成更多高效的代码。默认 optimization.providedExports
会被启用。
1 | const TerserPlugin = require('terser-webpack-plugin'); |
懒加载
Babel-sytax-dynamic-import
dynamic import 原理
基于JSONP实现
把获得promise push实例并挂在installedChunks 的List。
document.creatementElement(’script’); script.src = publicpath + func(chunckID)
scriptComplete
重写push执行webpackJsonpCallback
将模块标记为已加载
将模块代码挂载到modules exports上用promise包裹的。
通过thenable获取到code
热更新原理
通过websocket建立建立双向通信,监听文件变化(时间变化而非hash变化),将文件内容放入内存(memory-fs),发送实时通知。
当监听文件变化,就会调用_sendStats
方法通过websocket
给浏览器发送文件变动数据,以让浏览器拿到最新的hash。
热更新过程
- 通过 hotUpdate 查找旧模块
- 将新的 加入 hotUpdate
- 然后webpack——require执行
完整流程
- 启动项目时会启动一个websocket连接
- 启动编译
- 调用setupHooks监听编译状态
- 编译完成调用_sendStats发送事件
- 客户端监听两个事件(ha sh/ok)
- 触发 OK 事件调用reloadApp()
- reloadApp 发送webpackHotUpdate事件和当前hash给wbpack
- 通过module.hot.check方法检查更新
- 调用
hotDownloadUpdateChunk
发送xxx/hash.hot-update.js
请求。 - 在webpackHotUpdate调用
- 通过 hotUpdate 查找旧模块并将新的 加入 hotUpdate
- 通过webpack_require加载执行