webpack 中 hash,chunkhash,contenthash的区别
本文最后更新于:2022年4月22日 上午
webpack 中 hash,chunkhash,contenthash的区别
hash是项目级别的,当项目中任何一个文件修改后所有文件都会重新生成chunkhash会根据不同的入口文件,进行文件依赖解析再使用散列算法来生成一个 哈希值contenthash的粒度是文件级别的,只有修改的文件才会重新生成 哈希值,有利于缓存
hash
我们先使用 hash 来对我们的项目来进行打包
webpack.config.jsconst { merge } = require("webpack-merge");
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
module.exports = {
  mode: "production",
  entry: {
    index: "./src/index.js",
    mian: "./src/mian.js",
  },
  output: {
    // hash 
    filename: "[name].[hash:6]bundle.js",
    path: path.resolve("./build"),
  },
  module: {
    rules: [
      {
        test: /\.jsx?$/i,
        use: "babel-loader",
      },
    ],
  },
  plugins: [
    new CleanWebpackPlugin(),
    new HtmlWebpackPlugin({
      template: "./public/index.html",
    }),
  ],
};src/indec.jsconsole.log('hello index.js');src/mian.jsconsole.log('hello mian.js');执行打包命令
yarn build可以看到我们的两个入口文件的生成的 hash 值都是相同的
现在我们来简单修改一下
src/idnex.js中的代码src/index.jsconsole.log('hello index.js webpack');重新执行打包命令
yarn build- 可以看到,我们只修改了 
index.js,但是打包后的main.jshash值也被修改了,这就是 hash 的特性,它的粒度是项目级别的,只要项目中任意一个文件被修改,都会将重新生成所有文件
 
chunkhash
将 hash 修改为 chunkhash
webpack.config.js...
  filename: "[name].[chunkhash:6].bundle.js",
...执行打包命令
yarn build可以看到我们的两个入口文件的生成的 chunkhash 值现在就不同了
现在我们再来简单修改一下
src/idnex.js中的代码src/index.jsconsole.log('hello index.js webpack');重新执行打包命令
yarn build- 可以看到,这次它只给 index.js 重新生成了, 
chunkhash会根据不同的入口根据依赖生成一个 32位的hash值,不属于这个入口的不会被重新生成
 
contenthash
将 chunkhash 修改为 contenthash
webpack.config.js...
  filename: "[name].[contenthash:6].bundle.js",
...执行打包命令
yarn build可以看到我们的两个入口文件的生成的 contenthash 值现在就不同了
现在我们再来简单修改一下
src/idnex.js中的代码src/index.jsconsole.log('hello index.js webpack');重新执行打包命令
yarn build可以看到,这次也只有
index.js被重新生成
那我们再来试一下修改一下
src/main.js中的代码src/main.jsconsole.log('hello main.js webpack');重新执行打包命令
yarn build- 可以看到,这次也只重新生成了 
main.js被重新生成
 
contenthash  的粒度是文件级别的,只有修改的文件才会重新生成 哈希值,有利于缓存,这里 有关于 contenthash 的更多说明
最佳实践
hash单入口项目chunkhash多入口项目contenthash需要长期缓存,并且确定变化较小的
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议,转载请注明出处。