Gulp折騰之路(II)


前段時間折騰Gulp,主要是搜尋一些插件,組合之以優化前端開發流程。這段折騰歷程除了達成所願外,給予最大的收獲是:只要你想實現某功能,基本就已有對應插件供使用;所需要做的只是去發現她,外加”臨幸”她而已。

比如,伊始覺得使用SublimeText的 SFTP 上傳代碼到FTP很方便(Ctrl+S),而用gulp就會竟也有對應插件 gulp-sftp :heart_eyes::blush:,這下打開了使用 Gulp 的任督二脈;你想讓各個task按順序執行,就有 gulp-sequence 供你搞起;你想使用熊貓壓圖,果不其然就有 gulp-tinypng ;你想讓gulp命令能夠接受傳參,就有npm的 yargs 模塊在等着你去寵幸,如此等等,實在太爽,根本停不下來。此文就使用各路插件路上的些許心得做下記載,以供參考。

gulp-sequence Run a series of gulp tasks in order.

超級有用的類庫;眾所周知js是單線程的,運用此類庫可以: 保證任務按順序執行,讓gulp任務,可以相互獨立,解除任務間的依賴,增強task復用;對於復雜的操作非常有用;安裝:

npm install --save-dev gulp-sequence

gulp-sftp :上傳本地文件到FTP

個人覺得這個插件太好了。單純采用傳統模式開發,可用 xftp , WinScp 等工具上傳到FTP;當然這個好麻煩;為求更方便可以使用SublimeText插件 SFTP , Ctrl+S 之時就可以上傳此文件到FTP;但,一旦用SASS,Gulp等工具,這事兒就得重新考量了。幸好有 gulp-sftp 這樣的工具,可以一鍵上傳本地文件到FTP;其gulpfile配置也很簡單,並且折騰起來沒遇到什么問題。

var gulp        = require('gulp'),
    sftp        = require('gulp-sftp'),
    config      = require('./config.json');
//上傳到遠程服務器任務
gulp.task('upload', function () {
    var workDirectory = 'xxx';
    return gulp.src( workDirectory + '/**' )
        .pipe(sftp({
            host: config.sftp.host,
            user: config.sftp.user,
            port: config.sftp.port,
            key: config.sftp.key,
            pass: config.sftp.pass,
            remotePath: config.sftp.remotePath+objectDirectoryName
        }));
});

為了安全(畢竟這個需要userName和password),將重要的配置信息保存到項目目錄下的一個json 文件中,名為 config.json,該文件示例代碼如下:

{
    "project" : "Gulp",     
    "localserver" : {
 "host" : "localhost",
 "port" : "8081"
 },
    "tinypngapi": "Tinypng API KEY(所申請的api key)",
    "sftp" : {
 "host" : "8.8.8.8",
 "user" : "username",
 "port" : "22",
 "key" : "~/.ssh/sdfsfdsf",
 "remotePath" :"/",
 "pass": "jeffjade"
 }
}

gulp.spritesmith 生成雪碧圖

gulp.spritesmith:Convert a set of images into a spritesheet and CSS variables via gulp

這個庫需要額外依賴 spritesmith 庫;

npm install --save-dev gulp.spritesmith  spritesmith

當然安裝的時候極有可能出現問題(Win下);比如,安裝的類庫無法使用,並且也刪除(指定的路徑或文件名太長);額,這是一個超蛋疼的問題;也是在嘗試幾次后才成功(沒鬧明白失敗和成功的原因);至於刪掉那壞的類庫,最后也是采用將部分 剪切出去 或者手動rename致使路徑變短些才得以干掉它【用del rd命令都不足以刪除之,我屮艸芔茻,醉了~】;

del : 指定的路徑或文件名太長,或者兩者都太長。完全限定文件名必須少於 260 個字符,並且目錄名必須少於 248 個字符。

