在webpack 配置中缓存分为两种, 一种是 babel 缓存, 一种是文件资源缓存

babel 缓存

直接在 babel-loader 中加上 cacheDirectory: true

  1. {
  2. test: /\.js$/,
  3. exclude: /node_modules/,
  4. loader: 'babel-loader',
  5. cacheDirectory: true,
  6. options: {
  7. presets: ['@babel/preset-env']
  8. }
  9. }

作用 : 让第二次打包构建速度更快

文件资源缓存 (重要)

文件资源缓存是,用户请求服务器数据,返回资源的文件过程中,服务器端可以设置用户访问缓存(通过时间)。用户获取到的资源文件如果和初次获取到的资源文件一样,则不会向服务器发起获取新的文件资源请求,而是直接读取缓存的资源文件。 一旦服务端文件与缓存的不一样,则客户端重新发起请求获取新的资源文件。

作用: 让代码上线运行缓存更好使用

文件资源缓存一般都是通过 hash 值进行维护。 在webpack中 打包后文件通常设置 hash值进行文件命名 。
webpack 的hash 值影响着 文件资源缓存

hash


hash 每次webpack 构建时都会生成一个唯一的 hash 值
问题: 因为 js 和 css 同时使用一个 hash 值。 如果重新打包,会导致所有的缓存失效。 (可能我只修改了一个文件)

chunkhash


chunkhash 是根据 chunk 生成的 hash 值。 如果打包来源于同一个chunk (打包来源于同一个文件), 那么hash 值就一样,

问题: 在 js 文件中引入的 css 文件的 hash 值一样。 因为 css 是在 js 中被引入的, 所以属于一个 chunk

contenthash


contenthash 是根据文件的内容生成 hash 值。 不同文件的 hash 值 一定不一样。

面试常问 webpack 生成文件的 hash值的不同

image.png