gulp 任务部署


1.任务分离

当使用gulpfile.js进行任务自动化的时候,对于习惯了模块化结构的人来说,把大量的工作写在同一个gulpfile.js是一种折磨,为了坚持一个文件处理好一件事,趁着有空,便探索了下gulp的使用技巧:分离任务到多个文件中

在gulpfile.js下加如下代码

var requireDir = require('require-dir');   // 就是这个插件
var dir = requireDir('./tasks');

gulp.task('default',["sometask"]); // 直接注入dir下的目录任务模块就好了

以下是结构目录

gulpfile.js
tasks/
├── script.js
├── css.js
└── test.js

这样就可以一个任务用来处理js压缩,一个用来处理css压缩,一个处理sass转化和视图刷新,当然还可以ftp上传啦!


2.每个文件夹压缩成一个文件

写angularjs的时候,由于模块化分离,会有多个文件夹,虽然最后的做法是将所有文件压缩成一个min文件(减少请求),但是习惯性的将合并后的代码先保存一份到debug文件夹下,这样程序出错时便于调试

目录如下:

js/
├── controller/
│   ├── index_ctrl.js
│   └── test_crl.js
│ 
├── sevice/
│   ├── index_sv.js
│   └── test_sv.js
│ 
├── filter/
│   └── filter.js
│ 
├── debug/
│   ├── controller.debug.js
│   ├── service.debug.js
│   └── filter.debug.js
│ 
└── app.min.js

文件代码如下

var fs = require('fs');
var del = require('del');  // 用于删除debug文件夹生成的文件
var path = require('path');
var merge = require('merge-stream');
var gulp = require('gulp');

var scriptsPath = './js';
var scriptsDebugPath = './js/debug'

// 获取文件夹
function getFolders(dir) {
    return fs.readdirSync(dir)
      .filter(function(file) {
        return fs.statSync(path.join(dir, file)).isDirectory();
      });
}

gulp.task('scripts', function() {
   var folders = getFolders(scriptsPath);

   var tasks = folders.map(function(folder) {
      return gulp.src(path.join(scriptsPath, folder, '/*.js'))
        // 这里执行任务
        .pipe(gulp.dest(scriptsDebugPath))  // 保存一份到debug
   });

   return merge(tasks);
});

gulp.task('delete:debug',['scripts'],function(cb){
    del([
        './js/debug.min.js'  // 删除生成的debug
    ], cb);
})

3.上传FTP

公司的工作需要将修改的代码提交后台服务器才能通过在线测试环境查看效果,sublime有对应的ftp上传插件,如果使用gulp,我需要压缩完,或者合并后的debug上传得每次压缩完了就手动上传,这不符合自动化管理,于是我找到了gulp-ftp工具

代码如下

var gulp = require('gulp');
var gutil = require('gulp-util');
var ftp = require('gulp-ftp');
 
gulp.task('upload', function () {
    return gulp.src('src/*')
        .pipe(ftp({
            host: 'website.com',
            port: '80',
            user: 'test',
            pass: '1234',
            remotePath: '/vhost/myproject/js/'
        }))
        // you need to have some kind of stream after gulp-ftp to make sure it's flushed 
        // this can be a gulp plugin, gulp.dest, or any kind of stream 
        // here we use a passthrough stream 
        .pipe(gutil.noop());
});

注意: 使用版本管理器的时候不要把ftp的配置都上传到公有环境中了哦,这里提供两种方法:
一是在配置中使用命令行传入参数填充(不知能不能读取环境变量)
二是创建一个ftp.default.js的文件代替上传,而填有配置的ftp.js文件在.gitignore(git为例)中不上传.


4.网页刷新

页面刷新需得配合浏览器的插件, 在chrome来说插件是LiveReload, 其它浏览器未知, 该刷新有个好处是当改变css的时候, 并不是真正意义上的全体刷新, 而是触发了一次重绘(不重新加载文件), 只有监听的是html或者js时才会重新加载文件

启用步骤:

  1. var livereload = require('gulp-livereload'); // 引用模块
  2. var reload = livereload(); // 开启livereload
