Webpack4缓存相关配置 - Manifest
Manifest干嘛用,我摘抄了下官网的一些内容如下,先来了解下
一旦你的应用程序中,如 index.html 文件、一些 bundle 和各种资源加载到浏览器中,会发生什么?你精心安排的 /src 目录的文件结构现在已经不存在,所以 webpack 如何管理所有模块之间的交互呢?这就是 manifest 数据用途的由来……
当编译器(compiler)开始执行、解析和映射应用程序时,它会保留所有模块的详细要点。这个数据集合称为 “Manifest”,当完成打包并发送到浏览器时,会在运行时通过 Manifest 来解析和加载模块。无论你选择哪种模块语法,那些 import 或 require 语句现在都已经转换为 webpack_require 方法,此方法指向模块标识符(module identifier)。通过使用 manifest 中的数据,runtime 将能够查询模块标识符,检索出背后对应的模块。
所以,现在你应该对 webpack 在幕后工作有一点了解。“但是,这对我有什么影响呢?”,你可能会问。答案是大多数情况下没有。runtime 做自己该做的,使用 manifest 来执行其操作,然后,一旦你的应用程序加载到浏览器中,所有内容将展现出魔幻般运行。然而,如果你决定通过使用浏览器缓存来改善项目的性能,理解这一过程将突然变得尤为重要。
通过使用 bundle 计算出内容散列(content hash)作为文件名称,这样在内容或文件修改时,浏览器中将通过新的内容散列指向新的文件,从而使缓存无效。一旦你开始这样做,你会立即注意到一些有趣的行为。即使表面上某些内容没有修改,计算出的哈希还是会改变。这是因为,runtime 和 manifest 的注入在每次构建都会发生变化。
什么是Runtime
runtime,以及伴随的 manifest 数据,主要是指:在浏览器运行时,webpack 用来连接模块化的应用程序的所有代码。runtime 包含:在模块交互时,连接模块所需的加载和解析逻辑。包括浏览器中的已加载模块的连接,以及懒加载模块的执行逻辑。
具体如何提取manifest前面的文章【Webpack4缓存相关配置】已经说过了。
下面我们来配置下
修改webpack.prod.js,另外如果需要webpack.dev.js的话可以另外在处理
安装
1 | npm i inline-manifest-webpack-plugin -D |
分别添加如下
1 | const InlineManifestWebpackPlugin = require('inline-manifest-webpack-plugin'); |
到配置文件中
最终结果如下
1 | const path = require('path'); |
运行
1 | npm run build |
执行后输出大概如下
1 | Hash: b26027576f67c9b4a2ed |
我们看下dist/index.html这个文件
1 |
|
可以看到
1 | /manifest.e6adb1315c7823bc535e.bundle.js |
已经被加入了
这样当模块被打包并运输到浏览器上时,runtime就会根据manifest文件来处理和加载模块。利用manifest就知道从哪里去获取模块代码。
项目地址
1 | https://github.com/durban89/webpack4-react16-reactrouter-demo.git |