gulp自動化打包及靜態文件自動添加版本號

来源:http://www.cnblogs.com/hutuzhu/archive/2016/03/14/5276000.html
-Advertisement-
Play Games

前端自動化打包發佈已是一種常態,尤其在移動端,測試過程中靜態資源的緩存是件很頭疼的事情,有時候明明處理的bug測試還是存在,其實就是緩存惹的禍,手機不比pc瀏覽器,清理緩存還是有點麻煩的。所以自動化實現靜態資源的版本更新才是正道。 實際開發過程中,我們常用到的功能包括: 1、目標路徑的清除; 2、靜


前端自動化打包發佈已是一種常態,尤其在移動端,測試過程中靜態資源的緩存是件很頭疼的事情,有時候明明處理的bug測試還是存在,其實就是緩存惹的禍,手機不比pc瀏覽器,清理緩存還是有點麻煩的。所以自動化實現靜態資源的版本更新才是正道。

實際開發過程中,我們常用到的功能包括:

1、目標路徑的清除;

2、靜態資源複製到目標路徑;

3、css文件的合併與壓縮;

4、js文件的合併與壓縮;

5、根據文件的變化添加版本號;

第1、2、3、4幾個功能倒是很好解決,今天主要說說gulp實現靜態資源自動添加版本號;

搜了不少資料,發現都不是想要的,我希望實現的效果是:

<script type="text/javascript" src="../../scripts/app_common.js?v=51921f3"></script>

但是大部分插件實現的效果類似下麵,而且看起來很麻煩

<script type="text/javascript" src="../../scripts/app_common-51921f3.js"></script>

這樣會導致一個問題,每次都會生成新的文件,而且必須同時修改html的引用。

下麵說說我的解決方案:

這是目錄結構,不同的結構可能在處理上會有些不同。

用到的gulp插件是:gulp-asset-rev

先下載插件: npm install --save-dev gulp-asset-rev

Example:

var gulp = require('gulp');
var assetRev = require('gulp-asset-rev');
 
gulp.task('rev',['revCss'],function() {
    gulp.src("./test/test.html")
        .pipe(assetRev())
        .pipe(gulp.dest('./dest'));
});
 
gulp.task('revCss',function () {
    return gulp.src('./test/styles/test.css')
        .pipe(assetRev())
        .pipe(gulp.dest('./dest/styles/'))
});
gulp.task('default',['rev']);

使用前:

<html lang="en">
<head>
    <meta charset="utf-8"/>
    <title></title>
    <link rel="stylesheet" href="./styles/test.css" type="text/css" />
</head>
<body>
    <div>
        <img src="./images/test.png" />
    </div>
    <script src="./scripts/test.js" type="text/javascript"></script> 
</body>
</html>

使用後:

<html lang="en">
<head>
    <meta charset="utf-8"/>
    <title></title>
    <link rel="stylesheet" href="./styles/test_0ede2cf.css" type="text/css" />
</head>
<body>
    <div>
        <img src="./images/test_25cf2b4.png" />
    </div>
    <script src="./scripts/test_8ced4e6.js" type="text/javascript"></script> 
</body>
</html>

很顯然它把整個文件名都給改了,不符合我們之前只在文件後面添加版本號參數的需求。我們可以在源文件中做點手腳。

找到node_modules --> gulp-assets-rev -->index.js 修改為如下代碼:

var verStr = (options.verConnecter || "") + md5;
    src=src+"?v="+verStr;

實際上MD5人家都已經算好了,最後只是拼湊了顯示方式,所以我們可以按照自己的需求去組合就行了。so easy~

完整配置如下:

package.json

