整合 streams 来处理错误

默认情况下,在 stream 中发生一个错误的话,它会被直接抛出,除非已经有一个时间监听器监听着 error时间。 这在处理一个比较长的管道操作的时候会显得比较棘手。

这里是一个在 gulpfile 中使用它的例子:

  1. var combiner = require('stream-combiner2');
  2. var uglify = require('gulp-uglify');
  3. var gulp = require('gulp');
  4.  
  5. gulp.task('test', function() {
  6. var combined = combiner.obj([
  7. gulp.src('bootstrap/js/*.js'),
  8. uglify(),
  9. gulp.dest('public/bootstrap')
  10. ]);
  11.  
  12. // 任何在上面的 stream 中发生的错误,都不会抛出,
  13. // 而是会被监听器捕获
  14. combined.on('error', console.error.bind(console));
  15.  
  16. return combined;
  17. });

删除文件和文件夹

最好的一个选择就是使用一个原生的 node 模块。

  1. $ npm install --save-dev gulp del

假想有如下的文件结构:

  1. .
  2. ├── dist
  3. ├── report.csv
  4. ├── desktop
  5. └── mobile
  6. ├── app.js
  7. ├── deploy.json
  8. └── index.html
  9. └── src

在 gulpfile 中,我们希望在运行我们的编译任务之前,将 mobile 文件的内容先清理掉:

  1. var gulp = require('gulp');
  2. var del = require('del');
  3.  
  4. gulp.task('clean:mobile', function (cb) {
  5. del([
  6. 'dist/report.csv',
  7. // 这里我们使用一个通配模式来匹配 `mobile` 文件夹中的所有东西
  8. 'dist/mobile/**/*',
  9. // 我们不希望删掉这个文件,所以我们取反这个匹配模式
  10. '!dist/mobile/deploy.json'
  11. ], cb);
  12. });
  13.  
  14. gulp.task('default', ['clean:mobile']);

在管道中删除文件

你可能需要在管道中将一些处理过的文件删除掉。

我们使用 vinyl-paths 模块来简单地获取 stream 中每个文件的路径,然后传给 del 方法。

  1. $ npm install --save-dev gulp del vinyl-paths

假想有如下的文件结构:

  1. .
  2. ├── tmp
  3. ├── rainbow.js
  4. └── unicorn.js
  5. └── dist
  1. var gulp = require('gulp');
  2. var stripDebug = require('gulp-strip-debug'); // 仅用于本例做演示
  3. var del = require('del');
  4. var vinylPaths = require('vinyl-paths');
  5.  
  6. gulp.task('clean:tmp', function () {
  7. return gulp.src('tmp/*')
  8. .pipe(stripDebug())
  9. .pipe(gulp.dest('dist'))
  10. .pipe(vinylPaths(del));
  11. });
  12.  
  13. gulp.task('default', ['clean:tmp']);

只有在已经使用了其他的插件之后才需要这样做,否则,请直接使用 gulp.src 来代替。

增量编译打包,包括处理整所涉及的所有文件

在做增量编译打包的时候,有一个比较麻烦的事情,那就是你常常希望操作的是 所有 处理过的文件,而不仅仅是单个的文件。举个例子,你想要只对更改的文件做代码 lint 操作,以及一些模块封装的操作,然后将他们与其他已经 lint 过的,以及已经进行过模块封装的文件合并到一起。如果不用到临时文件的话,这将会非常困难。

使用 gulp-cached 以及 gulp-remember 来解决这个问题。

  1. var gulp = require('gulp');
  2. var header = require('gulp-header');  //给文本文件头部追加内容
  3. var footer = require('gulp-footer');
  4. var concat = require('gulp-concat');
  5. var jshint = require('gulp-jshint'); //js代码校验
  6. var cached = require('gulp-cached');
  7. var remember = require('gulp-remember'); //gulp-remember is a gulp plugin that remembers files that have passed through it. gulp-remember adds all the files it has ever seen back into the stream.
  8.  
  9. var scriptsGlob = 'src/**/*.js';
  10.  
  11. gulp.task('scripts', function() {
  12. return gulp.src(scriptsGlob)
  13. .pipe(cached('scripts')) // 只传递更改过的文件 A temp file based caching proxy task for gulp.
  14. .pipe(jshint()) // 对这些更改过的文件做一些特殊的处理...
  15. .pipe(header('(function () {')) // 比如 jshinting ^^^
  16. .pipe(footer('})();')) // 增加一些类似模块封装的东西
  17. .pipe(remember('scripts')) // 把所有的文件放回 stream
  18. .pipe(concat('app.js')) // 做一些需要所有文件的操作
  19. .pipe(gulp.dest('public/'));
  20. });
  21.  
  22. gulp.task('watch', function () {
  23. var watcher = gulp.watch(scriptsGlob, ['scripts']); // 监视与 scripts 任务中同样的文件
  24. watcher.on('change', function (event) {
  25. if (event.type === 'deleted') { // 如果一个文件被删除了,则将其忘记
  26. delete cached.caches.scripts[event.path]; // gulp-cached 的删除 api
  27. remember.forget('scripts', event.path); // gulp-remember 的删除 api
  28. }
  29. });
  30. });

在 gulp 中运行 Mocha 测试

运行所有的测试用例

  1. // npm install gulp gulp-mocha
  2.  
  3. var gulp = require('gulp');
  4. var mocha = require('gulp-mocha');
  5.  
  6. gulp.task('default', function() {
  7. return gulp.src(['test/test-*.js'], { read: false })
  8. .pipe(mocha({
  9. reporter: 'spec',
  10. globals: {
  11. should: require('should')
  12. }
  13. }));
  14. });

在文件改动时候运行 mocha 测试用例

  1. // npm install gulp gulp-mocha gulp-util
  2.  
  3. var gulp = require('gulp');
  4. var mocha = require('gulp-mocha');
  5. var gutil = require('gulp-util');
  6.  
  7. gulp.task('mocha', function() {
  8. return gulp.src(['test/*.js'], { read: false })
  9. .pipe(mocha({ reporter: 'list' }))
  10. .on('error', gutil.log);
  11. });
  12.  
  13. gulp.task('watch-mocha', function() {
  14. gulp.watch(['lib/**', 'test/**'], ['mocha']);
  15. });

仅仅传递更改过的文件

默认情况下,每次运行时候所有的文件都会传递并通过整个管道。通过使用 gulp-changed 可以只让更改过的文件传递过管道。这可以大大加快连续多次的运行。

  1. // npm install --save-dev gulp gulp-changed gulp-jscs gulp-uglify
  2.  
  3. var gulp = require('gulp');
  4. var changed = require('gulp-changed');
  5. var jscs = require('gulp-jscs');
  6. var uglify = require('gulp-uglify');
  7.  
  8. // 我们在这里定义一些常量以供使用
  9. var SRC = 'src/*.js';
  10. var DEST = 'dist';
  11.  
  12. gulp.task('default', function() {
  13. return gulp.src(SRC)
  14. // `changed` 任务需要提前知道目标目录位置
  15. // 才能找出哪些文件是被修改过的
  16. .pipe(changed(DEST))
  17. // 只有被更改过的文件才会通过这里
  18. .pipe(jscs())
  19. .pipe(uglify())
  20. .pipe(gulp.dest(DEST));
  21. });

从命令行传递参数

  1. // npm install --save-dev gulp gulp-if gulp-uglify minimist
  2.  
  3. var gulp = require('gulp');
  4. var gulpif = require('gulp-if');
  5. var uglify = require('gulp-uglify');
  6.  
  7. var minimist = require('minimist');
  8.  
  9. var knownOptions = {
  10. string: 'env',
  11. default: { env: process.env.NODE_ENV || 'production' }
  12. };
  13.  
  14. var options = minimist(process.argv.slice(), knownOptions);
  15.  
  16. gulp.task('scripts', function() {
  17. return gulp.src('**/*.js')
  18. .pipe(gulpif(options.env === 'production', uglify())) // 仅在生产环境时候进行压缩
  19. .pipe(gulp.dest('dist'));
  20. });
  1. $ gulp scripts --env development

gulp入门之常见处理方式(三)的更多相关文章

  1. 【转】Gulp入门基础教程

    Gulp入门基础教程 原文在此 前言最近流行前端构建工具,苦于之前使用Grunt,代码很难阅读,现在出了Gulp, 真是摆脱了痛苦.发现了一篇很好的Gulp英文教程,整理翻译给大家看看. 为什么使用G ...

  2. 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)

    前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...

  3. Hibernate入门6.Hibernate检索方式

    Hibernate入门6.Hibernate检索方式 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv Hibernate的整体框架已经 ...

  4. (转)前端构建工具gulp入门教程

    前端构建工具gulp入门教程 老婆婆 1.8k 2013年12月30日 发布 推荐 10 推荐 收藏 83 收藏,20k 浏览 本文假设你之前没有用过任何任务脚本(task runner)和命令行工具 ...

  5. 《Gulp 入门指南》 : 使用 gulp 压缩 JS

    <Gulp 入门指南> : 使用 gulp 压缩 JS 请务必理解如下章节后阅读此章节: 安装 Node 和 gulp 访问论坛获取帮助 压缩 js 代码可降低 js 文件大小,提高页面打 ...

  6. Gulp入门与解惑

    Gulp简介 Gulp.js 是一个自动化构建工具,开发者可以使用它在项目开发过程中自动执行常见任务.Gulp.js是基于 Node.js构建的,利用Node.js流的威力,你可以快速构建项目. 安装 ...

  7. css常见布局方式

    CSS常见布局方式 以下总结一下CSS中常见的布局方式.本人才疏学浅,如有错误,请留言指出. 如需转载,请注明出处:CSS常见布局方式 目录: 使用BFC隐藏属性 float + margin abs ...

  8. 一天带你入门到放弃vue.js(三)

    自定义指令 在上面学习了自定义组件接下来看一下自定义指令 自己新建的标签赋予特殊功能的是组件,而指定是在标签上使用类似于属性,以v-name开头,v-on,v-if...是系统指令! v-是表示这是v ...

  9. 《R语言入门与实践》第三章:R 对象

    在这一章,包含的内容有: R 的数据类型 属性 类(特殊的属性) Ruby 的数据结构 R 数据类型 R 可以识别六种类型的数据类型,分别是: double integer character log ...

随机推荐

  1. AutowireCapableBeanFactory 根据名称:自动装配的BeanFactory,其实也是对BeanFactory的增强

    //自动装配的Bean 工厂 public interface AutowireCapableBeanFactory extends BeanFactory { //工厂没有自动装配的Bean int ...

  2. 跨数据库查询——dblink

    现在本地建一个dblink Create database link create public database link DBLINKTEST (名称) connect to MGP(用户名) i ...

  3. 小程序swiper-item内容过多显示不全的解决方案

    最近在项目遇到swiper高度不能自适应,导致swiper-item 里面的内容过多时只能显示一部分,最终解决方案:<swiper current="{{currentTab}}&qu ...

  4. 洛谷P3239 [HNOI2015]亚瑟王

    题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个看脸的游戏,技能 ...

  5. odoo js

    1.相关库/框架 主要:jQuery(使用1.8.3,如果使用新版本,其他jQuery插件也要升级或修改).Underscore.QWeb 其他:都在addons\web\static\lib路径下. ...

  6. csp-s模拟65Simple,Walk, Travel,棋盘题解

    题面:https://www.cnblogs.com/Juve/articles/11639923.html simple: 考试时只想到的暴力exgcd判断 考虑n,m互质的情况: 我们枚举y,对于 ...

  7. Android基础控件ToggleButton和Switch开关按钮

    1.简介 ToggleButton和Switch都是开关按钮,只不过Switch要Android4.0之后才能使用! ToggleButton <!--checked 是否选择--> &l ...

  8. Python数据挖掘之决策树DTC数据分析及鸢尾数据集分析

    Python数据挖掘之决策树DTC数据分析及鸢尾数据集分析 今天主要讲述的内容是关于决策树的知识,主要包括以下内容:1.分类及决策树算法介绍2.鸢尾花卉数据集介绍3.决策树实现鸢尾数据集分析.希望这篇 ...

  9. PAT甲级——A1081 Rational Sum

    Given N rational numbers in the form numerator/denominator, you are supposed to calculate their sum. ...

  10. 用this 对方法的扩展

    *都是静态方法 this指向的是调用的object*