自動化前端構建工具--gulp

Gulp是一個基於任務的javascript工程命令行流式構建工具。爲何要用Gulp呢?前端開發進入到工程化階段,咱們須要壓縮合並文件,加MD5戳;若是使用 CoffeeScript/ES6 去代替 Javascript,那麼須要編譯成jacascript;若是使用less或者sass,須要編譯成css。全部的這些操做,在修改文件後,都要從新執行一遍,很是的繁瑣。Gulp就是爲咱們完成這一套重複而機械的工做的。他能夠在自動檢測文件,每次發生修改,自動編譯打包等。javascript

下面介紹用法。css

首先安裝gulp。在桌面新建一個文件夾,進入文件夾中執行npm init。默認安裝便可。這樣幫咱們快速構建一個工程。html

C:\Users\Admin>cd Desktop

C:\Users\Admin\Desktop>mkdir gulpTest

C:\Users\Admin\Desktop>cd gulpTest

C:\Users\Admin\Desktop\gulpTest>npm init

而後在工程目錄下安裝咱們須要的插件:前端

C:\Users\Admin\Desktop\gulpTest>npm install gulp gulp-sass gulp-autoprefixer browser-sync --save-dev

browser-sync插件能夠幫助咱們自動刷新瀏覽器。java

安裝完成後,在gulpTest文件夾下新建一個文件夾app,存放咱們的html等,而後在新建一個文件gulpfile.js。web

接下來就是重點gulpfile怎麼寫了,首先先引入插件:npm

var gulp = require('gulp');
var sass = require('gulp-sass');
var browserSync = require('browser-sync');
var autoperfixer = require('gulp-autoperfixer');

而後建一個browserSync的reload實例:json

var reload = browserSync.reload;

接下來就能夠編寫任務了,舉個例子,修改文件後自動編譯less/sass:gulp

//less編譯任務 
gulp.task('less', function() {   //建立一個gulp任務,任務名字是'less',而後一個回調函數
    return gulp.src(paths)    //gulp任務操做的源文件'paths'
           .pipe(less())         //執行less編譯
           .pipe(gulp.dest('./css'));  //gulp任務輸出的新文件
});
//watch監放任務
gulp.task('watch', function(){   //建立第二個gulp任務,任務名字是‘watch',而後一個回調函數
    gulp.watch(paths,['less']);  //gulp的watch監聽,文件改動後當即從新執行less任務 可參考http://www.gulpjs.com.cn/docs/api/
});
//gulp.watch('default',['less']);
gulp.task('default', ['less','watch']);  //gulp的default任務,至關於glup的執行入口。而後把less任務和watch放進來,該腳本就會執行這兩個任務

 

下面直接貼幾個task代碼:api

1、壓縮css

 

var minifycss = require('gulp-minify-css');//引用插件,需npm install --save-dev gulp-minify-css
gulp.task('minifycss', function() {
return gulp.src('src/css/*.css') //壓縮的文件
.pipe(minifycss()) //執行壓縮
.pipe(gulp.dest('dst/css')); //輸出文件夾
});

 

 

 

2、壓縮js

var concat = require('gulp-concat'),

    uglify = require('gulp-uglify'),

    rename = require('gulp-rename');  //引用插件,需npm install --save-dev xxxxxx

gulp.task('minifyjs', function() {

    return gulp.src('src/*.js')  //操做的源文件

        .pipe(concat('main.js'))    //合併全部js到main.js

        .pipe(gulp.dest('minified/js'))    //輸出main.js到文件夾

        .pipe(rename({suffix: '.min'}))   //rename壓縮後的文件名

        .pipe(uglify())    //壓縮

        .pipe(gulp.dest('minified/js'));  //輸出

});

 

3、清空輸出目錄

