本文将介绍使用 webpack 打包的 web 应用如何在更新时只需下载有变动的模块。
webpack 的默认输出
webpack 用于编译 javascript 模块。默认为 entry
配置中指定的每一个入口文件,输出每个入口文件引用的所有模块打包的 js 文件,共同引用的模块将被打包到每个入口的打包文件。
本文的 webpack 特指 webpakc v4。
代码分离
wepack 提供了 SplitChunksPlugin 分离代码,在 webpack 配置中加入 optimization.splitChunks
配置:
1 | module.exports = { |
共用的模块将被抽出单独打包成 js 文件。
如果我们使用 import()
懒加载模块,此模块也将被单独打包 js 文件。
输出 content hash 文件名
为了达到最小更新的的目的,关键就是缓存没有更新的模块。
为了缓存模块,需要让输出文件的文件名在内容不变的情况下不发生改变。在 webpack 的 output 配置中使用 contenthash
占位符指定输出文件名,根据内容计算文件名称:
1 | module.exports = { |
Nginx 缓存配置
以 nginx 为例配置资源缓存。
对 index.html 进行无缓存配置。
1 | location = /index.html { |
其它资源文件设置一个较长时间的缓存
1 | location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ |
最小化前端项目更新的工作完成。
1 | server { |
优缺点
优点
- 发布的时,服务器上有相同的路径和文件名的文件可以不传输,实现增量发布。
- 用户在回访网站的时候,未更新的模块将保持缓存,实现缓存效益最大化,大大增加加载速度。
缺点
- 用户在首次访问加载时会略微增加下载数据量。
contenthash
不能在启用 HMR 时使用。- 一个模块更新时会导致整个引用链的更新,包含这个模块应用链的输出文件都需要更新。