4-10 webpack 與瀏覽器緩存(caching)

1.簡介

瀏覽器在加載資源時(shí),為了提高效率,會(huì)使用一定的緩存策略,比如強(qiáng)緩存,與協(xié)商緩存,那么如何保證在資源發(fā)布以后瀏覽器能拿到最新的資源而不是緩存呢?

2. filename 和 chunkFilename

我們先來了解一下 output 中這兩個(gè)字段的作用,如下:

// index.js
import _ from 'lodash';
import $ from 'jquery';

const dom = $('<div>');
dom.html(_.join(['index', 'loaded'], ' '));
$('body').append(dom);
output: {
        path: path.resolve(__dirname, '../dist'),
        filename: "[name].js"
    },

打包后如下:


image.png

可以看到輸出的資源名是 [name].js,現(xiàn)在修改一下 filename 如下:
···
output: {
path: path.resolve(__dirname, '../dist'),
filename: "[name].bundle.js"
},
···
重新打包:


image.png

然后,我們進(jìn)行如下修改:

    output: {
        path: path.resolve(__dirname, '../dist'),
        filename: "[name].bundle.js",
        chunkFilename: "[name].chunk.js"
    },

如下:


image.png

閱讀以文檔可以知道,filename 使用來控制 entry chunk ,而 chunkFIlename
是用來控制 non-entry chunk 的。
我們還可以使用更多的占位符,比如 ,id, hash 等來控制輸出名稱。

3. 資源更新

我們來看一個(gè)例子,進(jìn)入 dist 目錄,開啟一個(gè)服務(wù)器如下:


image.png

打開 http://127.0.0.1:8080,然后刷新


image.png

我們可以看到第一次從服務(wù)器獲取資源,第二次是 from memory cache。
修改一下 index.js 如下:
// index.js
import _ from 'lodash';
import $ from 'jquery';

const dom = $('<div>');
dom.html(_.join(['index', 'loaded11'], ' '));
$('body').append(dom);

刷新發(fā)現(xiàn)如下:


image.png

但如果我們直接利用 webstorm 打開該 html,如下:


image.png

其實(shí) dist 資源已經(jīng)更新了,但是瀏覽器發(fā)出的資源請(qǐng)求名稱并沒有改變,在訪問我們的服務(wù)器資源時(shí),就會(huì)直接讀取緩存,我們?cè)囍诟淖?index.js,可以發(fā)現(xiàn)訪問 webstorm 服務(wù)器的頁面又更新了,但是訪問自己的服務(wù)器的頁面依然沒有更新。這是由于 webstorm 服務(wù)器自動(dòng)開啟了協(xié)商緩存功能,但是我們的服務(wù)器沒有開啟。
那么對(duì)于沒有開啟協(xié)商緩存功能的服務(wù)器,如何更新資源呢?

4. contenthash

contenthash 占位符,是根據(jù)內(nèi)容生成的 hash,內(nèi)容不變,hash 就不變,如下:

    output: {
        path: path.resolve(__dirname, '../dist'),
        filename: "[name].[contenthash].js",
        chunkFilename: "[name].[contenthash].js"
    },

打包兩次看一下:


image.png

image.png

發(fā)現(xiàn) hash 值是一樣的。我們打開 server,然后修改一下 index.js

dom.html(_.join(['index', 'loaded2'], ' '));

刷新瀏覽器:


image.png

發(fā)現(xiàn) idnex 由于內(nèi)容更新,導(dǎo)致 hash 更新,重服務(wù)器獲取了新的資源,而 verndors~index 則還是原來的 hash,所以從緩存直接讀取。

5. 小結(jié)

實(shí)際開發(fā)中,devserver 已經(jīng)默認(rèn)開啟協(xié)商緩存,開發(fā)時(shí)其實(shí)不大必要設(shè)置 contenthash,但是在生產(chǎn)環(huán)境中還是應(yīng)該使用該占位符來標(biāo)識(shí)資源。

參考

瀏覽器的協(xié)商緩存與強(qiáng)緩存
https://webpack.js.org/configuration/output/#outputfilename
https://webpack.js.org/configuration/output/#outputchunkfilename

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 獲取全套webpack 4.x教程,請(qǐng)?jiān)L問瓦力博客 小菜之前寫過關(guān)于瀏覽器是如何緩存的nginx 緩存{:targ...
    瓦力博客閱讀 962評(píng)論 0 0
  • 一、前言 緩存可以說是性能優(yōu)化中簡單高效的一種優(yōu)化方式了。一個(gè)優(yōu)秀的緩存策略可以縮短網(wǎng)頁請(qǐng)求資源的距離,減少延遲,...
    浪里行舟閱讀 208,972評(píng)論 46 521
  • 假如我們同時(shí)引入了lodash和jquery 然后運(yùn)行打包npm run build,這個(gè)時(shí)候會(huì)報(bào)一個(gè)文件過大的警...
    泡杯感冒靈閱讀 1,428評(píng)論 0 0
  • 一、前言 緩存可以說是性能優(yōu)化中簡單高效的一種優(yōu)化方式了。一個(gè)優(yōu)秀的緩存策略可以縮短網(wǎng)頁請(qǐng)求資源的距離,減少延遲,...
    沉落的星星閱讀 433評(píng)論 0 0
  • 把因果參透了,才真正曉得,這個(gè)世界上有沒有占便宜的人?沒有;有沒有吃虧的人?也沒有。為什么?他要償債的,殺人要償命...
    先生百年閱讀 605評(píng)論 0 0

友情鏈接更多精彩內(nèi)容