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


前端自動化打包發布已是一種常態,尤其在移動端,測試過程中靜態資源的緩存是件很頭疼的事情,有時候明明處理的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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM