摘要:原理修改和文件通過對文件內(nèi)容進(jìn)行運(yùn)算,生成一個文件的唯一字符串如果文件修改則號會發(fā)生變化替換中的文件名,生成一個帶版本號的文件名方案現(xiàn)在網(wǎng)上的方案都是生成一個新的目錄,里面包含了要發(fā)布的等文件。
原理
修改js和css文件
通過對js,css文件內(nèi)容進(jìn)行hash運(yùn)算,生成一個文件的唯一hash字符串(如果文件修改則hash號會發(fā)生變化)
替換html中的js,css文件名,生成一個帶版本號的文件名
方案現(xiàn)在網(wǎng)上的方案都是生成一個新的dist目錄,里面包含了要發(fā)布的html,js,css等文件。但是在實(shí)際的公司的項(xiàng)目中,會有情況不能生成新的HTML進(jìn)行發(fā)布,需要在原來的HTML文件上進(jìn)行js ,css版本的替換. 這里分享下我在實(shí)際項(xiàng)目中通過改動插件然后在原目錄結(jié)構(gòu)下進(jìn)行版本的控制方案。
原h(huán)tml文件代碼
預(yù)期效果:在原目錄結(jié)構(gòu)下html文件代碼
1:安裝gulp和gulp插件
執(zhí)行:
npm install --save-dev gulp npm install --save-dev gulp-rev npm install --save-dev gulp-rev-collector npm install --save-dev run-sequence
2:編寫gulpfile.js
//引入gulp和gulp插件 var gulp = require("gulp"), runSequence = require("run-sequence"), rev = require("gulp-rev"), revCollector = require("gulp-rev-collector"); //定義css、js源文件路徑 var cssSrc = "css/*.css", jsSrc = "js/*.js"; //CSS生成文件hash編碼并生成 rev-manifest.json文件名對照映射 gulp.task("revCss", function(){ return gulp.src(cssSrc) .pipe(rev()) .pipe(rev.manifest()) .pipe(gulp.dest("rev/css")); }); //js生成文件hash編碼并生成 rev-manifest.json文件名對照映射 gulp.task("revJs", function(){ return gulp.src(jsSrc) .pipe(rev()) .pipe(rev.manifest()) .pipe(gulp.dest("rev/js")); }); //Html替換css、js文件版本 gulp.task("revHtml", function () { return gulp.src(["rev/**/*.json", "View/*.html"]) .pipe(revCollector()) .pipe(gulp.dest("View")); }); //開發(fā)構(gòu)建 gulp.task("dev", function (done) { condition = false; runSequence( ["revCss"], ["revJs"], ["revHtml"], done); }); gulp.task("default", ["dev"]);
執(zhí)行g(shù)ulp命令后的效果
//rev目錄下生成了manifest.json對應(yīng)文件 { "default.css": "default-803a7fe4ae.css" }
很顯然這不是我們需要的效果
3.更改gulp-rev和gulp-rev-collector
打開node_modulesgulp-revindex.js 第144行 manifest[originalFile] = revisionedFile; 更新為: manifest[originalFile] = originalFile + "?v=" + file.revHash;
打開nodemodulesgulp-rev odemodules ev-pathindex.js 10行 return filename + "-" + hash + ext; 更新為: return filename + ext;
打開node_modulesgulp-rev-collectorindex.js 31行if ( !_.isString(json[key]) || path.basename(json[key]).replace(new RegExp( opts.revSuffix ), "" ) !== path.basename(key) ) { 更新為: if ( !_.isString(json[key]) || path.basename(json[key]).split("?")[0] !== path.basename(key) ) {
再執(zhí)行g(shù)ulp命令,得到的結(jié)果如下(效果正確):
但是假如我們更改了css和js后,再執(zhí)行g(shù)ulp命令,得到的結(jié)果會如下:
有沒有發(fā)現(xiàn),會在版本號后面再添加一個版本號,因?yàn)間ulp只替換了原來文件名,這樣又不符合預(yù)期效果了,所以我們想到,還需要修改插件的替換正則表達(dá)式。
4.繼續(xù)更改gulp-rev-collector
打開node_modulesgulp-rev-collectorindex.js 第107行 regexp: new RegExp( "([/""])" + pattern, "g" ), 更新為: regexp: new RegExp( "([/""])" + pattern+"(?v=w{10})?", "g" ),
現(xiàn)在你不管執(zhí)行多少遍gulp命令,得到的html效果都是
附上改過后的node_modules文件
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/90906.html
摘要:雖然如此,但是網(wǎng)站前端性能優(yōu)化的思路基本沒變。為什么前端性能如此重要數(shù)據(jù)顯示只有的最終用戶響應(yīng)時間花在了下載文檔上。前端性能優(yōu)化一味奉行最佳實(shí)踐有時候反而過而不及,所以針對項(xiàng)目的實(shí)際情況來優(yōu)化才是明智的選擇。 前端近幾年變化很大,各種工具,庫,框架并發(fā)。雖然如此,但是網(wǎng)站前端性能優(yōu)化的思路基本沒變。為什么前端性能如此重要?數(shù)據(jù)顯示: 只有 10%~20% 的最終用戶響應(yīng)時間花在了下載...
摘要:前端靜態(tài)資源緩存最優(yōu)解以及的陷阱合理的使用緩存可以極大地提高網(wǎng)站的性能優(yōu)勢,還可以節(jié)約帶寬從而降低服務(wù)器成本。此處注意和與第一天請求的版本號不同。既支持版本號類型的靜態(tài)資源緩存方式也支持服務(wù)器重新認(rèn)證的方式。 前端靜態(tài)資源緩存最優(yōu)解以及max-age的陷阱 合理的使用緩存可以極大地提高網(wǎng)站的性能優(yōu)勢,還可以節(jié)約帶寬從而降低服務(wù)器成本。但是很多站點(diǎn)有只弄對了一半或者一半都沒有,如果是這樣...
摘要:結(jié)果會被存放到拷貝文件目錄你可以使用方法拷貝文件目錄到新路徑,所有操作都相對于項(xiàng)目根目錄版本號緩存刷新很多開發(fā)者會給編譯的前端資源添加時間戳或者唯一令牌后綴以強(qiáng)制瀏覽器加載最新版本而不是代碼的緩存副本。 環(huán)境準(zhǔn)備 1、安裝 nodejs 和 npm ?如果你使用的是 Laravel 的 Homestead 環(huán)境,可以不用安裝了,已自帶。 ?我們來查看下它們的版本: $ node -v ...
摘要:關(guān)于標(biāo)題,為什么是愛與恨因?yàn)樵趧偝鰜淼臅r候,我并不是堅(jiān)定的支持者,有很多地方用起來不方便,設(shè)計(jì)不合理。用戶只有首次訪問需要下載全部靜態(tài)資源,以后的訪問都直接使用緩存資源。首先,在中添加字段,當(dāng)為時,則開啟服務(wù)。例如請求的是則返回中的數(shù)據(jù)。 關(guān)于標(biāo)題,為什么是愛與恨? 因?yàn)樵?webpack 剛出來的時候,我并不是堅(jiān)定的支持者,有很多地方用起來不方便,api 設(shè)計(jì)不合理。隨著 webpa...
摘要:簡言之,我們認(rèn)為好的用戶體驗(yàn)從快速的內(nèi)容傳輸開始,也就意味著性能美觀。每一步我們都在探討如何在獲得好的用戶體驗(yàn)和保證設(shè)計(jì)美感的同時,最小化對性能的影響。字型子集設(shè)定到目前為止,子集設(shè)定是改善網(wǎng)頁字體性能最快的方式。 作者 Declan 原文鏈接 最近更新了我們的網(wǎng)站,它是經(jīng)過了設(shè)計(jì)上的全面驗(yàn)收的。但實(shí)際上,作為軟件開發(fā)者,我們會注重很多技術(shù)相關(guān)的零碎的東西。我們的目標(biāo)是控制性能,注重性...
閱讀 3064·2023-04-26 03:01
閱讀 3549·2023-04-25 19:54
閱讀 1607·2021-11-24 09:39
閱讀 1386·2021-11-19 09:40
閱讀 4267·2021-10-14 09:43
閱讀 2102·2019-08-30 15:56
閱讀 1507·2019-08-30 13:52
閱讀 1669·2019-08-29 13:05