{
  "name": "StagingFinancial",
  "version": "0.0.1",
  "description": "Pages for Staging Financial App",
  "devDependencies": {
    "browser-sync": "*",
    "del": "*",
    "gulp": "*",
    "gulp-asset-rev": "*",
    "gulp-concat": "*",
    "gulp-if": "*",
    "gulp-jshint": "*",
    "gulp-load-plugins": "*",
    "gulp-minify-css": "^*",
    "gulp-minify-html": "*",
    "gulp-sass": "*",
    "gulp-size": "*",
    "gulp-sourcemaps": "*",
    "gulp-uglify": "*",
    "gulp-useref": "*",
    "run-sequence": "*"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "private": true
}

都是些常用的插件,gulp總共就5個API介面,但是插件是異常強大,可根據需求自己配置。

var gulp = require('gulp');
var $ = require('gulp-load-plugins')();
var del = require('del');
var runSequence = require('run-sequence');
var assetRev = require('gulp-asset-rev');

function gulpScripts(app_name) {
    return gulp.src([app_name + '/**/*.js']) //源文件下的所有js
        .pipe(assetRev())                    //配置版本號
        .pipe($.uglify())                    //進行壓縮,如果需要合併也可加上合併的代碼
        .pipe(gulp.dest(app_name + "_dist"));//複製到目標文件路徑
}

function gulpStyles(app_name) {
    return gulp.src([app_name + '/**/*.css'])
        .pipe(assetRev())
        .pipe($.minifyCss())
        .pipe(gulp.dest(app_name + "_dist"));
}

function gulpImages(app_name) {
    return gulp.src([app_name + '/**/images/*']) 
        .pipe(gulp.dest(app_name + "_dist"));   //複製所有圖片到目標文件夾
}

function gulpRevHtml(app_name) {
    gulp.src([app_name + '/*.html', app_name + '/**/*.html'])   //源文件下麵是所有html
        .pipe(assetRev())                                       //配置引用的js和css文件,需要的話也可以用minifyHtml壓縮html文件
        .pipe(gulp.dest(app_name + '_dist'));                   //打包到目標文件夾路徑下麵
}

gulp.task('app_scripts', function(){
    gulpScripts("app");
});
gulp.task('app_styles', function(){
    gulpStyles("app");
});
gulp.task('app_images',function(){
     gulpImages("app");
});
gulp.task('app_rev', ['app_styles', 'app_scripts'], function(){
    gulpRevHtml("app");
});
gulp.task('clean', del.bind(null, ['app_dist'], {
    force: true
}));
gulp.task("beike", function() {
    runSequence('clean', ["app_images", "app_rev"]);
});

因為同一個目錄下有別的項目,所以這裡寫成了函數,輸入不同名稱打包到不同目標文件。

結果就是:

打包後引用的靜態資源文件分別如下,如果修改了某個文件,參數會發生變化,如果沒有修改,則不發生變化:

<link rel="stylesheet" type="text/css" href="../../styles/common.css?v=a8aacfb">
<script type="text/javascript" src="../../scripts/app_common.js?v=51921f3"></script>
background:url(../images/none.png?v=8f204d4)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 以下內容為原創,歡迎轉載,轉載請註明 來自天天博客: 一個乾凈的架構 原文: 在過去幾年中我們能看到的一系列關於系統架構的思想。它們包括: [Hexagonal Architecture](也稱為 ),作者是 Alistair Cockburn,並被 Steve Freeman 和 Nat Pryc
  • 最近看了《head first 設計模式》一書,便總結了裡面的一些內容,今天就簡單介紹一下策略模式。 策略模式:定義了演算法族,分別封裝起來,讓他們能夠相互替換,此模式讓演算法的變化獨立於使用演算法的客戶。簡單來說,就是將各個演算法分別封裝起來,使得他們能夠互換。 下麵是策略模式的示例結構圖:   策略模式
  • 有時候項目閑下來想休息的時候會跑跑艦c遠征,但計時比較麻煩。 所以每個現場都會寫那麼幾個工具。以前是vba的,這次寫了個HTML的,感覺還算易用就仍上來了。省得以後換現場還得再寫。 純粹是偷懶時做的,各種不符合規範請無視吧。
  • 之前寫的四則運算1.0版,現在繼續擴充 : 《四則運算》題目的功能,要求: 題目避免重覆;可以定製數量和列印方式; 可以控制下列參數 (1) 是否有乘除法 (2) 是否有括弧 (3) 數值範圍 (4) 加減有無負數 (5) 除法有無餘數 (6) 是否支持分數(真分數、假分數…) (7) 是否支持小數
  • jQuery設置checkbox全選在網上有各種文章介紹,但是為什麼在我們用他們的代碼的時候就沒有效果呢? 如果你的代碼一點錯誤都沒有,先不要急著懷疑人家代碼的正確性,也許只是人家跟你用的jQuery版本不同而已。 jQuery很多版本都會對一些小的功能做一些改進,比如checkbox的選中。 jQ
  • 我們知道Node.js框架下的Buffer對象能夠對二進位數據提供很好的支持,那麼獲取一個Buffer對象真實的位元組長度則是必須要用到的功能了。Node.js框架為開發人員提供了一個Buffer.byteLength()方法,下麵我們藉助一個官方文檔提供的常式向讀者演示一下該方法的使用過程。
  •     jQuery獲取Select選擇的Text和Value:語法解釋:1. $("#select_id").change(function(){//code...});   //為Select添加事件,當選擇其中一項時觸發2. var checkText=$("#select_id").find
  • 1、搜索時,文本框的內容一般去掉前後空格 (1)引用jquery時直接用$.trim() 方法即可 (2)無jquery庫時要用正則判斷 function trim(str){ //刪除左右兩端的空格      return str.replace(/(^\s*)|(\s*$)/g, ""); }
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...