Gulp實現css、js、圖片的壓縮以及css、js文件的MD5命名


目前做代碼壓縮合並的工具有很多,諸如gulpwebpackgrunt等等,可以說這些項目構建工具的功能非常之強大:圖片壓縮、圖片轉base64cssjs的壓縮以及合並,文件的md5重命名 ……。本人之前也是在項目中沒具體使用過,閑來無事,查查資料,自己寫了一個用gulp工具的小demo,有很多不足之處,歡迎指點

  需要購買阿里雲產品和服務的,點擊此鏈接領取優惠券紅包,優惠購買哦,領取后一個月內有效: https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=fp9ccf07

第一步:安裝nodenpm

不用說,要用gulp,得先安裝nodenpm(安裝完node后,自帶有npm

Node官網下載地址:https://nodejs.org/en/download/(具體怎么安裝請自行查資料)

第二步:安裝需要的插件

使用npm安裝需要的插件(命令后面加 -g 表示全局安裝,加 --save-dev 只安裝到當前項目)

由於當前項目要使用,所以這些插件必須得安裝到本項目中

安裝命令如下:

npm init     //- 會生成一個package.json文件
npm install gulp --save-dev     //- gulp插件的核心
npm install gulp-minify-css --save-dev     //- 壓縮CSS文件
npm install gulp-rev --save-dev         //- 對css、js文件名加MD5后綴
npm install gulp-rev-collector --save-dev   //- 路徑替換
npm install gulp-clean --save-dev            //- 用於刪除文件
npm install gulp-uglify --save-dev            //- 壓縮js代碼
npm install gulp-imagemin --save-dev      //- 壓縮圖片
npm install gulp-base64 --save-dev        //- 把小圖片轉成base64字符串

安裝完畢之后,會在項目中生成一個node_moudles目錄,所有的插件全部在該目錄下。

 

第三步:構建項目目錄結構以及編寫項目代碼

本例代碼只用做測試而已,目錄結構以及代碼是我隨意寫的

我的目錄結構,如下圖:(目錄沒有全部展開)

 

目前index.html文件中的cssjs的引用路徑是這樣的,如下圖:

 

其他目錄下的html文件也是這樣的,都引用的是未壓縮和md5命名的cssjs文件。

第四步:創建一個gulpfile.js文件,該文件和node_modules文件夾平級

gulpfile.js文件內容如下:

gulpfile.js:

var gulp = require('gulp');
var concat = require('gulp-concat');                //- 多個文件合並為一個;
var minifyCss = require('gulp-minify-css');         //- 壓縮CSS文件;
var rev = require('gulp-rev');                      //- 對css、js文件名加MD5后綴
var revCollector = require('gulp-rev-collector');   //- 路徑替換
var clean = require('gulp-clean');                  //- 用於刪除文件
var uglify = require('gulp-uglify');                //- 壓縮js代碼
var imagemin = require('gulp-imagemin');            //- 壓縮圖片
var base64 = require('gulp-base64');                //- 把小圖片轉成base64字符串
var q = require('q');                               //- 用於解決任務執行順序的問題(一個任務執行完畢才執行另外一個任務)(暫時還沒用到)

/*清理文件*/
gulp.task('clean',function () {                     //刪除dist目錄下的所有文件
    gulp.src('dist/*',{read:false})
        .pipe(clean());
});

/*壓縮js文件,並生成md5后綴的js文件*/
gulp.task('compress-js',function (callback) {       //- 創建一個名為compress-js的task
    gulp.src(['webContent/js/**/*.js'])             //- 需要處理的js文件,放到一個字符串數組里
        .pipe(uglify())                             //- 壓縮文件
        .pipe(rev())                                //- 文件名加MD5后綴
        .pipe(gulp.dest('dist/js'))                 //- 另存壓縮后的文件
        .pipe(rev.manifest())                       //- 生成一個rev-manifest.json
        .pipe(gulp.dest('rev-js'))                  //- 將rev-manifest.json保存到 rev-js 目錄內
        .on('end',function () {
            console.log('compress-js has been completed');
            callback();
        });
});

/*壓縮css文件,並生成md5后綴的css文件*/
gulp.task('compress-css', function(callback) {      //- 創建一個名為compress-css的task
    gulp.src(['webContent/css/**/*.css'])           //- 需要處理的css文件,放到一個字符串數組里
        // .pipe(concat('css/wap.min.css'))         //- 合並后的文件名
        .pipe(minifyCss())                          //- 壓縮處理成一行
        .pipe(rev())                                //- 文件名加MD5后綴
        .pipe(gulp.dest('dist/css'))                //- 輸出文件到dist/css目錄下
        .pipe(rev.manifest())                       //- 生成一個rev-manifest.json
        .pipe(gulp.dest('rev-css'))                 //- 將rev-manifest.json保存到rev-css目錄內
        .on('end',function () {
            console.log('compress-css has been completed');
            callback();
        });
});

/*修改html文件的link標簽和script標簽引用的css和js文件名,並把html文件輸出到指定的位置*/
gulp.task('rev-html',['compress-css','compress-js'], function() {          //- compress-css和compress-js任務執行完畢再執行rev-index任務
    /*修改index.html文件的link標簽和script標簽引用的css和js文件名,並把html文件輸出到指定的位置*/
    gulp.src(['rev-css/*.json','rev-js/*.json', 'webContent/index.html'])   //- 讀取兩個rev-manifest.json文件以及需要進行css和js名替換的html文件
        .pipe(revCollector())                                               //- 執行文件內css和js名的替換
        .pipe(gulp.dest('dist/'));                                          //- 替換后的html文件輸出的目錄

    /*修改其它html文件的link標簽和script標簽引用的css和js文件名,並把html文件輸出到指定的位置*/
    gulp.src(['rev-css/*.json','rev-js/*.json', 'webContent/views/**/*.html'])     //- 讀取兩個rev-manifest.json文件以及需要進行css和js名替換的html文件
        .pipe(revCollector())                                                      //- 執行文件內css和js名的替換
        .pipe(gulp.dest('dist/views'));                                            //- 替換后的html文件輸出的目錄
});

/*壓縮並復制圖片*/
gulp.task('compress-img',function () {
    gulp.src('webContent/images/**/*.*')    //原圖片的位置
        .pipe(imagemin())                   //執行圖片壓縮
        .pipe(gulp.dest('dist/images'));    //壓縮后的圖片輸出的位置
});

/*最終執行的任務-css*/
gulp.task('rev',['rev-html','compress-img']);

//***********************************************************************************************

//命令行順序: clean, rev

第五步:運行gulp命令

運行如下命令:gulp rev

運行完該命令后會生成以下三個目錄:distrev-cssrev-js。其中dist目錄下就是新的html文件、css文件、js文件和圖片,目錄和之前的webContent目錄下的結構是一樣的。

運行完命令后的項目整體結構如下:

 

WebContent目錄的結構和dist目錄的結構是一樣的,如下:

             

 

所有的cssjs文件都加了md5命名了,所有的圖片體積也小了,但用肉眼看不出來圖片質量有變化。 

此時dist目錄下所有的html文件引用的cssjs的引用路徑都變成帶有md5命名的了。例如index.html,見下圖

 

此時dist目錄下的東西就是我們可以上線的文件了。(當然還有很多不完善的地方,還有很多缺陷,畢竟個人知識能力有限。)

第六步:代碼的改動

如果后續代碼有改動的話,執行一次gulp clean命令,再執行一次gulp rev 命令:

gulp clean命令就可以把dist目錄下生成的所有文件全部刪除,gulp rev命令會根據新的代碼重新生成所有文件到dist目錄下。

命令截圖如下:

 

另外本來也想在本例中使用圖片轉成base64,可是一直沒成功解決。如果哪位大神有知道的,還望能在評論區給個鏈接,讓我也學習學習。

說明:由於本人知識有限,才接觸gulp不久,只能實現這樣一些功能,肯定還有很多不足的地方,還有很多需要不斷完善優化的地方以及很多還不知道的功能,。或許在稍微大型一點的項目中也不知會不會出現問題。所有的這一切,包括其他工具的使用等等,都需要后續的繼續努力學習。


免責聲明!

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



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