1. 程式人生 > >前端靜態資源版本更新與快取之——通過gulp 在原html檔案上自動化新增js、css版本號

前端靜態資源版本更新與快取之——通過gulp 在原html檔案上自動化新增js、css版本號

原理

修改js和css檔案

通過對js,css檔案內容進行hash運算,生成一個檔案的唯一hash字串(如果檔案修改則hash號會發生變化)

替換html中的js,css檔名,生成一個帶版本號的檔名

方案

現在網上的方案都是生成一個新的dist目錄,裡面包含了要釋出的html,js,css等檔案。但是在實際的公司的專案中,會有情況不能生成新的HTML進行釋出,需要在原來的HTML檔案上進行js ,css版本的替換. 這裡分享下我在實際專案中通過改動外掛然後在原目錄結構下進行版本的控制方案。

原html檔案程式碼

<link rel="stylesheet" href="../css/default.css"
>
<script src="../js/app.js"></script>

預期效果:在原目錄結構下html檔案程式碼

<link rel="stylesheet" href="../css/default.css?v=5a636d79c4">
<script src="../js/app.js?v=3a0d844594"></script>

1:安裝gulp和gulp外掛
執行:

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')); }); //開發構建 gulp.task('dev', function (done) { condition = false; runSequence( ['revCss'], ['revJs'], ['revHtml'], done); }); gulp.task('default', ['dev']);

執行gulp命令後的效果

//rev目錄下生成了manifest.json對應檔案
{
  "default.css": "default-803a7fe4ae.css"
}


<link rel="stylesheet" href="../css/default-803a7fe4ae.css">
<script src="../js/app-3a0d844594.js"></script>

很顯然這不是我們需要的效果

3.更改gulp-rev和gulp-rev-collector

