webapck構(gòu)建文件命名hash chunkhash contenthash區(qū)別

hash是通過既定的數(shù)據(jù)摘要算法(目前使用最廣泛的是md5)計(jì)算出來的hash值右锨。

webpack內(nèi)置的hash相關(guān)的配置有兩個(gè):hash和chunkhash。

名稱 webapck 1 webapck 2及以上
hash The hash of compilation The hash of module identifier
chunkhash The hash of the chunk The hash of the chunk content

webpack的compilation對象代表某個(gè)版本的資源對應(yīng)的編譯進(jìn)程曲秉。當(dāng)使用webpack的development中間件時(shí)钱床,每次檢測到項(xiàng)目文件有改動(dòng)就會(huì)創(chuàng)建一個(gè)新的compilation观堂,進(jìn)而能夠針對改動(dòng)產(chǎn)生全新的編譯文件督赤。compilation對象包含當(dāng)前模塊資源、待編譯文件拴清、有改動(dòng)的文件和監(jiān)聽依賴的所有信息靶病。

注:與compilation對應(yīng)的有個(gè)compiler對象,通過對比贷掖,可以幫助大家對compilation有更深入的理解嫡秕。compiler對象代表的是配置完備的Webpack環(huán)境。 compiler對象只在Webpack啟動(dòng)時(shí)構(gòu)建一次苹威,由Webpack組合所有的配置項(xiàng)構(gòu)建生成昆咽。compiler對象代表的是不變的webpack環(huán)境,是webpack本身,而compilation對象針對的是隨時(shí)可變的項(xiàng)目文件掷酗,只要文件有改動(dòng)调违,compilation就會(huì)被重新創(chuàng)建。

  • hash

對于hash的理解泻轰,我認(rèn)為webpack 1中的The hash of compilation定義更準(zhǔn)確技肩,可以理解成是項(xiàng)目總體文件的hash值。所以若打包文件輸出時(shí)以hash命名浮声,項(xiàng)目中任何一個(gè)文件修改構(gòu)建后都會(huì)生成新的hash,會(huì)影響所有資源的緩存虚婿。比如webpack配置如下:

output: {
  filename: '[name].[hash:8].js'
}
  • chunkhash

chunk在webpack中的含義可以理解成多個(gè)模塊合并成的一個(gè)"新模塊",依據(jù)其自身的代碼內(nèi)容根據(jù)一定的摘要算法所得的hash值泳挥。也就是特定模塊獨(dú)有的hash值然痊。webpack配置更改如下:

output: {
  filename: '[name].[chunkhash:8].js'
}

此時(shí)編譯后輸出的文件名中的hash值將不再一樣。

  • contenthash

contenthash并不是webpack的另外一中hash屉符,而是由ExtractTextPlugin插件(主要作用: 將css代碼從打包后的js代碼中分離出來)提供的剧浸,代表被導(dǎo)出的css部分代碼內(nèi)容計(jì)算后的的hash值

1. 在webpack構(gòu)建過程中,我們可以狹隘的認(rèn)為他只認(rèn)js文件矗钟,其他文件都需要借助js文件構(gòu)建唆香,比如css資源必須都在js中引入。例如在main.js文件中引入main.css文件:

import 'main.css';

2. webpack默認(rèn)將構(gòu)建后的css代碼合并到引用它的js文件中吨艇。那么css是怎么引入到頁面中的呢躬它?
----其實(shí)就是js在運(yùn)行的時(shí)候動(dòng)態(tài)創(chuàng)建style標(biāo)簽,然后append進(jìn)head中的东涡。所以在本地開發(fā)中若是沒有開啟ExtractTextPlugin的話虑凛,那么css代碼都是內(nèi)聯(lián)在html中的。

3. 盡然chunkhash已經(jīng)能以一個(gè)文件為單位去生成一個(gè)特定的chunkhash了那软啼,那么為什么還要用contenthash呢?
大家考慮怎么一個(gè)場景:
----假設(shè)有主模塊main.js, 同步模塊sync.js延柠,其中mian.js中引入了main.css, 將這三個(gè)模塊按下面代碼的配置進(jìn)行構(gòu)建打包到“同一個(gè)文件”(此時(shí)配置了ExtractTextPlugin插件祸挪,css代碼會(huì)單獨(dú)抽離到一個(gè)文件,若不添加ExtractTextPlugin會(huì)被打包到一個(gè)js文件)

{
  test: /\.css$/,
  use: ExtractTextPlugin.extract({
    filename: './dist/[name].[chunkhash:8].css',
    use: [
      'css-loader',
      'postcss-loader',
    ],
  }),
}

構(gòu)建后會(huì)輸出main.8a132fcd.jsmain.8a132fcd.css兩個(gè)文件贞间,二者的chunkname和hash會(huì)是一樣的贿条;

