1. 程式人生 > >gulp-rev:專案部署快取解決方案

gulp-rev:專案部署快取解決方案

引言:

  前端工程化部署比較重要考慮的一個問題是快取 ,可以參考 變態的靜態資源快取與更新》

  使用gulp-rev解決的就是變態的靜態資源快取與更新》提出的問題。

rev會做什麼:

  根據靜態資源內容,生成md5簽名,打包出來的檔名會加上md5簽名,同時生成一個json用來儲存檔名路徑對應關係。

     替換html裡靜態資源的路徑為帶有md5值的檔案路徑,這樣html才能找到資源路徑。比較重要的一點:靜態伺服器需要配置靜態資源的過期時間為永不過期。

達到什麼效果:

  靜態資源只需請求一次,永久快取,不會發送協商請求304

  版本更新只會更新修改的靜態資源內容

  不刪除舊版本的靜態資源,版本回滾的時候只需要更新html,同樣不會增加http請求次數

     

配置:

  在系列(五)程式碼的基礎上,再進行擴充套件。

1.安裝

npm install --save-dev gulp-rev 
npm install --save-dev gulp-rev-collector
npm install --save-dev gulp-sync

gulp-sync 處理任務非同步

2.找到gulp->config.js,配置rev,配置css和js的revJson輸出地址:

複製程式碼
/* gulp命令會由gulpfile.js執行,所以src和build資料夾路徑如下(根目錄下) */
var src = './src';     
var dest = './build';  

module.exports = {
    less: {
        all: src + "/less/**/*.less", //所有less
        src: src + "/less/*.less",      //需要編譯的less
        dest: dest + "/css",          //輸出目錄
        rev: dest + "/rev/css",
        settings: {                      
//編譯less過程需要的配置,可以為空 } }, images: { src: src + "/img/**/*", dest: dest + "/img" }, js: { src: src + "/js/**/*", dest: dest + "/js", rev: dest + "/rev/js" }, clean:{ src: dest }, rev:{//use rev to reset html resource url revJson: dest + "/rev/**/*.json", src: "*.html",//root index.html dest: "" } }
複製程式碼

3.gulp->tasks裡修改css和js任務,這裡只貼js任務程式碼(css雷同):

複製程式碼
var gulp = require('gulp');
var config = require('../config').js;
var rev = require('gulp-rev');

gulp.task('js', function(){
    return gulp.src(config.src)
        .pipe(rev())  //set hash key
        .pipe(gulp.dest(config.dest))
        .pipe(rev.manifest()) //set hash key json
        .pipe(gulp.dest(config.rev)); //dest hash key json
});
複製程式碼

在輸出檔案之前執行rev(),輸出後的檔案就會生成hash碼,如圖:

 

執行以下兩句會生成一個json,裡面儲存的是檔案原名和生成hash檔名的對應

.pipe(rev.manifest()) //set hash key json

.pipe(gulp.dest(config.rev)); //dest hash key json





4.gulp->tasks裡新建rev任務:

複製程式碼
var gulp = require('gulp');
var config = require('../config').rev;
var rev = require('gulp-rev');
var revCollector = require("gulp-rev-collector");

gulp.task('rev', function () {
    return gulp.src([config.revJson, config.src])
        .pipe( revCollector({
            replaceReved: true,
        }) )
        .pipe( gulp.dest(config.dest) );
});
複製程式碼

config.revJson 是js和css任務生成的檔名對應關係的json,config.src是所有html檔案。

所以revCollector 就是根據檔名對應關係,遍歷所有html,替換檔案命名,替換後如下圖:

至此rev任務就完成了。

 

5.加入gulp-sync:

  更優雅的非同步處理任務還是得加上它。

     把之前的deploy和default任務合併到combo.js裡,並加入gulp-sync

 

當前這個rev任務,只是遍歷html替換靜態資源命名。

所有生成revJson的任務執行完之後,才能執行rev。

 

注意:使用這個快取部署方式需要設定靜態資源伺服器快取永遠不會過期