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