① 若后續(xù)我們修改了main.js或是sync.js里面的代碼,重新構(gòu)建后劳闹,會(huì)生成新的chunkhash,那么構(gòu)建后的js文件和css文件的hash都會(huì)改變债沮。
② 若是我們值修改了main.css代碼的話错森,重新構(gòu)建后,會(huì)發(fā)現(xiàn)chunkhash并未改變公黑,這是為什么?
-----這是因?yàn)閷?dǎo)入ExtractTextPlugin后會(huì)將css代碼獨(dú)立導(dǎo)出,它的修改不會(huì)引起主js文件chunkhash的改變凡蚜,sync.js人断、mian.js、main.css三個(gè)文件本屬于同一個(gè)chunk,被導(dǎo)出的css雖然不會(huì)參與chunkhash的計(jì)算朝蜘,但是也不會(huì)做為一個(gè)獨(dú)立的chunk計(jì)算恶迈,所以name和hash還是取主js文件的。

這樣就會(huì)有一個(gè)問題谱醇,要是css改變了的話暇仲,重新構(gòu)建后的css文件名并沒有改變會(huì)導(dǎo)致用戶瀏覽器還是會(huì)拉取緩存中的資源,所以最好還是配置成如下的contenthash

{
  test: /\.css$/,
  use: ExtractTextPlugin.extract({
    filename: './dist/[name].[contenthash:8].css',
    use: [
      'css-loader',
      'postcss-loader',
    ],
  }),
}

這樣改后修改main.js或者sync.js,css文件的hash不會(huì)變副渴,若單獨(dú)修改css奈附,那么主js文件的hash也不會(huì)改變

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市佳晶,隨后出現(xiàn)的幾起案子桅狠,更是在濱河造成了極大的恐慌,老刑警劉巖轿秧,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件中跌,死亡現(xiàn)場離奇詭異,居然都是意外死亡菇篡,警方通過查閱死者的電腦和手機(jī)漩符,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驱还,“玉大人嗜暴,你說我怎么就攤上這事∫轶。” “怎么了闷沥?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長咐容。 經(jīng)常有香客問我舆逃,道長,這世上最難降的妖魔是什么戳粒? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任路狮,我火速辦了婚禮,結(jié)果婚禮上蔚约,老公的妹妹穿的比我還像新娘奄妨。我一直安慰自己,他們只是感情好苹祟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布砸抛。 她就那樣靜靜地躺著评雌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锰悼。 梳的紋絲不亂的頭發(fā)上柳骄,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音箕般,去河邊找鬼耐薯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丝里,可吹牛的內(nèi)容都是我干的曲初。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼杯聚,長吁一口氣:“原來是場噩夢啊……” “哼臼婆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起幌绍,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對情侶失蹤颁褂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后傀广,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颁独,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年伪冰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了誓酒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贮聂,死狀恐怖靠柑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吓懈,我是刑警寧澤歼冰,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站耻警,受9級(jí)特大地震影響停巷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜榕栏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蕾各。 院中可真熱鬧扒磁,春花似錦、人聲如沸式曲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兰伤,卻和暖如春内颗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背敦腔。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工均澳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人符衔。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓找前,卻偏偏與公主長得像,于是被迫代替她去往敵國和親判族。 傳聞我的和親對象是個(gè)殘疾皇子躺盛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • webpack 構(gòu)建 流程 webpack 整體是一個(gè)插件的架構(gòu),所有的功能都是插件的方式集成在構(gòu)建流程中槐臀,通過發(fā)...
    Lyan_2ab3閱讀 939評(píng)論 0 1
  • 前言 作為 Vue 的使用者我們對于 vue-cli 都很熟悉锄蹂,但是對它的 webpack 配置我們可能關(guān)注甚少,...
    44653b6bb441閱讀 685評(píng)論 0 0
  • vue-cli腳手架中webpack配置基礎(chǔ)文件詳解 一水慨、前言 vue-cli是構(gòu)建vue單頁應(yīng)用的腳手架得糜,輸入一...
    晟明閱讀 1,346評(píng)論 0 2
  • 前言 我們知道,瀏覽器為了優(yōu)化體驗(yàn)晰洒,會(huì)有緩存機(jī)制朝抖。如果瀏覽器判斷當(dāng)前資源沒有更新,就不會(huì)去服務(wù)端下載谍珊,而是直接使用...
    JungleW閱讀 6,454評(píng)論 4 7
  • 前端將大型項(xiàng)目分成一個(gè)個(gè)單獨(dú)的模塊治宣,一般封裝好的每個(gè)模塊都會(huì)實(shí)現(xiàn)一個(gè)目的明確的完成的功能。如何處理這些模塊以及模塊...
    pixels閱讀 3,425評(píng)論 1 14