前端構建工具gulp使用

来源:http://www.cnblogs.com/starof/archive/2016/03/01/5194622.html
-Advertisement-
Play Games

前端自動化流程工具,用來合併文件,壓縮等。 Gulp官網 http://gulpjs.com/ Gulp中文網 http://www.gulpjs.com.cn/ Gulp中文文檔 https://github.com/lisposter/gulp-docs-zh-cn Gulp插件網 http:/


前端自動化流程工具,用來合併文件,壓縮等。

一、安裝gulp環境

1、下載安裝nodejs 

gulp基於node.js,要通過nodejs的npm安裝gulp,所以先要安裝nodejs環境,通過英文官網下載或者中文網下載安裝。

node.js插件在windows系統下是個.msi工具,只要一直下一步即可,軟體會自動在寫入環境變數中,這樣就能在cmd命令視窗中直接使用node或npm命令。npm更多介紹見文章最後附件部分。

 

2、全局安裝gulp

首先確保你已經正確安裝了nodejs環境。然後用以下命令全局方式安裝gulp。

npm install gulp -g 或者cnpm install gulp -g

cnpm更多介紹見文章最後附件部分。 

二、項目流程

比如我的項目目錄為:E:\gulpproject

1、生成項目所需信息文件package.json

cmd視窗進入gulpproject目錄(可參考附件),輸入命令npm init,一路按enter完成後自動生成package.json文件。

Note:可能會遇到Sorry, name can no longer contain capital letters.意思是項目名稱不能包含大寫字母。

2、項目根目錄下安裝gulp

全局安裝gulp後,還需要在每個要使用gulp的項目中都單獨安裝一次。

執行命令

npm install gulp --save-dev

完成後會生成node_modules文件夾。

3、安裝項目所需自動化插件

  • 壓縮js插件是 gulp-uglify
  • 壓縮image插件是 gulp-image
  • 壓縮css插件是 gulp-cssnano
#安裝gulp-uglify
npm install gulp-uglify --save-dev
#安裝gulp- image
npm install gulp-image --save-dev
#安裝gulp-cssnano
npm install gulp-cssnano --save-dev
#安裝del
npm install del --save-dev 

4、配置項目的gulpfile.js

gulpfile.js是gulp項目的配置文件,裡面包含的是task的配置。最簡單的gulpfile.js配置如下:該配置文件定義了一個預設任務。

var gulp = require('gulp');
gulp.task('default',function(){
        console.log('hello world');
});

項目中用到哪些功能可加入配置文件。

假設我的文件目錄如下:E:gulpproject中有一個新的項目1buy,包括了要壓縮的css,images和js等。

新建gulpfile.js 放在1buy文件夾中。

如下為我用的gulpfile.js配置,包括壓縮js,css,images,編譯less功能。

var gulp = require('gulp'),
    uglify = require('gulp-uglify'),
    concat = require('gulp-concat'),
    rename = require('gulp-rename'),
    cssnano = require('gulp-cssnano'),
    image = require("gulp-image"),
    del = require('del'),
    less = require('gulp-less');

//壓縮css,壓縮後的文件放入dest/css
gulp.task('minifycss', function() {
    return gulp.src('css/*.css')
               .pipe(cssnano()) //壓縮
               .pipe(gulp.dest('dest/css'));//輸出
});
//合併並壓縮css,合併壓縮後的文件放入dest/css
gulp.task('concatminifycss', function() {
    return gulp.src('css/*.css')
                .pipe(concat('main.css'))    //合併所有css到main.css
                //.pipe(gulp.dest('dest/css'))    //輸出main.css到文件夾
                //.pipe(rename({suffix: '.min'}))   //rename壓縮後的文件名
                .pipe(cssnano())//壓縮
                .pipe(gulp.dest('dest/css'));//輸出
});

//壓縮js,壓縮後的文件放入dest/js
gulp.task('minifyjs', function() {
    return gulp.src('js/*.js')
                .pipe(uglify())//壓縮
                .pipe(gulp.dest('dest/js'));//輸出
});

//合併並壓縮js,合併壓縮後的文件放入dest/js
gulp.task('concatminifyjs', function() {
    return gulp.src('js/*.js')
                .pipe(concat('main.js'))    //合併所有js到main.js
                .pipe(gulp.dest('dest/js'))    //輸出main.js到文件夾
                .pipe(rename({suffix: '.min'}))   //rename壓縮後的文件名
                .pipe(uglify())//壓縮
                .pipe(gulp.dest('dest/js'));//輸出
});

//壓縮圖片,壓縮後的文件放入dest/images
gulp.task('image',function(){
    gulp.src('images/*.+(jpg|png|gif|svg)')
        .pipe(image())//壓縮
        .pipe(gulp.dest('dest/images'));//輸出
});

//執行壓縮前,先刪除dest文件夾里的內容
gulp.task('clean', function(cb) {
    del(['dest/*'], cb)
});

//編譯less到css
gulp.task("less",function(){
    gulp.src('css/*.less')
        .pipe(less())
        .pipe(gulp.dest("dest/css"));

});
//監視文件的變化
gulp.task("watch",function(){
gulp.watch("css/*.less",['less']);

});

//預設命令,在cmd中輸入gulp後,執行的就是這個命令
gulp.task('default', function() {
    // 將你的預設的任務代碼放在這
    gulp.start('clean','concatminifycss','image','concatminifyjs');
});
View Code

具體每個插件功能下麵詳細介紹。

5、執行壓縮命令

要運行gulp任務,只需切換到存放gulpfile.js文件的目錄(windows平臺使用cmd),然後在命令行中執行gulp命令就行了,gulp後面可以加上要執行的任務名,例如gulp clean,如果沒有指定任務名,則會執行任務名為default的預設任務。

三、插件功能詳解(部分我沒用過

1、全局配置config

當gulpfile.js太大時就不好維護了,此時可以將需要在gulpfile中引用的參數,放到這裡,包括一些路徑,功能的開關等。例如:config.js內容如下:

module.exports = {
    name : '.....',
    devPath : '.....',    //項目根路徑,根路徑下可以包含多個項目
    prodPath : '....', //生產路徑根路徑
    sassPath : '.....', //SASS包含文件路徑
    rmHtmlWhitespace : false,//html中是否去除空格
    webpackEntry : {
        index : 'index.js'//js合併
    },
    server : {
        port : 8088
    }
};

註意下這裡使用了module.exports,這是nodejs的語法。在gulpfile中將會用require引用config。

//載入項目配置
var config = require('./config');

2、image圖片無損壓縮

通過gulp-image壓縮的圖片,有時候能壓80%以上,非常給力。

github地址:https://github.com/1000ch/gulp-image

//壓縮圖片,壓縮後的文件放入dest/images
gulp.task('image',function(){
    gulp.src('images/*.+(jpg|png|gif|svg)')
        .pipe(image())//壓縮
        .pipe(gulp.dest('dest/images'));//輸出
});

3、js壓縮與模塊化合併

使用gulp-uglify做js的壓縮,gulp-concat合併。

//壓縮js,壓縮後的文件放入dest/js
gulp.task('minifyjs', function() {
    return gulp.src('js/*.js')
                .pipe(uglify())//壓縮
                .pipe(gulp.dest('dest/js'));//輸出
});

//合併並壓縮js,合併壓縮後的文件放入dest/js
gulp.task('concatminifyjs', function() {
    return gulp.src('js/*.js')
                .pipe(concat('main.js'))    //合併所有js到main.js
                .pipe(gulp.dest('dest/js'))    //輸出main.js到文件夾
                .pipe(rename({suffix: '.min'}))   //rename壓縮後的文件名
                .pipe(uglify())//壓縮
                .pipe(gulp.dest('dest/js'));//輸出
});

如下也可以實現,but我沒用過。

gulpRimraf()用來刪除文件夾,引用自gulp-rimraf

gulp.task('js', function() {
    //先刪除dist中的css,有時候會不更新
    gulp.src('./dist/js/*.js')
        .pipe(rimraf({force: true}));
        
    gulp.src('./js/*.js')
        .pipe(plumber())
        .pipe(jshint())
        .pipe(jshint.reporter('default'))
        .pipe(uglify())
        .pipe(gulp.dest('./dist/js'))
        .pipe(livereload());
});

上面的jshint是用來分析代碼的,例如分號沒寫。通過打指令“gulp-jshint”。

模塊化合併使用webpack-stream點擊查看文檔。github上面還有篇說明教程

gulp.task('webpack', function(){
    var entry = {};
    for(var name in config.webpackEntry){
        entry[name] = './js/' + config.webpackEntry[name];
    }
    //排除bundle文件
    return gulp.src('./js/*[^bundle].js')
        .pipe(plumber())
        .pipe(webpack({
            entry: entry,
            output: {
                filename: '[name].bundle.js',
            }
        }))
        .pipe(gulp.dest('./js'));
});

4、css壓縮與模塊化合併

和js類似。

//壓縮css,壓縮後的文件放入dest/css
gulp.task('minifycss', function() {
    return gulp.src('css/*.css')
               .pipe(cssnano()) //壓縮
               .pipe(gulp.dest('dest/css'));//輸出
});
//合併並壓縮css,合併壓縮後的文件放入dest/css
gulp.task('concatminifycss', function() {
    return gulp.src('css/*.css')
                .pipe(concat('main.css'))    //合併所有css到main.css
                //.pipe(gulp.dest('dest/css'))    //輸出main.css到文件夾
                //.pipe(rename({suffix: '.min'}))   //rename壓縮後的文件名
                .pipe(cssnano())//壓縮
                .pipe(gulp.dest('dest/css'));//輸出
});

5、監控gulp.watch

這個是gulp自帶的,就是當你的文件改動了後,就做相應的task。還有一個插件gulp-watch

監控sass中的文件變化,一有變化就做sass的編譯。“**”與“*”這種語法可以參考《Gulp:任務自動管理工具

gulp.task('watch', function() {
    livereload.listen();
    gulp.watch('**.html', ['html']);
    gulp.watch('./sass/*.scss', ['sass']);
    gulp.watch('./css/*.css', ['css']);
    gulp.watch('./js/*.js', ['js']);
});

監控了四個地方的修改,js、html、css和sass,並且有做了自動刷新livereload。這個是通過“gulp-livereload”來實現的。

firefox貨chrome要分別安裝插件才可運行。chrom插件如下:

安裝完後會在瀏覽器中出現個小按鈕,,註意是黑色的時候才是在執行中。還有就是要在相應的task中加相應的代碼:

.pipe(livereload())

6、less/sass編譯與css壓縮

less請參考:gulp編譯less

通過sass編寫css,能更模塊化,多人協作比較方便。安裝gulp-sass。“gulpPlumber()”是引用了“gulp-plumber”,任務錯誤中斷自動重傳。

gulp.task('sass', function() {
    gulp.src('./sass/*.scss')
            .pipe(plumber())
            .pipe(sass())
            .pipe(gulp.dest('./css'))
            .pipe(livereload());
});

gulp-cssnano,壓縮CSS代碼。

gulp.task('css', ['sass'], function() {
    //先刪除dist中的css,有時候會不更新
    gulp.src('./dist/css/*.css')
        .pipe(rimraf({force: true}));
        
    gulp.src('./css/*.css')
        .pipe(cssnano())
        .pipe(gulp.dest('./dist/css'))
        .pipe(livereload());
});

7、html壓縮

經過gulp-htmlmin壓縮過的html可以縮小很多,可以看到都擠到了一起,有很多參數可以選擇,比如去除空格等。

還可以通過gulp-replace來給靜態資源文件加個版本號。

gulp.task('html', function() {
    gulp.src('*.html')
        .pipe(replace('__VERSION', Date.now().toString(16)))
        .pipe(htmlmin({collapseWhitespace: true}))
        .pipe(gulp.dest('./dist'))
        .pipe(livereload());
});

8、fontmin字體壓縮

網上有很多webfont,例如國外的Font Awesome,國內的iconfont。都能做出漂亮的自定義字體。

與西文字體不同,由於字元集過大,中文字體無法享受 webfont 帶來的便利。為了讓中文字體也乘上這道風,我們需要對其進行min。使用指令“gulp-fontmin”。

gulp.task('font', function() {
    gulp.src('font/*.+(eot|svg|ttf|woff)')
      .pipe(fontmin({
          text: '人曬'
      }))
      .pipe(gulp.dest('dist/font'));
});

配置的兩個字“人曬”與沒配置的“國”,明顯有區別。

 

9、啟動一個本地調試伺服器

通過gulp-connect,可以做個server。如果你用notpad++這種開發頁面,那這個指令會很有用。

gulp.task('server', function(){
    var option = {
        root : config.devPath,
        port : config.server.port
    };
    if(config.server.root){
        option.root = config.server.root;
    }
    connect.server(option);
});

上面的localhost可以改成本機的IP地址,手機與電腦在同一個網段的話,就可以直接用手機調試了。

10、node_modules目錄

node_modules目錄中的內容非常大,如果在每個工程下麵都安裝,會造成很大的浪費。可以將其放在各個工程的公共父級中,而在各個目錄下麵使用自己的gulpfile.js,config.js等配置文件。

例如工程都在public文件夾中,我就將node_modules放在public的平級。

 

 

 

 

附件

1、npm介紹

npm(node package manager)nodejs的包管理器,用於node插件管理(包括安裝、卸載、管理依賴等)

gulp赫然出現在npm的首頁中。

命令提示符執行:

npm install <name> [-g] [--save-dev]

1. <name>:node插件名稱。例:npm install gulp-less --save-dev

2. -g:全局安裝。將會安裝在C:\Users\Administrator\AppData\Roaming\npm,並且寫入系統環境變數;

          非全局安裝:將會安裝在當前定位目錄;

全局安裝可以通過命令行在任何地方調用它,本地安裝將安裝在定位目錄的node_modules文件夾下,通過require()調用;

3. --save:將保存配置信息至package.json(package.json是nodejs項目配置文件);

4. -dev:保存至package.json的devDependencies節點,不指定-dev將保存至dependencies節點

配置文件package.json是為了方便下載相關的包,只需要在有這個文件的文件夾下麵執行“npm install”(如果安裝了cnpm就用“cnpm install”),則會根據package.json下載所有需要的包。

2、cnpm

因為npm安裝插件是從國外伺服器下載,受網路影響大,可能出現異常。

在國內推薦使用淘寶NPM鏡像。“這是一個完整 npmjs.org 鏡像,你可以用此代替官方版本(只讀),同步頻率目前為 10分鐘 一次以保證儘量與官方服務同步”

安裝指令如下:

npm install -g cnpm --registry=https://registry.npm.taobao.org

註意安裝的時候會出現錯誤提示,你可以關閉命令視窗再打開,打入“cnpm -v”可以查看版本號。cnpm跟npm用法完全一致。

 

參考資料

http://javascript.ruanyifeng.com/tool/gulp.html    Gulp:任務自動管理工具

http://www.ghostchina.com/module-exports-and-exports-in-node-js/  Node.js 系列之 —— module.exports 與 exports

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

前端自動化構建工具gulp記錄

 

 

本文作者starof,因知識本身在變化,作者也在不斷學習成長,文章內容也不定時更新,為避免誤導讀者,方便追根溯源,請諸位轉載註明出處:http://www.cnblogs.com/starof/p/5194622.html有問題歡迎與我討論,共同進步。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CCS3屬性之text-overflow:ellipsis;的用法和註意之處 語法: text-overflow:clip | ellipsis 預設值:clip 適用於:所有元素 clip: 當對象內文本溢出時不顯示省略標記(...),而是將溢出的部分裁切掉。 ellipsis: 當對象內文本溢出
  • JavaScript 中的所有事物都是對象:字元串、數字、數組、日期,等等。 在 JavaScript 中,對象是擁有屬性和方法的數據。 屬性和方法 屬性是與對象相關的值。 方法是能夠在對象上執行的動作。 舉例:汽車就是現實生活中的對象。 汽車的屬性: car.name=Fiat car.model
  • forEach是ECMA5中Array新方法中最基本的一個,就是遍歷,迴圈。例如下麵這個例子: [1, 2 ,3, 4].forEach(alert); 等同於下麵這個for迴圈 var array = [1, 2, 3, 4]; for (var k = 0, length = array.len
  • 在編寫CSS時也存在一些編碼規範,平時註意這些基本的規範,可使代碼更易閱讀和維護。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <style> /* 語法 用兩個空格來代替製表符(tab
  • 在編寫HTML時,可能有一些方面不夠規範,在通過對《HTML5編碼規範》的學習後,採用代碼註解的方式,做相關的整理,方便今後回顧。 1 <!DOCTYPE html> <!-- HTML5 doctype 標準模式(standard mode)的聲明,這樣能夠確保在每個瀏覽器中擁有一致的展現-->
  • 1 H5 緩存機制介紹 H5,即 HTML5,是新一代的 HTML 標準,加入很多新的特性。離線存儲(也可稱為緩存機制)是其中一個非常重要的特性。H5 引入的離線存儲,這意味著 web 應用可進行緩存,並可在沒有網際網路連接時進行訪問。 H5 應用程式緩存為應用帶來三個優勢: 離線瀏覽 用戶可在應用離
  • 一、標題 標題的h1到h6標簽,這裡不再贅述。值得一提的是,H5中新定義了一個元素<hgroup>,用來將標題和副標題群組。一般在header里將一組標題組合在一起,變成一個區塊: 1 <body> 2 <header> 3 <hgroup> 4 <h1> 阿裡旅行·去啊 </h1> 5 <h2>
  • 目錄 瞭解什麼是Web 瞭解什麼是HTML 瞭解什麼是CSS 瞭解什麼是JavaScript 瞭解HTML與CSS是如何一起工作的 為何要使用CSS 擴展閱讀 一、瞭解什麼是Web? 通俗來講,可以使用戶通過瀏覽器來訪問某個電腦上的文件。 二、瞭解什麼是HTML? HTML(超文本標記語言--Hyp
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...