webpack打包的3種hash值詳解

前言

大傢好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心

當年的校招

依稀記得,當年我參加瞭大廠的校招,面試的是網易雷火工作室,當時有一道題,我記得很清楚,就是:說說webpack中三種hash配置的區別

哈哈,我當時連webpack都不太會配置,所以也答不出來,然後也。。。沒有然後瞭。。

哪三種?

webpack中的三種hash分別是:

  • hash:全局hash
  • chunkhash:分組hash
  • contenthash:內容hash

實踐講解

事先準備

準備三個文件:

  • main.js
import './main.css'

console.log('我是main.js')
  • console.js
console.log('我是console.js')
  • main.css
.title {
  color: #000;
}

打包環境搭建

打包環境的搭建我就不在這裡詳細講瞭,想看的之後我會出一篇文章專門講解。這裡我就抽取精華部分。

  • webpack.config.js
// 多入口打包
entry: {
    main: './src/main.js',
    console: './src/console.js'
  },
// 輸出配置
output: {
    path: path.resolve(__dirname, './dist'),
    // 這裡預設為hash
    filename: 'js/[name].[hash].js',
    clean: true
  },
plugins: [
      // 打包css文件的配置
      new MiniCssExtractPlugin({
      // 這裡預設為hash
      filename: 'styles/[name].[hash].css'
    })
]

hash

由於我們預設的是hash,所以我們直接運行打包npm run build,我們看看我們打包後的是什麼東西

可以看到,所有文件的文件名hash值都是一致的,那我們現在改一下main.css這個文件

.title {
  // #000 改成 #fff
  color: #fff;
}

然後我們再運行npm run build打包,看看打包後的是什麼東西:

可以看出,修改一個文件,所有文件的hash值跟著變

結論:牽一發動全身,隻改瞭一個main.css,會導致打包後所有文件的hash值都改變。所以當打包名稱設置為hash時,整個項目文件是一致的,修改其中一個會導致所有跟著一起改。

chunkhash

我們把輸出文件名規則修改為chunkhash:

entry: {
    main: './src/main.js',
    console: './src/console.js'
  },
output: {
    path: path.resolve(__dirname, './dist'),
    // 修改為 chunkhash
修改    filename: 'js/[name].[chunkhash].js',
    clean: true
  },
plugins: [
      new MiniCssExtractPlugin({
      // 修改為 chunkhash
修改      filename: 'styles/[name].[chunkhash].css'
    })
]

此時我們運行npm run build看看,打包後的東西:

我們可以看出,hash值會根據入口文件的不同而分出兩個陣營:

  • main.js、main.css一個陣營,都屬於main.js入口文件
  • console.js一個陣營,屬於console.js入口文件

那我們現在照樣修改一下main.css:

.title {
  // 從 #fff 改為 pink
  color: pink;
}

重新運行npm run build打包看看:

可以看出,main.css修改後會影響main.css、main.js的hash值

結論:當規則為chunkhash時,打包後的hash值會根據入口文件的不用而不一樣,當某個入口文件修改後重新打包,會導致本入口文件關聯的所有文件的hash值都修改,但是不會影響到其他入口文件的hash值

contenthash

我們把輸出文件名規則修改為contenthash:

entry: {
    main: './src/main.js',
    console: './src/console.js'
  },
output: {
    path: path.resolve(__dirname, './dist'),
    // 修改為 contenthash
修改    filename: 'js/[name].[contenthash].js',
    clean: true
  },
plugins: [
      new MiniCssExtractPlugin({
      // 修改為 contenthash
修改      filename: 'styles/[name].[contenthash].css'
    })
]

運行npm run build打包,看看打包後的文件長什麼樣子:

可以看到,每個文件的hash值都不一樣,每個文件的hash值都是根據自身的內容去生成的,那我們現在修改一下main.css:

.title {
  // pink 修改為 blue
  color: blue;
}

重新打包看看:

可以看出,main.css修改後隻會影響main.css得hash值,也就是自己的hash值

結論:當規則為contenthash時,每個文件的hash值都是根據自身內容而生成,當某個文件內容修改時,打包後隻會修改其本身的hash值,不會影響其他文件的hash值

以上就是webpack打包的3種hash值詳解的詳細內容,更多關於webpack打包hash值的資料請關註WalkonNet其它相關文章!

推薦閱讀: