1. 程式人生 > >使用gulp對引用的檔案新增版本號

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

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

gulpfile.js

var gulp = require('gulp');
var uglify = require('gulp-uglify');
var concat = require('gulp-concat');                    //- 多個檔案合併為一個;
var minifyCss = require('gulp-minify-css'); //- 壓縮CSS為一行; var rev = require('gulp-rev'); //- 對檔名加MD5字尾 var revCollector = require('gulp-rev-collector'); //- 路徑替換 var del = require('del'); var smushit = require('gulp-smushit'); //圖片壓縮 gulp.task('concatcss'
, function() { //- 建立一個名為 concat 的 task gulp.src(['./src/css/*.css']) gulp.src([ './src/css/self/*.css']) // .pipe(concat('wrap.min.css')) //- 合併後的檔名 .pipe(minifyCss()) //- 壓縮處理成一行 .pipe(rev()) //- 檔名加MD5字尾
.pipe(gulp.dest('./bushu/css/self')) //- 輸出檔案本地 .pipe(rev.manifest()) //- 生成一個rev-manifest.json .pipe(gulp.dest('./revcss')); //- 將 rev-manifest.json 儲存到 rev 目錄內 }); gulp.task('revcss', function() { gulp.src(['./revcss/*.json', './src/**.html']) //- 讀取 rev-manifest.json 檔案以及需要進行css名替換的檔案 .pipe(revCollector()) //- 執行檔案內css名的替換 .pipe(gulp.dest('./bushu')); //- 替換後的檔案輸出的目錄 }); gulp.task('revmanifestcss', function() { gulp.src(['./revcss/*.json', './src/**.manifest']) //- 讀取 rev-manifest.json 檔案以及需要進行css名替換的檔案 .pipe(revCollector()) //- 執行檔案內css名的替換 .pipe(gulp.dest('./bushu')); //- 替換後的檔案輸出的目錄 }); gulp.task('concatjs', function() { //- 建立一個名為 concat 的 task gulp.src(['./src/css/*.css']) gulp.src([ './src/js/self/*.js']) // .pipe(concat('wrap.min.css')) //- 合併後的檔名 .pipe(uglify()) //- 壓縮處理成一行 .pipe(rev()) //- 檔名加MD5字尾 .pipe(gulp.dest('./bushu/js/self')) //- 輸出檔案本地 .pipe(rev.manifest()) //- 生成一個rev-manifest.json .pipe(gulp.dest('./revjs')); //- 將 rev-manifest.json 儲存到 rev 目錄內 }); gulp.task('revjs', function() { gulp.src(['./revjs/*.json', './bushu/*.html']) //- 讀取 rev-manifest.json 檔案以及需要進行js名替換的檔案 .pipe(revCollector()) //- 執行檔案內css名的替換 .pipe(gulp.dest('./bushu')); //- 替換後的檔案輸出的目錄 }); /*壓縮圖片且新增MD5字尾*/ gulp.task('concatimg', function () { return gulp.src('src/imgs/**') //讀取的圖片位置 .pipe(smushit({ verbose: true })) .pipe(rev()) .pipe(gulp.dest('bushu/imgs')) //輸出圖片的位置。 .pipe(rev.manifest()) .pipe(gulp.dest('./revimgs')); //輸出JSON檔案的位置 }); /*html檔案圖片MD5資源改變*/ gulp.task('revimghtml', function () { gulp.src(['./revimgs/*.json', './bushu/*.html']) //- 讀取 rev-manifest.json 檔案以及需要進行html替換的檔案 .pipe(revCollector()) //- 執行檔案內html名的替換 .pipe(gulp.dest('./bushu')); //- 替換後的檔案輸出的目錄 }); /*css檔案圖片MD5資源改變*/ gulp.task('revimgcss', function () { gulp.src(['./revimgs/*.json', './bushu/css/self/*.css']) //- 讀取 rev-manifest.json 檔案以及需要進行js名替換的檔案 .pipe(revCollector()) //- 執行檔案內css名的替換 .pipe(gulp.dest('./bushu/css/self')); //- 替換後的檔案輸出的目錄 }); gulp.task('clean', function (cb) { del([ // 這裡我們使用一個通配模式來匹配 資料夾中的所有東西 'bushu/member/*', 'bushu/project/*', 'bushu/css/self/*', 'bushu/js/self/*', // 我們不希望刪掉這個檔案,所以我們取反這個匹配模式 /*'!bushu/css/self/base.css', '!bushu/css/self/base.less', '!bushu/css/self/person.css', '!bushu/css/self/person.less', '!bushu/js/self/base.js',*/ ], cb); }); /* gulp.task('smushit', function () { return gulp.src('src/imgs/*')//壓縮圖片路徑 .pipe(smushit({ verbose: true })) .pipe(gulp.dest('dist')); });*/

這裡面有許許多多的坑,已經被我全部踩過一次了,並找到避開的方法,只是可能不會太優雅,僅供參考。
思路如下:
(1)檔案目錄結構。
這裡寫圖片描述
src資料夾為原始檔。bushu資料夾為部署資料夾,也就是生成的各種檔案放置的地方。原始檔和部署檔案隔離開來應該會方便不少。
在src目錄下源html檔案長這樣。
這裡寫圖片描述

(2)在新增版本號之前,將以前的版本檔案全部刪除。我這裡是用了clean(名字是自己取的,根據個人習慣更改。),可以使用'!src/css/editor.css' 等對某些檔案取反,把不想改變的留住。其他的刪除。

(3)使用concatcss對CSS檔案壓縮並加字尾,同時在根目錄下的revcss檔案內得到該JSON檔案(裡面的具體目錄可以根據個人需求改變。)。
這裡寫圖片描述

(4)使用revcss進行對具體html檔案的替換,把html檔案輸出到新的位置,我是將其輸出到根目錄。這裡有個坑,不能輸出到原本所在的位置,也就是這裡的二級目錄,將原本的html檔案覆蓋。後面會講到。現在的html檔案長這樣,可以看到,已經暫時達到了我們所需要的效果。
這裡寫圖片描述
(5)使用concatjs對JS檔案壓縮並加字尾。同時在根目錄下的revjs檔案內得到對應JSON檔案(裡面的具體目錄可以根據個人需求改變。)

(6)使用revjs對第(4)步生成的html檔案進行替換。注意!!這裡是將新生成的那個html檔案進行替換(當然可以是批量的)。這樣,最終的這個html檔案就是我們所得。
這裡寫圖片描述

裡面的圖片壓縮更改也是一樣,重複步驟5,6即可。只是要特別注意也要在css或者js檔案裡改變對應的資源索引。

(7)把這些html檔案都放回自己原本所在的位置就可以跑起來了。

下面是我遇到的坑:
坑1:為什麼要使用clean。如果你生成路徑和原始檔路徑是一樣的話,會導致以下問題:外掛不會幫你清除以往版本的檔案。如果沒有清除以往的版本,在下一次使用concatcss時,它會以你的版本檔案作為模板進行對映,導致這種情況:
這裡寫圖片描述
你也可以和我一樣將部署檔案和原始檔分開,這樣也不會導致上面這種問題。但開始管理的時候最好還是把部署檔案以往的版本檔案刪掉比較好。

坑2:為什麼不能讓新輸出的html檔案覆蓋掉,也是會導致上面這種情況。

坑3:css檔案或者js檔案要有具體變化版本號才會改變,做DEMO時要注意。這也是這裡面的外掛一大優點,這樣可以留住沒有改變的快取檔案,使用者進行訪問時可以快速讀出。

坑4:JS和CSS的JSON要為他們建立不同的資料夾。不然他們會相互覆蓋。

坑5:如果使用以上辦法,步驟一定要對,因為task高度依賴前後task。最好是串起來,一次性執行。

坑6:使用gulp構建時,最好是最後一步才為他們新增版本號,以免後續踩到更多的坑。

坑8:使用clean時,一定一定要把自己原本的檔案放進取反列表裡,不然刪除了就很麻煩了(起碼我在回收站裡找不到)。

列出刪除檔案需要安裝的外掛:

/*clean*/
$ npm install --save-dev gulp del

其餘的外掛看gulpfile.js頭部逐一安裝即可。

當然,上面的外掛比如JQ應該放入另外一個資料夾裡面,由於是DEMO我就沒有改過來。這個自己注意一下就好了。
以上方法僅供參考。

相關推薦

使用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

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

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

gulp給專案檔案更換版本

一、安裝依賴 建立nodejs配置檔案package.json npm init -y 檔案目錄下就會生成package.json 檔案 編輯該檔案,檔案內容大致入戲 { "name": "test", "version": "1.0.0", "desc

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

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

修復BUG:gulp自動新增版本修復CSS中background:url()的匹配問題

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

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

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

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

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

gulp自動新增版本

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

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

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

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

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

Gulp開發:Gulp自動新增版本

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

vue 用webpack打包檔名新增版本

因瀏覽器快取原因導致vue 打包的檔案 導致偶爾會出現不能即使更新最新程式碼。因此在打包的檔名中新增一個版本號以便瀏覽器能區分。 解決方法:找到webpack .prod.conf.js    1.定義版本變數: const  Version

linux 程式、動態庫、靜態庫內部新增版本和編譯時間

給程式和庫新增版本號和庫,有利於維護和升級。 當然你可以在檔名上體現,比如有個程式叫 yun,檔名寫為 yun_1.0.2,但這個需要每次手動維護,而且不能100%確保當前程式就是那個版本。所以,把版本號體現在程式內部,是一個不錯的選擇。 --------------------------

為 Laravel Mix 編譯的 JavaScript 和 CSS 檔案版本

加版本號,什麼意思?我們來看 Github 網頁原始碼中是怎樣引入 JavaScript 和 CSS 檔案的。 <link crossorigin="anonymous" href="https://assets-cdn.github.com/assets

為什麼在Spring的配置裡,最好不要配置xsd檔案版本

為什麼dubbo啟動沒有問題? 這篇blog源於一個疑問: 我們公司使了阿里的dubbo,但是阿里的開源網站http://code.alibabatech.com,掛掉有好幾個月了,為什麼我們的應用啟動沒有問題? 我們的應用的Spring配置檔案裡有類似的配置: <

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

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

seajs新增版本重新整理本地快取的方法

1、為什麼? 由於每次上傳js檔案到伺服器後用戶本機存在本地快取,導致使用者需要強制清除快取或者等待快取失效才能使用新功能,極其不友好。 2、原理 seajs配置引數中有map屬性為檔案對映功能,其作用是通過seajs載入的檔案對映為一個新的名稱載入,形如

給JS與CSS檔案版本

有時候剛釋出的檔案可能會存在快取,最常見的是JS與CSS檔案無法及時更新 所以需要給這些檔案加一個版本號解決 <link rel="stylesheet" type="text/css" href="~/Content/static/system/css/[email p

CSS和js自動新增版本

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

vue.js編譯時給生成的檔案增加版本

    vue.js在生成相關js和css檔案的時候,名稱是通過HASH的方式進行生成的,但是每次生成的檔案基本都是一樣的,那麼瀏覽器就會快取這些檔案,為了在更新的時候能夠保證js和css檔案能夠更新,那麼我們需要針對webpack的配置檔案進行修改;開啟webpack.pr