Skip to content

webpack 中的 hash 优化

配置文件

配置文件如下:

js
// nodejs 内置模块
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
// 为了更好的体现 chunkhash 与 contenthash,所以使用到了 css
const MiniCssExtractPlugin  =  require("mini-css-extract-plugin")
const webpack = require('webpack')

const moduleConfig = {
  rules: [
    {
      test: /\.css$/,
      use: [
        MiniCssExtractPlugin.loader,
        "css-loader",
      ]
    },
  ]
}

function f2() {
  return webpack([
    // fullhash
    // 所有构建产物均使用相同的 hash。这意味着修改任何一个文件,所有文件的 hash 值都将会被改变
    {
      entry: './src/main.js',
      mode: 'none',
      module: moduleConfig,
      output: {
        filename: '[name].[fullhash].js',
        path: path.resolve(__dirname, 'dist/fullhash'),
        clean: true
      },
      plugins: [
        new MiniCssExtractPlugin({
            // css 单独输出成文件
            filename: '[name].[fullhash].css'
        })
      ]
    },
    // chunkhash
    // 同一 chunk 下的文件使用相同的 hash。修改在同一个 chunk 中的文件,同属该 chunk 的所有文件 hash 值都会改变
    {
      entry: './src/main.js',
      mode: 'none',
      module: moduleConfig,
      output: {
        filename: '[name].[chunkhash].js',
        path: path.resolve(__dirname, 'dist/chunkhash'),
        clean: true
      },
      plugins: [
        new MiniCssExtractPlugin({
            // css 单独输出成文件
            filename: '[name].[chunkhash].css'
        })
      ]
    },
    // contenthash
    // 不同的文件使用不同的 hash。每个文件都会根据自己的文件内容生成 hash 值,互不干扰。
    {
      entry: './src/main.js',
      mode: 'none',
      module: moduleConfig,
      output: {
        filename: '[name].[contenthash].js',
        // chunkFilename: '[name].[contenthash].chunk.js',
        path: path.resolve(__dirname, 'dist/contenthash'),
        clean: true
      },
      plugins: [
        new MiniCssExtractPlugin({
            // css 单独输出成文件
            filename: '[name].[contenthash].css'
        })
      ],
      optimization: {
        runtimeChunk: true
      }
    },
  ])
}


f2().run(() => {
  console.log('✅')
})

配置缓存后,后面用户再次访问该网站,如果命中缓存,将大幅度提高加载速度。

在 webpack 中有三种 hash 生成方式分别是:fullhash、chunkhash、contenthash。

  • fullhash:所有构建产物均使用相同的 hash。这意味着修改任何一个文件,所有文件的 hash 值都将会被改变
  • chunkhash:同一 chunk 下的文件使用相同的 hash。修改在同一个 chunk 中的文件,同属该 chunk 的所有文件 hash 值都会改变
  • contenthash:不同的文件使用不同的 hash。每个文件都会根据自己的文件内容生成 hash 值,互不干扰

moduleId/chunkId 的变化导致 hash 变化

moduleId/chunkId 的变化也会导致 hash 变化。比如一个模块引入了另一个模块,这两个模块的 id 可能就会变化,继而引发后面模块的 id 发生变化。

runtimeChunk

进行如下配置,将 webpack 运行代码分割到外部去,这样每个模块改变,也不会影响其它的模块 id。

js
optimization: {
  runtimeChunk: true
}

Released under the MIT License.