var del =require('del');
gulp.task('clean', function() { return del(['dst']);  //'dst'是一個目錄 });
4、壓縮圖片
const imagemin = require('gulp-imagemin');
 
gulp.task('default', function(){
    return gulp.src('src/images/*')
           .pipe(imagemin())
           .pipe(gulp.dest('dist/images'));
});

 


5、壓縮html
var gulp = require('gulp'),
    htmlmin = require('gulp-htmlmin');
 
gulp.task('htmlMin', function () {
    var options = {
        removeComments: true,//清除HTML註釋
        collapseWhitespace: true,//壓縮HTML
        collapseBooleanAttributes: true,//省略布爾屬性的值 <input checked="true"/> ==> <input />
        removeEmptyAttributes: true,//刪除全部空格做屬性值 <input id="" /> ==> <input />
        removeScriptTypeAttributes: true,//刪除<script>的type="text/javascript"
        removeStyleLinkTypeAttributes: true,//刪除<style>和<link>的type="text/css"
        minifyJS: true,//壓縮頁面JS
        minifyCSS: true//壓縮頁面CSS
    };
    gulp.src('src/*.html')
        .pipe(htmlmin(options))
        .pipe(gulp.dest('dst'));
});

 


6、合併文件
var concat = require('gulp-concat');
 
gulp.task('concat', function () {
    gulp.src('src/js/*.js')
        .pipe(concat('all.js'))//合併後的文件名
        .pipe(gulp.dest('dist/js'));
});

 


7、css自動處理瀏覽器前綴,如添加-webkit-解決瀏覽器兼容問題
var autoprefixer = require('gulp-autoprefixer');
 
gulp.task('autoprefixer', function () {
    gulp.src('css/index.css')
        .pipe(autoprefixer())
        .pipe(gulp.dest('dist/css'));
});

 


 8、給文件加上MD5戳
var rev = require('gulp-rev');
gulp.task('rev', function() {
    return gulp.src([config.src + config.resource])
        .pipe(rev())        //加上MD5戳
        .pipe(gulp.dest(config.app))//輸出文件
        .pipe(rev.manifest())//生成rev-manifest.json,該文件用於替換HTML CSS文件中引用的MD5文件路徑
        .pipe(gulp.dest(config.rev))//rev-manifest.json文件放在rev目錄下
});

 


9、給html css文件替換路徑
var revCollector = require('gulp-rev-collector');

gulp.task('revCollector', function() {
    return gulp.src(['rev/*.json', 'config/*.css','config/*.html']) //讀取 rev-manifest.json 文件以及須要進行文件名替換的文件
        .pipe(revCollector({
            replaceReved: true
        })) //執行文件內引用名的替換
        .pipe(gulp.dest('config/app')); //替換後的文件輸出的目錄
});

 


10、修改文件後自動刷新瀏覽器
browserSync = require('browser-sync');
var reload = browserSync.reload;
gulp.task('watch',function(){
    browserSync({
        server:{
            baseDir:'./src'  //設置項目根目錄,由此啓動一個服務器
        }
    });
    gulp.watch('src/*.html',reload);//監聽html文件,文件變更立刻自動刷新瀏覽器頁面 
});

 


當設定的文件發生變更時,會自動啓動一個本地服務器localhost:3000,而後讀取baseDir中的目錄。

若是你的文件就在服務器裏,代碼須要修改爲這樣

// 代理
gulp.task('watch', function() {
    browserSync.init({
        proxy: "你的域名或IP"
    });
  gulp.watch('src/*.html',reload);//監聽html文件,文件變更立刻自動刷新瀏覽器頁面
});

 

以及幾個gulp命令:

gulp.task(name, fn)//新建一個gulp任務,name是任務名,fn回調函數

gulp.run(tasks...)//儘量多的並行運行多個task 新版本中的gulp中使用run會發出警告,這樣的狀況下咱們能夠用start代替

gulp.watch(glob, fn//)當glob內容發生改變時,執行fn

gulp.src(glob)//返回一個可讀的stream

gulp.dest(glob)//返回一個可寫的stream

 

 編寫完gulpfile以後就能夠在cmd執行gulp來完成命令了。

ending~

相關文章
相關標籤/搜索