[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 掛起(S) [?] 幫助 (默認值為“Y”): Ard : 指定的路徑或文件名太長,或者兩者都太長。完全限定文件名必須少於 260 個字符,並且目錄名必須少於 248 個字符。

gulpfile配置如下即可:

var gulp        = require('gulp'),
    spritesmith = require('gulp.spritesmith');
//運用gulp一鍵生成[雪碧圖]
gulp.task('sprite', function(){
    var workDirectory = 'xxx', outPut = 'yyy';
    return gulp.src( workDirectory+'/images/*.png' )
    .pipe( spritesmith({
        imgName:'sprite.png',
        cssName:'sprite.css'
    }) )
    .pipe( gulp.dest(outPut+'/images') );
});

gulp-tinypng 使用熊貓壓圖

gulp-tinypng:gulp plugin to compress png images using tinypng api

var gulp        = require('gulp'),
    tinypng     = require('gulp-tinypng');
//壓縮圖片 - tinypng
gulp.task('tinypng', function () {
    var workDirectory = 'xxx', outPut = 'yyy';
    gulp.src( workDirectory+'/images/*.{png,jpg,jpeg}')
        .pipe(tinypng(config.tinypngapi))
        .pipe(gulp.dest( outPut+'/images' ));
});

這里折騰起來沒遇到什么問題;當然這里需要配置 API Key ;需要去tinypng開發者https://tinypng.com/developers ,獲得一個合法的API Key;否則運行會出現如下錯誤:

gulp-tinypng - Credentials are invalid

gulp-replace :A string replace plugin for gulp

npm install --save-dev gulp-replace

在項目中這個插件還是挺有用的,可以批量替換字符串,並且支持使用正則替換;使用示例:

var replace = require('gulp-replace');
 
gulp.task('templates', function(){
  gulp.src(['file.txt'])
    .pipe(replace(/foo(.{3})/g, '$1foo'))
    .pipe(gulp.dest('build/file.txt'));
});

gulp-tap :Easiest way to tap into a pipeline

看其描述“最簡單打通管道的方法”,官方給出的示例如下:

gulp.src("src/**/*.{coffee,js}")
    .pipe(tap(function(file, t) {
        if (path.extname(file.path) === '.coffee') {
            return t.through(coffee, []);
        }
    }))
    .pipe(gulp.dest('build'));

這個插件很有作用,它可以用來遍歷 gulp.src() 指定的那些文件;利用這個特性,以及npm下自帶的 path 插件,即可獲取到每個文件的文件名;在特定場景需求里,它幫了我很大忙。

var gulp = require('gulp');
var path = require('path');
var tap = require('gulp-tap');

gulp.task('examples', function() {
return gulp.src('./examples/*.html')
    .pipe(tap(function (file,t) {
        console.log(path.basename(file.path));
        // Do something with the file name
    }))
    .pipe(gulp.dest('./build'));
});

lazypipe :Use to create an immutable, lazily initialized pipeline from a series of streams.

npm install --save-dev lazypipe

如果你在多個任務中使用了相同的插件,你可能發現你很想把這些東西以 DRY原則 [^footnote]去處理。這個方法可以創建一些工廠來把你經常使用的 stream 鏈分離出來。這可以使用 lazypipe 來完成這件事;參考文章: 通過 stream 工廠來共享 stream 。

var gulp = require('gulp');
var uglify = require('gulp-uglify');
var coffee = require('gulp-coffee');
var jshint = require('gulp-jshint');
var stylish = require('jshint-stylish');
var lazypipe = require('lazypipe');

// 賦給 lazypipe
var jsTransform = lazypipe()
  .pipe(jshint)
  .pipe(jshint.reporter, stylish)
  .pipe(uglify);

gulp.task('bootstrap', function() {
  return gulp.src('bootstrap/js/*.js')
    .pipe(jsTransform())
    .pipe(gulp.dest('public/bootstrap'));
});

gulp.task('coffee', function() {
  return gulp.src('lib/js/*.coffee')
    .pipe(coffee())
    .pipe(jsTransform())
    .pipe(gulp.dest('public/js'));
});

你可以看到,多個任務中都在使用的 JavaScript 管道(JSHint + Uglify)分離到了一個工廠。工廠可以在任意多的任務中重用。你也可以嵌套這些工廠,或者把它們連接起來,已達到更好的效果。分離出每個共享的管道,也可以讓你能夠集中地管理,當你的工作流程更改后,你只需要修改一個地方即可。

此外還有 yargs , path , gulp-changed 等等諸多模塊,君之所需,可謂應有盡有—只要你願意去折騰;實在沒有自己寫一個也並不是什么大難事。折騰,只為讓事物變得更簡潔。Not Fucking Excuse ,Just Do It。

[^footnote]:DRY是“Don’t Repeat Yourself”的縮寫。意思是說,在一個設計里,對於任何東西,都應該有且只有一個表示,其它的地方都應該引用這一處。這樣需要改動的時候,只需調整這一處,所有的地方就都變更過來了。

來自: http://www.jeffjade.com/2016/01/19/2016-01-19-toss-gulp/

前段時間折騰Gulp,主要是搜尋一些插件,組合之以優化前端開發流程。這段折騰歷程除了達成所願外,給予最大的收獲是:只要你想實現某功能,基本就已有對應插件供使用;所需要做的只是去發現她,外加”臨幸”她而已。

比如,伊始覺得使用SublimeText的 SFTP 上傳代碼到FTP很方便(Ctrl+S),而用gulp就會竟也有對應插件 gulp-sftp :heart_eyes::blush:,這下打開了使用 Gulp 的任督二脈;你想讓各個task按順序執行,就有 gulp-sequence 供你搞起;你想使用熊貓壓圖,果不其然就有 gulp-tinypng ;你想讓gulp命令能夠接受傳參,就有npm的 yargs 模塊在等着你去寵幸,如此等等,實在太爽,根本停不下來。此文就使用各路插件路上的些許心得做下記載,以供參考。

gulp-sequence Run a series of gulp tasks in order.

超級有用的類庫;眾所周知js是單線程的,運用此類庫可以: 保證任務按順序執行,讓gulp任務,可以相互獨立,解除任務間的依賴,增強task復用;對於復雜的操作非常有用;安裝:

npm install --save-dev gulp-sequence

gulp-sftp :上傳本地文件到FTP

個人覺得這個插件太好了。單純采用傳統模式開發,可用 xftp , WinScp 等工具上傳到FTP;當然這個好麻煩;為求更方便可以使用SublimeText插件 SFTP , Ctrl+S 之時就可以上傳此文件到FTP;但,一旦用SASS,Gulp等工具,這事兒就得重新考量了。幸好有 gulp-sftp 這樣的工具,可以一鍵上傳本地文件到FTP;其gulpfile配置也很簡單,並且折騰起來沒遇到什么問題。

var gulp        = require('gulp'),
    sftp        = require('gulp-sftp'),
    config      = require('./config.json');
//上傳到遠程服務器任務
gulp.task('upload', function () {
    var workDirectory = 'xxx';
    return gulp.src( workDirectory + '/**' )
        .pipe(sftp({
            host: config.sftp.host,
            user: config.sftp.user,
            port: config.sftp.port,
            key: config.sftp.key,
            pass: config.sftp.pass,
            remotePath: config.sftp.remotePath+objectDirectoryName
        }));
});

為了安全(畢竟這個需要userName和password),將重要的配置信息保存到項目目錄下的一個json 文件中,名為 config.json,該文件示例代碼如下:

{
    "project" : "Gulp",     
    "localserver" : {
 "host" : "localhost",
 "port" : "8081"
 },
    "tinypngapi": "Tinypng API KEY(所申請的api key)",
    "sftp" : {
 "host" : "8.8.8.8",
 "user" : "username",
 "port" : "22",
 "key" : "~/.ssh/sdfsfdsf",
 "remotePath" :"/",
 "pass": "jeffjade"
 }
}

gulp.spritesmith 生成雪碧圖

gulp.spritesmith:Convert a set of images into a spritesheet and CSS variables via gulp

這個庫需要額外依賴 spritesmith 庫;

npm install --save-dev gulp.spritesmith  spritesmith

當然安裝的時候極有可能出現問題(Win下);比如,安裝的類庫無法使用,並且也刪除(指定的路徑或文件名太長);額,這是一個超蛋疼的問題;也是在嘗試幾次后才成功(沒鬧明白失敗和成功的原因);至於刪掉那壞的類庫,最后也是采用將部分 剪切出去 或者手動rename致使路徑變短些才得以干掉它【用del rd命令都不足以刪除之,我屮艸芔茻,醉了~】;

del : 指定的路徑或文件名太長,或者兩者都太長。完全限定文件名必須少於 260 個字符,並且目錄名必須少於 248 個字符。

[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 掛起(S) [?] 幫助 (默認值為“Y”): Ard : 指定的路徑或文件名太長,或者兩者都太長。完全限定文件名必須少於 260 個字符,並且目錄名必須少於 248 個字符。

gulpfile配置如下即可:

var gulp        = require('gulp'),
    spritesmith = require('gulp.spritesmith');
//運用gulp一鍵生成[雪碧圖]
gulp.task('sprite', function(){
    var workDirectory = 'xxx', outPut = 'yyy';
    return gulp.src( workDirectory+'/images/*.png' )
    .pipe( spritesmith({
        imgName:'sprite.png',
        cssName:'sprite.css'
    }) )
    .pipe( gulp.dest(outPut+'/images') );
});

gulp-tinypng 使用熊貓壓圖

gulp-tinypng:gulp plugin to compress png images using tinypng api

var gulp        = require('gulp'),
    tinypng     = require('gulp-tinypng');
//壓縮圖片 - tinypng
gulp.task('tinypng', function () {
    var workDirectory = 'xxx', outPut = 'yyy';
    gulp.src( workDirectory+'/images/*.{png,jpg,jpeg}')
        .pipe(tinypng(config.tinypngapi))
        .pipe(gulp.dest( outPut+'/images' ));
});

這里折騰起來沒遇到什么問題;當然這里需要配置 API Key ;需要去tinypng開發者https://tinypng.com/developers ,獲得一個合法的API Key;否則運行會出現如下錯誤:

gulp-tinypng - Credentials are invalid

gulp-replace :A string replace plugin for gulp

npm install --save-dev gulp-replace

在項目中這個插件還是挺有用的,可以批量替換字符串,並且支持使用正則替換;使用示例:

var replace = require('gulp-replace');
 
gulp.task('templates', function(){
  gulp.src(['file.txt'])
    .pipe(replace(/foo(.{3})/g, '$1foo'))
    .pipe(gulp.dest('build/file.txt'));
});

gulp-tap :Easiest way to tap into a pipeline

看其描述“最簡單打通管道的方法”,官方給出的示例如下:

gulp.src("src/**/*.{coffee,js}")
    .pipe(tap(function(file, t) {
        if (path.extname(file.path) === '.coffee') {
            return t.through(coffee, []);
        }
    }))
    .pipe(gulp.dest('build'));

這個插件很有作用,它可以用來遍歷 gulp.src() 指定的那些文件;利用這個特性,以及npm下自帶的 path 插件,即可獲取到每個文件的文件名;在特定場景需求里,它幫了我很大忙。

var gulp = require('gulp');
var path = require('path');
var tap = require('gulp-tap');

gulp.task('examples', function() {
return gulp.src('./examples/*.html')
    .pipe(tap(function (file,t) {
        console.log(path.basename(file.path));
        // Do something with the file name
    }))
    .pipe(gulp.dest('./build'));
});

lazypipe :Use to create an immutable, lazily initialized pipeline from a series of streams.

npm install --save-dev lazypipe

如果你在多個任務中使用了相同的插件,你可能發現你很想把這些東西以 DRY原則 [^footnote]去處理。這個方法可以創建一些工廠來把你經常使用的 stream 鏈分離出來。這可以使用 lazypipe 來完成這件事;參考文章: 通過 stream 工廠來共享 stream 。

var gulp = require('gulp');
var uglify = require('gulp-uglify');
var coffee = require('gulp-coffee');
var jshint = require('gulp-jshint');
var stylish = require('jshint-stylish');
var lazypipe = require('lazypipe');

// 賦給 lazypipe
var jsTransform = lazypipe()
  .pipe(jshint)
  .pipe(jshint.reporter, stylish)
  .pipe(uglify);

gulp.task('bootstrap', function() {
  return gulp.src('bootstrap/js/*.js')
    .pipe(jsTransform())
    .pipe(gulp.dest('public/bootstrap'));
});

gulp.task('coffee', function() {
  return gulp.src('lib/js/*.coffee')
    .pipe(coffee())
    .pipe(jsTransform())
    .pipe(gulp.dest('public/js'));
});

你可以看到,多個任務中都在使用的 JavaScript 管道(JSHint + Uglify)分離到了一個工廠。工廠可以在任意多的任務中重用。你也可以嵌套這些工廠,或者把它們連接起來,已達到更好的效果。分離出每個共享的管道,也可以讓你能夠集中地管理,當你的工作流程更改后,你只需要修改一個地方即可。

此外還有 yargs , path , gulp-changed 等等諸多模塊,君之所需,可謂應有盡有—只要你願意去折騰;實在沒有自己寫一個也並不是什么大難事。折騰,只為讓事物變得更簡潔。Not Fucking Excuse ,Just Do It。

[^footnote]:DRY是“Don’t Repeat Yourself”的縮寫。意思是說,在一個設計里,對於任何東西,都應該有且只有一個表示,其它的地方都應該引用這一處。這樣需要改動的時候,只需調整這一處,所有的地方就都變更過來了。

來自: http://www.jeffjade.com/2016/01/19/2016-01-19-toss-gulp/

Gulp折騰之路(II)


免責聲明!

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



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