未在程序开启livereload()报错
  1. 点击浏览器插件使其运作


    点击前为空心点
点击后为实心点
  1. 在watch文件中执行reload.changed(event.path);来刷新浏览器

代码如下:

var livereload = require('gulp-livereload'); 
var reload = livereload();  // 执行该语句后,点击插件则才会成功
gulp.watch('./html/rebuild-js/**/*.js',function(event){
    console.log(event.path);
    reload.changed(event.path); // 刷新浏览器
})

5.自动化(watch监听)

有了各个处理功能后, 就可以进行监听文件的改变来自动化执行以上操作, gulp.watch()接收一个数组来监听里面的内容, 数组中的字符串有点像正则表达式

如:

  • 监听 js 文件夹下的所有.js文件: "js/*.js"
  • 不监听js文件夹下的.min.js文件: "!js/*.min.js"

一个完整监听(监听所有js文件夹下的非.min.js文件的js文件)

gulp.watch(["js/*.js", "!js/*.min.js"],function(event){
    // pass
})

6.最终代码(js处理)
var fs = require('fs');
var path = require('path');
var merge = require('merge-stream');
var gulp = require('gulp');
var gutil = require('gulp-util');
var ftp = require('gulp-ftp');
var livereload = require('gulp-livereload');

var srcPath = './html/rebuild-js';
var destPaht = './html/js/'
var destDebugPath = './html/js/debug'

// 获取文件夹
function getFolders(dir) {
    return fs.readdirSync(dir)
      .filter(function(file) {
        return fs.statSync(path.join(dir, file)).isDirectory();
      });
}

gulp.task('js.min', function(){
    var folders = getFolders(srcPath);
    var tasks = folders.map(function(folder){
        dealJs(path.join(srcPath, folder, '/*.js'));
    })
   return merge(tasks);
  
});

function dealJs(_src) {
    return gulp.src()
      .pipe(ngAnnotate())                       // 生成angular注入声明
      .pipe(concat(_objJs.name))                // 合并
      .pipe(rename({suffix: '.debug'}))         // 加debug.js小后缀
      .pipe(gulp.dest(destDebugPath))           // 未压缩的用于debug

      .pipe(uglify().on('error',function(e){    // 压缩
          console.log(e);
      }))                                       
      .pipe(rename({suffix: '.min'}))           // rename压缩后的文件名
      .pipe(gulp.dest(destPaht))

      .pipe(ftp({                               // 写入ftp配置
          host: '.....',
          port: '.......',
          user: '...',
          pass: '.......',
          remotePath: '..........'
      }))
      .pipe(gutil.noop());                      // 上传ftp
};

// 检测改动过后的文件,并压缩上传
gulp.task('watchJs',['scripts','upload'],function(){
    var reload = livereload();
    gulp.watch('./html/rebuild-js/**/*.js',function(event){
        console.log(event.path);
        dealJs(event.path);
        reload.changed(event.path); // 刷新浏览器
    })
})

写在结束

好了,我的任务总算能流水线的工作了(上面js为例)
1.当我修改js文档保存的时候
2.程序自动将每个js下的文件夹合并,并各自生成一份debug文件供调试用
3.将合并的js文件全部丑陋化和压缩生成xx.min.js
4.将xx.min.js上传到ftp上
5.刷新视图

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • 前言 本文默认你已经安装好node环境,并且熟悉node命令,和window cd命令。 gulp简介 基于nod...
    9I阅读 1,973评论 4 50
  • 推荐安装软件:node,webstorm 通过npm安装gulp 初始化npm,生成package.json:np...
    Jadann阅读 1,386评论 0 1
  • gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学...
    依依玖玥阅读 3,147评论 7 55
  • 在现在的前端开发中,前后端分离、模块化开发、版本控制、文件合并与压缩、mock数据等等一些原本后端的思想开始...
    Charlot阅读 5,428评论 1 32
  • 编辑于2015年 转载自某作者的译文 作者要是看到请联系我注明出处 对网站资源进行优化,并使用不同浏览器测试并不是...
    krock01阅读 445评论 0 2