開啟node_modules\gulp-rev\index.js
第144行 manifest[originalFile] = revisionedFile;
更新為: manifest[originalFile] = originalFile + '?v=' + file.revHash;
開啟nodemodules\gulp-rev\nodemodules\rev-path\index.js
10return filename + '-' + hash + ext;
更新為: return filename + ext;
開啟node_modules\gulp-rev-collector\index.js
31if ( !_.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) ) {
開啟node_modules\gulp-rev-collector\index.js
第107行 regexp: new RegExp( '([\/\\\\\'"])' + pattern, 'g' ),
更新為: regexp: new RegExp( '([\/\\\\\'"])' + pattern+'(\\?v=\\w{10})?', 'g' ),

最終結果
經過上面的四步修改之後現在你不管執行多少遍gulp命令,得到的html效果都是:

<link rel="stylesheet" href="../css/default.css?v=5a636d79c4">
<script src="../js/app.js?v=3a0d844594"></script>

文章出處

相關推薦

前端靜態資源版本更新快取——通過gulphtml檔案自動化新增jscss版本

原理 修改js和css檔案 通過對js,css檔案內容進行hash運算,生成一個檔案的唯一hash字串(如果檔案修改則hash號會發生變化) 替換html中的js,css檔名,生成一個帶版本號的檔名 方案 現在網上的方案都是生成一個新的dist目錄,

使用gulp自動化打包合並前端靜態資源CSSJS文件壓縮添加版本

開發 替換 2.4 所有 vsu scom lena pfile sss 現在正在做的項目更新叠代比較頻繁,會經常對前端代碼打包部署,手動整合代碼文件很麻煩並且浪費時間,所以決定使用gulp來代替手工完成這項工作。 前端靜態資源在發版更新時會面臨客戶端瀏覽器緩存的問題(可參

前端靜態資源快取最優解以及max-age的陷阱

原文地址:點這裡 合理的使用快取可以極大地提高網站資源的利用率,還可以節約頻寬從而降低伺服器成本。但是很多站點針對快取的策略並不合理,甚至是完全無作為,如果是這樣,就完全沒有發揮出快取的優勢,而不合理的策略反而很大程度上會導致網站在訪問時會發生由於靜態資源的競

前端靜態資源快取處理

張玉龍大神的兩篇詳細講解: 由此可見,對於靜態資源的快取處理一般有兩種方式: 1.在靜態資源連結後面加版本號引數 2.通過前端構建工具生成檔案hash摘要拼接在檔名後,常用的工具有gulp、fis

Unity3D熱更新LuaFramework篇[09]--資源更新程式碼熱更新的具體實現

前言 在上一篇文章 Unity3D熱更新之LuaFramework篇[08]--熱更新原理及熱更伺服器搭建 中,我介紹了熱更新的基本原理,並且著手搭建一臺伺服器。 本篇就做一個實戰練習,真正的來實現熱更新功能。 一、準備工作 1、製作一個用於熱更新的介面 此前我製作了

Docker Swarm 服務版本更新回滾

Docker Swarm 服務版本更新 環境: 系統:Centos 7.4 x64 應用版本:Docker 18.09.0 管理節點:192.168.1.79 工作節點:192.168.1.78 工作節點:192.168.1.77 1、管理節點:建立服務設定更新策略 d

Nginx——配置vue前端靜態資源和SpringBoot介面服務

上一篇:Nginx——windows安裝 上面一篇記錄了Nginx的Windows環境安裝,本文基於此繼續記錄: 1、dos命令列輸入: start nginx 視窗閃爍一次之後,在瀏覽器輸入127.0.0.1會出現下面的頁面: 2、下面開啟nginx解壓目錄的c

Unity 伺服器踩坑 Node.js Express 資源更新檔案傳輸(三)

一、下載安裝Node.js 安裝,傻瓜式點選教程 二、安裝Express 開啟cmd一步一步cd進入C:\Program Files\nodejs\node_modules\npm資料夾下 然後執行npm install --sav

gulp實現前端靜態資源的壓縮,加MD5戳,替換引用,加CDN字首

之前一直在使用grunt,總感覺grunt的引數配置方法很繁瑣,沒有一個比較清晰的流程,加上自己對gulp的流操作比較感興趣,就決定轉戰gulp了。 相信前端er在釋出自己的程式碼時如果不使用前端一些構建工具的話,對頻繁上線的專案來說,自己手動壓縮打包替換CDN字首那是一

整合騰訊bugly的版本更新更新

眼看公司專案快要上線了,我是心急如焚啊!!因為我不會上線啊,更不會更新迭代!!!但是不用怕,男人就是幹!!經過潛心學習,請教,還是被我給拿下了,今天就分享一個騰訊中的bugly平臺的使用,至於使用它的好處我就不廢話了,百度一搜一大堆,有興趣自己去研究吧!先看效果圖:看完效果是

Spring Boot(六):如何配置靜態資源的地址訪問路徑

靜態資源,例如HTML檔案、JS檔案,設計到的Spring Boot配置有兩項,一是“spring.mvc.static-path-pattern”,一是“spring.resources.static-locations”,很多人都難以分辨它們之間的差異,所以

線上前端靜態資源代理到本地的幾種方式

前言 我是一個小前端,前段時間開始支援集團監控平臺業務。 當我拉下程式碼,開啟本地服務,出現了一大堆請求錯誤。 原因是:本地的host是127.0.0.1,而介面呼叫的是線上資料。 介面的host和平臺url的host都是x.alibaba-inc.co

前後端分離開發解決前端靜態資源跨域請求問題

前端靜態資源發起請求時首先會發送一個域請求,後端通過後再次發起get、post請求 使用過濾器對域請求授權,這裡授權了一個特殊的token請求欄位,可以根據自己的業務新增請求欄位。 import ja

Python學習:基本數據類型變量(中)基礎條件及循環(

sets 但是 while循環 spl view put 算數運算 sse 邏輯運算 一.數據類型和變量 1.可變與不可變數據類型   可變數據類型:在id不變的情況下,數據類型內部的元素可以改變   列表   字典   不可變數據類型:value改變,id也跟著改變

Intellij Idea中Jsp頁面不能訪問靜態資源(圖片jscss

tex 文件夾 nbsp 依然 技術分享 很多 路徑 contex mage 最近在學習Spring MVC框架。用Intellij Idea編譯器開發出現了很多因為不了解編譯器配置的問題。 這次是在main.jsp頁面中圖片標簽<img src="images/on

html 如何訪問 jar 包裏面的靜態資源jscss字體等)

感覺 裏的 query 源文件 需要 資源 巴巴 png dea 前言:最近兩天在嘗試寫一個工具 jar 包,裏面包含後臺處理的 java 代碼,包含前端 html、js、css、字體文件等,過程中解決了訪問 jar 包裏的靜態資源問題,所以記錄下來。 附:自己的一個

資料結構演算法美專欄學習筆記-排序(

排序方法 氣泡排序、插入排序、選擇排序、快速排序、歸併排序、計數排序、基數排序、桶排序。   複雜度歸類 氣泡排序、插入排序、選擇排序 O(n^2) 快速排序、歸併排序 O(nlogn) 計數排序、基數排序、桶排序 O(n)     演算法的執行效率 1. 最

spring boot靜態資源訪問配置(訪問專案資料夾外的檔案

很多類似的博文,但是實際配置後發現是有問題的。下面是完整的yml靜態資源訪問配置,在spring:下新增 mvc: static-path-pattern: /** #這個配置是預設配置 http:

web.xml中配置訪問資源URL/時無法訪問.html.jsp.js.css靜態資源時的解決方案

在web應用中,我們在web.xml配置URL路徑問題時,經常這樣配置:<servlet-mapping> <servlet-name>spring-MVC</servlet-name> <url-pattern>/<

web專案中url-pattern改成'/'後,jscss圖片等靜態資源(404)無法訪問問題解決辦法

1、增加靜態資源url對映 如Tomcat, Jetty, JBoss, GlassFish容器可以這樣定義 (注意一定要在所有servlet之前定義該類對映): <servlet-mapp