Gulp 學習總結


  Gulp 自動化工具開發非常方便,便於上手,值得使用。 

 

一、Gulp安裝

  gulp是基於NodeJS運行的,所以需要想安裝NodeJS.  http://nodejs.org/download/

  安裝gulp

# 安裝全局環境
npm install gulp -g #安裝本地環境
npm install gulp --save-dev

 

二、Gulp插件安裝

npm install browser-sync gulp-compass gulp-sass gulp-rename gulp-jshint gulp-uglify gulp-concat gulp-imagemin gulp-cache gulp-connect gulp-minify-css gulp-sourcemaps gulp-notify gulp-livereload gulp-clean gulp-load-plugins gulp-rev-append gulp-make-css-url-version --save-dev

  插件可根據自己的需求安裝,分別代表:

1、編譯Sass,生成雪碧圖(gulp-compass);

2、編譯sass(gulp-sass);

3、sass瀏覽器地圖(gulp-sourcemaps);

4、重命名文件(gulp-rename);

5、JS語法檢測(gulp-jshint);

6、JS丑化(gulp-uglify);

7、JS文件合並(gulp-concat);

8、圖片壓縮(gulp-imagemin);

9、緩存通知(gulp-cache);

10、web服務(gulp-connect);

11、壓縮CSS(gulp-minify-css);

12、css文件引用URL圖片加版本號(gulp-make-css-url-version);

13、清空文件夾(gulp-clean);

14、更新通知(gulp-notify);

15、html文件引用加版本號(gulp-rev-append);

16、web服務瀏覽器同步瀏覽(browser-sync);   // 推薦使用這個作為web服務

 

三、創建配置文件gulpfile.js

1、引入插件

var gulp = require('gulp'),              compass = require('gulp-compass'),          // compass編譯Sass, 生成雪碧圖
    sass = require('gulp-sass'),                // sass編譯
    sourcemaps = require('gulp-sourcemaps'),    // sass地圖
    rename = require('gulp-rename'),            // 重命名文件
    jshint = require('gulp-jshint'),            // JS語法檢測
    uglify = require('gulp-uglify'),            // JS丑化
    concat = require('gulp-concat'),            // JS拼接
    imagemin = require('gulp-imagemin'),        // 圖片壓縮
    cache = require('gulp-cache'),              // 緩存通知
    connect = require('gulp-connect'),          // web服務
    minifycss = require('gulp-minify-css'),     // 壓縮CSS
    cssver = require('gulp-make-css-url-version'),    // css文件引用URL加版本號
    clean = require('gulp-clean'),              // 清空文件夾
    notify = require('gulp-notify'),            // 更新通知
    rev = require('gulp-rev-append'),           // html添加版本號
    browserSync = require('browser-sync'),      // 瀏覽器同步
    reload = browserSync.reload;                // 自動刷新

2、配置開發路徑,結構為:

/*****項目結構***** * project(項目名稱) * |–node_modules 組件目錄 * |–dist 發布環境 * |–css 樣式文件(壓縮) * |–images 圖片文件(壓縮圖片) * |–js js文件(壓縮) * |–index.html 靜態文件(壓縮html) * |–dev 生產環境 * |–sass sass文件 * |–images 圖片文件 * |–js js文件 * |–index.html 靜態文件 * |–config.rb Compass配置文件 * |–package.json 項目信息 * |–gulpfile.js gulp任務文件 **/

gulpfile.js配置文件中的路徑為:

// 路徑變量
var path = { // 開發環境
 dev: { html: './dev', js: './dev/js', sass: './dev/sass', css: './dev/css', image: './dev/images' }, // 發布環境
 dist: { html: './dist', js: './dist/js', css: './dist/css', image: './dist/images' } };

3、構建gulp執行任務

// 定義web服務模塊,增加瀏覽器同步瀏覽
gulp.task('browser-sync', function() { browserSync({ server: { baseDir: '.' } }); }); // 創建Compass任務,編譯Sass生成雪碧圖
gulp.task('compass', function() { gulp.src(path.dev.sass+'/*.scss') .pipe(compass({ config_file: './config.rb',    // 配置文件
            css: path.dev.css,             // 編譯路徑
            sass: path.dev.sass           // sass路徑
            //image: path.dev.image // 圖片路徑,用於生成雪碧圖
 })) .pipe(cssver()) // CSS文件引用URl加版本號
        .pipe(minifycss())                 // 壓縮CSS
        .pipe(gulp.dest(path.dist.css))    // 發布到線上版本
        .pipe(reload({stream: true})); }); // 壓縮HTML
gulp.task('html', function() { gulp.src(path.dev.html+"/*.html") .pipe(rev()) // html 引用文件添加版本號
 .pipe(gulp.dest(path.dist.html)) .pipe(reload({stream: true})); }); //檢查腳本
gulp.task('lint', function() { gulp.src(path.dev.js+'/*.js') .pipe(jshint()) .pipe(jshint.reporter('default')); });// 圖片壓縮
gulp.task('image', function() { gulp.src(path.dev.image+'/*.*') .pipe(cache(imagemin())) .pipe(reload({stream: true})) .pipe(gulp.dest(path.dist.image)); //.pipe(notify({ message: '圖片壓縮'}));
}); // 合並壓縮JS文件
gulp.task('script', function() { gulp.src(path.dev.js+'/*.js') //.pipe(concat('all.js')) // 合並
        //.pipe(gulp.dest(path.dist.js))
        //.pipe(rename('all.min.js')) // 重命名
        .pipe(uglify())                    // 壓縮
 .pipe(gulp.dest(path.dist.js)) //.pipe(notify({ message: 'JS合並壓縮' }))
        .pipe(reload({stream: true})); }); // 清空文件夾
gulp.task('clean', function() { gulp.src([path.dist.css, path.dist.js, path.dist.image], {read: false}) .pipe(clean()); }); // 默認任務
gulp.task("default", function() { gulp.run('browser-sync', 'lint', 'compass', 'script', 'image');

    // 檢測文件發送變化 - 分開監聽為了執行對應的命令
    gulp.watch(path.dev.html+'/*.*', ['html']); gulp.watch(path.dev.sass+'/*.scss', ['compass']); gulp.watch(path.dev.image+'/**', ['image']); gulp.watch(path.dev.js+'/*.js', ['lint', 'script']); });

注意:html文件引用增加版本號時,需要在html文件引用路徑中增加 ?rev=@@hash 方可在編譯時,自動添加版本號

<link rel="stylesheet" type="text/css" href="./css/main.css?rev=@@hash">

4、配置瀏覽器自動刷新問題

使用gulp的browser-sync插件可以實現瀏覽器自動刷新,同步瀏覽的功能,創建實現自動刷新,需要啟動自動刷新的插件,在引入插件處

var browserSync = require('browser-sync'),        // 瀏覽器同步
    reload = browserSync.reload;                 // 自動刷新

之后,創建browser-sync的task任務,並在gulp的啟用。

gulp.task('browser-sync', function() { browserSync({ server: { baseDir: '.' } }); });

baseDir 為默認的服務訪問路徑,默認訪問為 http://localhost:3000, 配置信息為 http://localhost:3001

然后在發生變化要刷新的任務處,添加如下語句即可。詳情參考: BrowserSync + Gulp.js

.pipe(reload({stream: true}));

 

gulpfile.js完整文件如下:

/**
* *****組件安裝*****
* npm install gulp browser-sync gulp-compass gulp-sass gulp-rename gulp-jshint gulp-uglify gulp-concat gulp-imagemin gulp-cache gulp-connect gulp-minify-css gulp-sourcemaps gulp-notify gulp-livereload gulp-clean gulp-load-plugins gulp-rev-append gulp-make-css-url-version --save-dev
* 
* *****項目結構*****
* project(項目名稱)
*    |–.svn 通過svn管理項目會生成這個文件夾
*    |–node_modules 組件目錄
*    |–dist 發布環境
*        |–css 樣式文件(style.css style.min.css)
*        |–images 圖片文件(壓縮圖片)
*        |–js js文件(main.js main.min.js)
*        |–index.html 靜態文件(壓縮html)
*    |–dev 生產環境
*        |–sass sass文件
*        |–images 圖片文件
*        |–js js文件
*        |–index.html 靜態文件
*    |–config.rb Compass配置文件
* |-package.json 項目信息 * |–gulpfile.js gulp任務文件 *
*/ // 引入 Gulp插件 var gulp = require('gulp'), compass = require('gulp-compass'), // compass編譯Sass, 生成雪碧圖 sass = require('gulp-sass'), // sass編譯 sourcemaps = require('gulp-sourcemaps'), // sass地圖 rename = require('gulp-rename'), // 重命名文件 jshint = require('gulp-jshint'), // JS語法檢測 uglify = require('gulp-uglify'), // JS丑化 concat = require('gulp-concat'), // JS拼接 imagemin = require('gulp-imagemin'), // 圖片壓縮 cache = require('gulp-cache'), // 緩存通知 connect = require('gulp-connect'), // web服務 minifycss = require('gulp-minify-css'), // 壓縮CSS cssver = require('gulp-make-css-url-version'), // css文件引用URL加版本號 clean = require('gulp-clean'), // 清空文件夾 notify = require('gulp-notify'), // 更新通知 rev = require('gulp-rev-append'), // html添加版本號 browserSync = require('browser-sync'), // 瀏覽器同步 reload = browserSync.reload; // 自動刷新 // 路徑變量 var path = { // 開發環境 dev: { html: './dev', js: './dev/js', sass: './dev/sass', css: './dev/css', image: './dev/images' }, // 發布環境 dist: { html: './dist', js: './dist/js', css: './dist/css', image: './dist/images' } }; // 定義web服務模塊 gulp.task('webserver', function() { connect.server({ livereload: true, port: 8888 }); }); // 定義web服務模塊,增加瀏覽器同步瀏覽 gulp.task('browser-sync', function() { browserSync({ server: { baseDir: '.' } }); }); // 創建Compass任務,編譯Sass生成雪碧圖 gulp.task('compass', function() { gulp.src(path.dev.sass+'/*.scss') .pipe(compass({ config_file: './config.rb', // 配置文件 css: path.dev.css, // 編譯路徑 sass: path.dev.sass // sass路徑 //image: path.dev.image // 圖片路徑,用於生成雪碧圖 })) .pipe(cssver()) // CSS文件引用URl加版本號 .pipe(minifycss()) // 壓縮CSS .pipe(gulp.dest(path.dist.css)) // 發布到線上版本 .pipe(reload({stream: true})); }); // 壓縮HTML gulp.task('html', function() { gulp.src(path.dev.html+"/*.html") .pipe(rev()) // html 引用文件添加版本號 .pipe(gulp.dest(path.dist.html)) .pipe(reload({stream: true})); }); //檢查腳本 gulp.task('lint', function() { gulp.src(path.dev.js+'/*.js') .pipe(jshint()) .pipe(jshint.reporter('default')); }); // 圖片壓縮 gulp.task('image', function() { gulp.src(path.dev.image+'/*.*') .pipe(cache(imagemin())) .pipe(reload({stream: true})) .pipe(gulp.dest(path.dist.image)); //.pipe(notify({ message: '圖片壓縮'})); }); // 合並壓縮JS文件 gulp.task('script', function() { gulp.src(path.dev.js+'/*.js') //.pipe(concat('all.js')) // 合並 //.pipe(gulp.dest(path.dist.js)) //.pipe(rename('all.min.js')) // 重命名 .pipe(uglify()) // 壓縮 .pipe(gulp.dest(path.dist.js)) //.pipe(notify({ message: 'JS合並壓縮' })) .pipe(reload({stream: true})); }); // 清空文件夾 gulp.task('clean', function() { gulp.src([path.dist.css, path.dist.js, path.dist.image], {read: false}) .pipe(clean()); }); // 默認任務 gulp.task("default", function() { gulp.run('browser-sync', 'lint', 'compass', 'script', 'image'); // 檢測文件發送變化 - 分開監聽為了執行對應的命令 gulp.watch(path.dev.html+'/*.*', ['html']); gulp.watch(path.dev.sass+'/*.scss', ['compass']); gulp.watch(path.dev.image+'/**', ['image']); gulp.watch(path.dev.js+'/*.js', ['lint', 'script']); });

 gulp-compass 合並雪碧圖使用的 config.rb 配置文件,內容如下:

