基于 gulp 的前端靜態(tài)資源版本管理

首先要明確為什么要進(jìn)行前端靜態(tài)資源的版本管理糠悯,其主要目的是為了解決瀏覽器緩存問(wèn)題你稚,很多人會(huì)說(shuō)瀏覽器緩存不是服務(wù)端通過(guò)設(shè)置Etag過(guò)期時(shí)間之類(lèi)的就可以嗎扭粱?為什么前端還要管理緩存扶歪?還有人可能會(huì)說(shuō)狞谱,緩存這么麻煩掸刊,那么可以不緩存免糕?

帶著上面的疑問(wèn),所以我們要了解瀏覽器緩存。

瀏覽器緩存基本認(rèn)識(shí)

瀏覽器緩存能有效減輕資源服務(wù)器的請(qǐng)求量石窑,提高網(wǎng)頁(yè)或應(yīng)用程序的資源訪問(wèn)速度牌芋,所以一個(gè)WEB應(yīng)用,緩存是必不可以少的優(yōu)化利器尼斧。

緩存分為:

  • 強(qiáng)緩存
  • 協(xié)商緩存

強(qiáng)緩存

通過(guò)服務(wù)器返回response header中的Expires或者Cache-Control的時(shí)間來(lái)決定是否從本地讀取緩存資源姜贡。

字段 http版本 說(shuō)明
Expires http1.0 返回GMT的絕對(duì)時(shí)間
Cache-Control http1.1 以秒為單位的過(guò)期時(shí)間

協(xié)商緩存

當(dāng)瀏覽器對(duì)某個(gè)資源的請(qǐng)求沒(méi)有命中強(qiáng)緩存,就會(huì)發(fā)一個(gè)請(qǐng)求到服務(wù)器棺棵,驗(yàn)證協(xié)商緩存是否命中楼咳,如果協(xié)商緩存命中,請(qǐng)求響應(yīng)返回的http狀態(tài)為304烛恤。當(dāng)瀏覽器收到304響應(yīng)時(shí)母怜,就會(huì)直接從本地緩存讀取資源。

協(xié)商緩存是利用的是【Last-Modified缚柏,If-Modified-Since】和【ETag苹熏、If-None-Match】這兩對(duì)Header來(lái)管理的。

強(qiáng)緩存和協(xié)商緩存的共同點(diǎn)

強(qiáng)緩存與協(xié)商緩存的共同點(diǎn)是:如果命中币喧,都是從客戶(hù)端緩存中加載資源轨域,而不是從服務(wù)器加載資源數(shù)據(jù);區(qū)別是:強(qiáng)緩存不發(fā)請(qǐng)求到服務(wù)器杀餐,協(xié)商緩存會(huì)發(fā)請(qǐng)求到服務(wù)器干发。

前端刷新緩存

根據(jù)前面緩存的基本知識(shí),當(dāng)資源被強(qiáng)緩存時(shí)史翘,而資源版本已在服務(wù)器更新枉长,這時(shí)我們就需要刷新緩存。當(dāng)文件重命名或文件URL添加參數(shù)琼讽,都可以刷新緩存必峰。

一般通過(guò)兩種方式來(lái)刷新:

  • 資源重新命名,如: index.js 更新為 index_a083082f.js
  • 資源鏈接添加變化的參數(shù)钻蹬,如:index.js 更新為 index.js?hash=a083082f

資源重新命名

從可用性角度說(shuō)吼蚁,大型web應(yīng)用中,資源重新命名是最優(yōu)的選擇问欠,因?yàn)樾碌馁Y源文件不會(huì)覆蓋正在運(yùn)行的資源文件肝匆,比如關(guān)鍵邏輯的JS腳本文件。而且CDN回源需要一定的時(shí)間才能全網(wǎng)生效溅潜,等資源文件生效后再進(jìn)行HTML文件的發(fā)布。HTML文件強(qiáng)制不緩存薪伏,就能很好的達(dá)到WEB應(yīng)用版本更新的目的滚澜。

資源重新命名,也同時(shí)會(huì)造成大量無(wú)效舊版文件存在于CDN或版本管理服務(wù)器(SVN,GIT)嫁怀。

資源鏈接添加變化的參數(shù)

一般添加資源更新日期或文件內(nèi)容的hash值设捐。

但不管哪種方式借浊,手動(dòng)修改文件版本號(hào),只適用于非常小型的應(yīng)用萝招。我們需要的是一個(gè)自動(dòng)化的前端工具來(lái)做這件事蚂斤。

于是筆者就造了以下兩個(gè)輪子:

  • gulp-hash-list ,主要作用是讀取資源槐沼,計(jì)算hash值曙蒸,按指定的格式生成一個(gè)清單文件。
  • gulp-asset-revision
    讀取資源列表的清單文件岗钩,替換HTML中的js,css等資源引用地址纽窟。

gulp-hash-list和gulp-asset-revision的使用

var gulp = require('gulp');
var hash = require('gulp-hash-list');
var revision = require('gulp-asset-revision');

gulp.task('hash', function() {
    return gulp.src(['./src/**/*.js','./src/**/*.css'])
        .pipe(hash({
            "template": "{name}{ext}?hash={hash}"
        }))
        .pipe(gulp.dest('./dist'))
        .pipe(hash.manifest('assets.json'))
        .pipe(gulp.dest('./manifest'));
});

gulp.task('revision', ['hash'], function() {
    return gulp.src(['./pages/*.html'])
        .pipe(revision({
            hasSuffix: false,
            manifest: './manifest/assets.json'
        }))
        .pipe(gulp.dest('./pages/'));
});

為什么要選用gulp-hash-list和gulp-asset-revision

其實(shí)Gulp生態(tài)已經(jīng)有gulp-rev + gulp-rev-collector這種優(yōu)秀的方案,但是它只支持生成新的文件名兼吓,不支持添加參數(shù)的形式臂港。

gulp-hash-listgulp-asset-revision不僅可以支持生成新文件,同時(shí)支持添加參數(shù)的形式刷新資源版本號(hào)视搏,以更新緩存审孽。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市浑娜,隨后出現(xiàn)的幾起案子佑力,更是在濱河造成了極大的恐慌,老刑警劉巖棚愤,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搓萧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡宛畦,警方通過(guò)查閱死者的電腦和手機(jī)瘸洛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)次和,“玉大人反肋,你說(shuō)我怎么就攤上這事√な” “怎么了石蔗?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)畅形。 經(jīng)常有香客問(wèn)我养距,道長(zhǎng),這世上最難降的妖魔是什么日熬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任棍厌,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘耘纱。我一直安慰自己敬肚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布束析。 她就那樣靜靜地躺著艳馒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪员寇。 梳的紋絲不亂的頭發(fā)上弄慰,一...
    開(kāi)封第一講書(shū)人閱讀 49,985評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音丁恭,去河邊找鬼曹动。 笑死,一個(gè)胖子當(dāng)著我的面吹牛牲览,可吹牛的內(nèi)容都是我干的墓陈。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼第献,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼贡必!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起庸毫,我...
    開(kāi)封第一講書(shū)人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤仔拟,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后飒赃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體利花,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年载佳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了炒事。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蔫慧,死狀恐怖挠乳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姑躲,我是刑警寧澤睡扬,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站黍析,受9級(jí)特大地震影響卖怜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜阐枣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一马靠、第九天 我趴在偏房一處隱蔽的房頂上張望牍戚。 院中可真熱鬧,春花似錦虑粥、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至锁孟,卻和暖如春彬祖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背品抽。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工储笑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人圆恤。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓突倍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親盆昙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子羽历,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

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