使用gulp將js css合併壓縮成單個文件,並自動化打包及靜態文件自動添加版本號

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

相關文章
相關標籤/搜索