1. 程式人生 > >使用gulp為專案中的檔案自動新增版本號之實踐思路

使用gulp為專案中的檔案自動新增版本號之實踐思路

需要用到的Gulp外掛:
1、gulp-rev
2、gulp-rev-format
3、gulp-rev-replace

要實現html中增加版本號的效果:
<link rel="stylesheet" href="/Public/css/lib/base.css?v=1478084239"/>
<link rel="stylesheet" href="/Public/css/lib/common.css?v=1478084239"/>
<script src="/Public/js/dist/jquery.js?v=a145s55d44d"></script>
<script src="/Public/js/requirejs/require.js?v=a145s55d44d"></script>

把gulp-rev的配置程式碼粘貼出來,gulp-rev幫我們生成一個版本清單檔案:rev-manifest.json(這個檔名和路徑都是可以在配置裡修改的哦!在這裡我們外掛給我們提供的檔名)
// 生成版本號清單
gulp.task('rev', () => {
  gulp.src(['Public/**/*.*'])
    .pipe($.rev())
    .pipe($.revFormat({
      prefix: '.', // 在版本號前增加字元
      suffix: '.cache', // 在版本號後增加字元
      lastExt: false
    }))
    .pipe($.rev.manifest())
    .pipe(gulp.dest("app/"));
});


$.rev():是蒐集/Public下所有的靜態資原始檔;
$.rev.manifest():把蒐集的到資料儲存到rev-manifest.json檔案裡,儲存位置放到了app資料夾下;
$.revFormat():修改清單檔案裡的版本格式;

修改清單檔案的版本號前程式碼片段:
{
  "admin.js": "admin-2825b6db08.js",
  "app.css": "app-2b10bb06d3.css",
  "app.js": "app-4195b63b87.js",
  "area.js": "area-06366f2832.js",
  "aspect.js": "aspect-6eef3ee475.js",
  "captcha.js": "captcha-a74b9f7786.js",
  "cookie.js": "cookie-0bc8164254.js",
  "data.tpl.js": "data-0020e7582b.tpl.js",
  "download.js": "download-c8dc54cd43.js",
}

修改清單檔案的版本號後代碼片段:
{
  "admin.css": "admin.69cef10fff.cache.css",
  "admin.js": "admin.2825b6db08.cache.js",
  "app.css": "app.2b10bb06d3.cache.css",
  "app.js": "app.4195b63b87.cache.js",
  "area.js": "area.06366f2832.cache.js",
  "aspect.js": "aspect.6eef3ee475.cache.js",
  "captcha.js": "captcha.a74b9f7786.cache.js",
  "cookie.js": "cookie.0bc8164254.cache.js",
  "data.tpl.js": "data.0020e7582b.cache.tpl.js",
  "download.js": "download.c8dc54cd43.cache.js",
}


增了$.revFormat()之後,在清單檔案裡增加了“.cache”字串,他有什麼用呢?


版本清單生成了,接下就是替換檔案中的版本號;
gulp.task('add-version',['rev'], function() {
    var manifest = gulp.src(["./app/rev-manifest.json"]);
    function modifyUnreved(filename) {
      return filename;
    }
    function modifyReved(filename) {
      // filename是:admin.69cef10fff.cache.css的一個檔名
      // 在這裡才發現剛才用gulp-rev-format的作用了吧?就是為了做正則匹配,
      if (filename.indexOf('.cache') > -1) {
	// 通過正則和relace得到版本號:69cef10fff
        const _version = filename.match(/\.[\w]*\.cache/)[0].replace(/(\.|cache)*/g,"");
	// 把版本號和gulp-rev-format生成的字元去掉,剩下的就是原檔名:admin.css
        const _filename = filename.replace(/\.[\w]*\.cache/,"");
	// 重新定義檔名和版本號:admin.css?v=69cef10fff
        filename = _filename + "?v=" + _version;
	// 返回由gulp-rev-replace替換檔名
        return filename;
      }
      return filename;
    }
    gulp.src(['View/**/**.html']) 
      // 刪除原來的版本 
      .pipe($.replace(/(\.[a-z]+)\?(v=)?[^\'\"\&]*/g,"$1")) 
      .pipe($.revReplace({
      manifest: manifest,
      modifyUnreved: modifyUnreved,
      modifyReved: modifyReved
    }))  
    .pipe(gulp.dest('View/'));
});


$.revReplace():是在版本號替換前和替換後都會有呼叫一個函式,


使用$.revReplace()時我們要注意一下第一次替換版本號,和第二次替換版本號是不一樣的;


$.replace():的作用就是把第一次生成的版本號替換掉。舉例說明:
替換前的檔案 
<link rel="stylesheet" href="/Public/css/lib/base.css"/>


第一次替換後的檔案 
<link rel="stylesheet" href="/Public/css/lib/base.css?v=1478084239"/>


第二次替換後的檔案
<link rel="stylesheet" href="/Public/css/lib/base.css?v=1478084239?v=1478084239"/>


所以在替換版本號前先執行一下替換:$.replace(/(\.[a-z]+)\?(v=)?[^\'\"\&]*/g,"$1")


$.replace中包含了“(v=)?”的意思是:在原專案有一些增加了版本號的檔案,不像v=123456這種格式的,如:
<link rel="stylesheet" href="/Public/css/lib/userinfo.css?123647897"/>

所心(v=)?的意思就是匹配零次或一次;

$.replace中包含了“[^\'\"\&]”的意思是:匹配的檔案的結尾是以分號、逗號、&符為分割;如:
匹配到的是:js?123644
<link rel="stylesheet" href="/Public/js/lib/userinfo.js?123644&u=name"/>


匹配到的是空字元
<link rel="stylesheet" href="/Public/js/lib/userinfo.js"/>


匹配到的是空字元
<link rel="stylesheet" href='/Public/js/lib/userinfo.js'/>




完整程式碼把src和dest中的檔案路徑替換一下:

// 生成版本號清單
gulp.task('rev', () => {
  gulp.src(['../assets/**/*.*'])
    .pipe($.rev())
    .pipe($.revFormat({
      prefix: '.',
      suffix: '.cache',
      lastExt: false
    }))
    .pipe($.rev.manifest())
    .pipe(gulp.dest("app/"));
});


gulp.task('add-version',['rev'], function() {
    var manifest = gulp.src(["./app/rev-manifest.json"]);
    function modifyUnreved(filename) {
      return filename;
    }
    function modifyReved(filename) {
      if (filename.indexOf('.cache') > -1) {
        const _version = filename.match(/\.[\w]*\.cache/)[0].replace(/(\.|cache)*/g,"");
        const _filename = filename.replace(/\.[\w]*\.cache/,"");
        filename = _filename + "?v=" + _version;
        return filename;
      }
      return filename;
    }
    gulp.src(['../View/**/**.html']) 
      .pipe($.replace(/(\.[a-z]+)\?(v=)?[^\'\"\&]*/g,"$1")) 
      .pipe($.revReplace({
      manifest: manifest,
      modifyUnreved: modifyUnreved,
      modifyReved: modifyReved
    }))  
    .pipe(gulp.dest('../View/'));
});

本人技術水平有限,如果您有其它解決方案或建議請留言交流!

相關推薦

使用gulp專案檔案自動新增版本實踐思路

需要用到的Gulp外掛:1、gulp-rev2、gulp-rev-format3、gulp-rev-replace要實現html中增加版本號的效果:<link rel="stylesheet" href="/Public/css/lib/base.css?v=14780

前端開發靜態檔案自動新增版本解決方案

前端開發中不可避免的會遇到快取問題,那麼如何使給這些靜態自動給新增版本號使修改後的內容立即生效呢?下面講下我找到的兩種方法: 一、通過獲取檔案最後修改時間 原理:通過伺服器端語言讀取檔案最後一次修改修改時間,然後將獲取的時間作為版本號。 以php為例: <?p

一次專案Gulp的使用(壓縮、新增版本,自動化打包)

一次專案中Gulp的使用 Gulp的準備工作 安裝Gulp 專案中初始化gulp 編寫gulp指令碼 打包結果 拓展 Gulp的準備工作 前段時間接手一個war專案,springmvc 前端

修復BUG:gulp自動新增版本修復對CSSbackground:url()的匹配問題

前天說要找到一個完美的解決方案,今天發動了各路大神,總算是搞定了.問題描述: 修改gulp-rev-append外掛實現自動修改檔案中靜態資源連結新增md5版本號。但是前天有一點點很遺憾,對CSS中background:url()的匹配還存在一點點不足,url()必須帶單引

gulp自動新增版本

1.安裝Gulp npm install --save-dev gulp 2.分別安裝gulp-rev、gulp-rev-collerctor npm install --save-dev gulp-

Gulp開發:Gulp自動新增版本

"/css/style.css" => "/dist/css/style-1d87bebe.css" "/js/script1.js" => "/dist/script1-61e0be79.js" "cdn/image.gif" =>

關於如何在make一個Linux下的C/C++工程時,自動新增版本、編譯日期等資訊

本篇的目的:在makefile裡,將系統當前的時間傳遞進待編譯的C/C++工程中,用以指示編譯執行的時間,以及版本資訊等。 不多說了,先來看效果: 當前時間:2017.01.20  0:29 編譯完成後執行效果: [email protected]:~/Desk

CSS和js自動新增版本

昨天去winy那裡諮詢他網站裡css和js後面版本號的問題,我之所以想加這個功能是因為每次在A電腦修改的樣式或者js到了B電腦上就看不到效果,還得ctrl+f5才能看到,我承認我快取了網站的樣式和js,雖然可以讓使用者把一些常用的很少改動的樣式和js快取到本地,蛋似當我修

VS程式檔案自動新增版權資訊註釋的方法

         現在大多數公司都規定程式設計師在程式檔案的頭部加上版權資訊,這樣每個人寫的檔案都可以區分開來,如果某個檔案出現問題,就可以快速找到檔案的建立人,用最短的時間來解決問題。有些人用複製貼

使用前端構建工具批量頁面引用的js檔案新增版本的歷程

近日遇到有客戶反應,頁面開啟顯示不正常,不能完全的顯示出頁面。細問之下才得知,原來是有一個js檔案修改了一個方法,但是上線後由於瀏覽器快取的原因,還是載入的舊js檔案,導致頁面顯示不正常了。給客戶解釋由於系統更新,需要強制重新整理才可以。這天陸續又有客戶反映遇到此問題,而有

jQuery 實現檔案自動新增序號

附件資訊上傳時,使用者點選刪除操作,對應的序號需要重新排列,可以使用jQuery實現: var index = 1; $("span[name='FileNo']").each(function () {   //對序號列span 的 name 進行迴圈&nbs

【牛腩】——如何檔案自動新增頭註釋?

前言 論如何寫出優秀的程式碼註釋? 寫程式碼和註釋的第一目的是幫助人理解程式碼,理解作者的意圖。所以優秀的程式碼本身就有自說明的功能,但是在程式碼本身無法闡述作者意圖時,需要考慮寫註釋,註釋也是為了為後繼開發者以及程式碼維護者提供了方便。我們知道,寫程式碼要寫註釋,甚至聽

使用gulp對引用的檔案新增版本

cnpm install —-save-dev gulp cnpm install --save-dev gulp del cnpm install gulp-uglify gulp-uglify gulp-minify-css gulp-rev gulp-re

gulp自動化新增版本並修改引數格式

問題: 當我們修改js和css檔案時往往需要清除瀏覽器的快取,否則有些效果就看不到更新過後的。 通過對js,css檔案內容進行hash運算,生成一個檔案的唯一hash字串(如果檔案修改則hash號會

使用gulp進行自動在js檔案後加版本,使在更新的時候不必手動清理快取

原理 如果不是第一次訪問這個網頁,瀏覽器會留下js或css的快取,這對開發人員釋出新版本系統的時候會起到不利影響, 總會叫使用者去清理快取.解決方案是在js或css檔案後面加版本號,如: <script src="src/components/$m

Eclipse 無法自動專案的子專案載入Maven dependencies包而myEclipse可以

在使用Eclipse 編輯Maven2專案的時候 無法為專案中的子類專案自動匯入父專案中依賴的包庫Maven Dependencies 而在使用MyEclipse7.5的時候則可以自動匯入子專案中的依賴的包庫Maven Dependencies 這個問題你可以試試

VS類,函式程式碼自動新增版權註釋資訊

二:VS巨集指令碼新增函式註釋模板 現在的IDE越做越強大,為我等懶人省了不少。為了使用將來的程式碼自己或別人能看懂,註釋這種東西必不可少。當為函式添加註釋時,格式是固定的。每個函式寫一遍,或從別的函式處拷貝過來,即麻煩又容易出錯。這種重複勞動讓人心煩都有不想寫註釋的慾望了,這時VS的巨集可以幹掉這些“髒、

使用 MANIFEST.MF 檔案打包新增版本

在打好的 ear 包中,MANIFEST.MF 檔案會出現在 /META-INF 中,如果沒有可以手動建立,新增以下文字即可 Manifest-Version: 1.0 Weblogic-Application-Version: 8.051

vim建立程式檔案自動新增頭部註釋/自動檔案頭註釋與模板定義

Vim 自動檔案頭註釋與模板定義 在vim的配置檔案.vimrc新增一些配置可以實現建立新檔案時自動新增檔案頭註釋,輸入特定命令可以生成模板。 使用方法 插入模式輸入模式輸入seqlogic[Enter]建立時序邏輯框架 新建立一個檔案 gvim test.c 自動

vs .net專案自動更新版本

使用SVN的一個程式, 一般都會裝,無需再次下載和安裝了. 只需要在專案屬性-> 生成事件-> 後期生成事件命令 中加入 subwcrev.exe $(ProjectDir)Properties\ $(ProjectDir)Properties\AssemblyInfo.