# Set this to the root of your project when deployed:
http_path = "/"
css_dir = "./dev/css"
sass_dir = "./dev/sass"
images_dir = "./dev/images"
javascripts_dir = "./dev/js"

# You can select your preferred output style here (can be overridden via the command line):
# 合並雪碧圖的方式
# output_style = :expanded or :nested or :compact or :compressed

# To enable relative paths to assets via compass helper functions. Uncomment:
# 相對路徑
relative_assets = true

# To disable debugging comments that display the original location of your selectors. Uncomment:
# line_comments = false

# If you prefer the indented syntax, you might want to regenerate this
# project again passing --syntax sass, or you can uncomment this:
# preferred_syntax = :sass
# and then run:
# sass-convert -R --from scss --to sass sass scss && rm -rf sass && mv scss sass

 

四、運行gulp

在項目目錄下執行 gulp 命令就會運行 default 任務,並且啟動監聽,之所以分開設置監聽任務,是為了執行對應命令,如果合並在一起執行,會增加編譯時間。

 

五、gulpfile.js配置文件參數說明

1、gulp.task()

gulp模塊的task方法,用於定義具體的任務,第一個參數為任務名,第二個參數為任務函數,如image任務,調用直接運行 gulp image

gulp.task('image', function() { console.log('圖片任務執行'); });

task方法也可以知道一組任務,如:

gulp.task('default',['html', 'sass', 'js']);

2、gulp.src()

gulp模塊的src方法,用於產生數據流,表示要處理的文件,一般有以下幾種格式:

  • js/app.js:指定確切的文件名。
  • js/*.js:某個目錄所有后綴名為js的文件。
  • js/**/*.js:某個目錄及其所有子目錄中的所有后綴名為js的文件。
  • !js/app.js:除了js/app.js以外的所有文件。
  • *.+(js|css):匹配項目根目錄下,所有后綴名為js或css的文件。

src方法的參數可以是一個數組,如:

gulp.src(['./js/*.js', './sass/*.scss']);

3、gulp.watch()

gulp模塊的watch方法,用於指點需要監視的文件,一旦文件發生變動,就運行指點任務。

gulp.watch('./js/*.js', ['lint', 'script']);

4、pipe

.pipe為每個任務的連接,執行完一個任務之后,再次連接執行下一個任務,如:

.pipe(minifycss())                // 壓縮CSS
.pipe(gulp.dest(path.dist.css));  // 發布到線上版本

先執行壓縮,再發布到線上版本

 

六、gulp學習資料參考

1、Gulp.js:比 Grunt 更簡單的自動化的項目構建利器

2、Gulp使用指南

3、Gulp:任務自動管理工具

4、Gulp安裝及配合組件構建前端開發一體化

5、gulp詳細入門教程

6、BrowserSync + Gulp.js

7、Gulp.js-LiveReload 自動刷新頁面

8、https://www.npmjs.com/package/gulp

9、Getting Started with Gulp

10、gulp plugins 插件介紹

11、前端構建工具gulpjs的使用介紹及技巧

 


免責聲明!

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



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