前端自動化打包發佈已經是一種常態,尤爲在移動端,測試過程當中靜態資源的緩存是件很頭疼的事情,有時候明明處理的bug測試仍是存在,其實就是緩存惹的禍,手機不比pc瀏覽器,清理緩存仍是有點麻煩的。因此自動化實現靜態資源的版本更新纔是正道。javascript
實際開發過程當中,咱們經常使用到的功能包括:css
一、目標路徑的清除;html
二、靜態資源複製到目標路徑;前端
三、css文件的合併與壓縮;java
四、js文件的合併與壓縮;node
五、根據文件的變化添加版本號;npm
第一、二、三、4幾個功能卻是很好解決,今天主要說說gulp實現靜態資源自動添加版本號;json
搜了很多資料,發現都不是想要的,我但願實現的效果是: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:
1 var gulp = require('gulp'); 2 var assetRev = require('gulp-asset-rev'); 3 4 gulp.task('rev',['revCss'],function() { 5 gulp.src("./test/test.html") 6 .pipe(assetRev()) 7 .pipe(gulp.dest('./dest')); 8 }); 9 10 gulp.task('revCss',function () { 11 return gulp.src('./test/styles/test.css') 12 .pipe(assetRev()) 13 .pipe(gulp.dest('./dest/styles/')) 14 }); 15 gulp.task('default',['rev']);
使用前:
1 <html lang="en"> 2 <head> 3 <meta charset="utf-8"/> 4 <title></title> 5 <link rel="stylesheet" href="./styles/test.css" type="text/css" /> 6 </head> 7 <body> 8 <div> 9 <img src="./images/test.png" /> 10 </div> 11 <script src="./scripts/test.js" type="text/javascript"></script> 12 </body> 13 </html>
使用後:
1 <html lang="en"> 2 <head> 3 <meta charset="utf-8"/> 4 <title></title> 5 <link rel="stylesheet" href="./styles/test_0ede2cf.css" type="text/css" /> 6 </head> 7 <body> 8 <div> 9 <img src="./images/test_25cf2b4.png" /> 10 </div> 11 <script src="./scripts/test_8ced4e6.js" type="text/javascript"></script> 12 </body> 13 </html>
很顯然它把整個文件名都給改了,不符合咱們以前只在文件後面添加版本號參數的需求。咱們能夠在源文件中作點手腳。
找到node_modules --> gulp-assets-rev -->index.js 修改成以下代碼:
1 var verStr = (options.verConnecter || "") + md5; 2 src=src+"?v="+verStr;
實際上MD5人家都已經算好了,最後只是拼湊了顯示方式,因此咱們能夠按照本身的需求去組合就好了。so easy~
完整配置以下:
package.json
1 { 2 "name": "StagingFinancial", 3 "version": "0.0.1", 4 "description": "Pages for Staging Financial App", 5 "devDependencies": { 6 "browser-sync": "*", 7 "del": "*", 8 "gulp": "*", 9 "gulp-asset-rev": "*", 10 "gulp-concat": "*", 11 "gulp-if": "*", 12 "gulp-jshint": "*", 13 "gulp-load-plugins": "*", 14 "gulp-minify-css": "^*", 15 "gulp-minify-html": "*", 16 "gulp-sass": "*", 17 "gulp-size": "*", 18 "gulp-sourcemaps": "*", 19 "gulp-uglify": "*", 20 "gulp-useref": "*", 21 "run-sequence": "*" 22 }, 23 "engines": { 24 "node": ">=0.10.0" 25 }, 26 "private": true 27 }
都是些經常使用的插件,gulp總共就5個API接口,可是插件是異常強大,可根據需求本身配置。
1 var gulp = require('gulp'); 2 var $ = require('gulp-load-plugins')(); 3 var del = require('del'); 4 var runSequence = require('run-sequence'); 5 var assetRev = require('gulp-asset-rev'); 6 7 function gulpScripts(app_name) { 8 return gulp.src([app_name + '/**/*.js']) //源文件下的全部js 9 .pipe(assetRev()) //配置版本號 10 .pipe($.uglify()) //進行壓縮,若是須要合併也可加上合併的代碼 11 .pipe(gulp.dest(app_name + "_dist"));//複製到目標文件路徑 12 } 13 14 function gulpStyles(app_name) { 15 return gulp.src([app_name + '/**/*.css']) 16 .pipe(assetRev()) 17 .pipe($.minifyCss()) 18 .pipe(gulp.dest(app_name + "_dist")); 19 } 20 21 function gulpImages(app_name) { 22 return gulp.src([app_name + '/**/images/*']) 23 .pipe(gulp.dest(app_name + "_dist")); //複製全部圖片到目標文件夾 24 } 25 26 function gulpRevHtml(app_name) { 27 gulp.src([app_name + '/*.html', app_name + '/**/*.html']) //源文件下面是全部html 28 .pipe(assetRev()) //配置引用的js和css文件,須要的話也能夠用minifyHtml壓縮html文件 29 .pipe(gulp.dest(app_name + '_dist')); //打包到目標文件夾路徑下面 30 } 31 32 gulp.task('app_scripts', function(){ 33 gulpScripts("app"); 34 }); 35 gulp.task('app_styles', function(){ 36 gulpStyles("app"); 37 }); 38 gulp.task('app_images',function(){ 39 gulpImages("app"); 40 }); 41 gulp.task('app_rev', ['app_styles', 'app_scripts'], function(){ 42 gulpRevHtml("app"); 43 }); 44 gulp.task('clean', del.bind(null, ['app_dist'], { 45 force: true 46 })); 47 gulp.task("beike", function() { 48 runSequence('clean', ["app_images", "app_rev"]); 49 });
由於同一個目錄下有別的項目,因此這裏寫成了函數,輸入不一樣名稱打包到不一樣目標文件。
結果就是:
打包後引用的靜態資源文件分別以下,若是修改了某個文件,參數會發生變化,若是沒有修改,則不發生變化:
1 <link rel="stylesheet" type="text/css" href="../../styles/common.css?v=a8aacfb"> 2 <script type="text/javascript" src="../../scripts/app_common.js?v=51921f3"></script> 3 background:url(../images/none.png?v=8f204d4)
原文地址:http://www.cnblogs.com/hutuzhu/p/5276000.html