Gulp 目前的错误处理方式有点操蛋,一旦发生错误进程就挂了,得手动去重启。虽然开发者预期在 gulp 4 中解决此问题 ,但 gulp 4 什么时候发布并没有明确时间表,在此之前,还是很有必要了解一下更优雅的错误处理方式,除非你钟情于反复在命令行里输入 gulp 然后回车。

使用 Stream 事件 API 处理错误

Stream 发生错误时,会触发 error 事件,监听 error 事件进行错误处理可以避免 gulp 进程崩溃。

基本错误处理

下面的例子中,添加了 Less 编译的错误处理,Less 发生编译错误时,会在命令行输出错误信息,gulp 进程不会挂掉,修正错误后,watch 任务将继续执行。

注意:使用 gulp-util 只是使错误日志格式与 gulp 的日志保持一致,如果不想多一个依赖,可以直接使用 console 。

var gulp = require('gulp');
var less = require('gulp-less');
var csso = require('gulp-csso');
var gutil = require('gulp-util'); gulp.task('less', function() {
return gulp.src('less/app.less')
.pipe(less())
.on('error', function(err) {
gutil.log('Less Error!', err.message);
this.end();
})
.pipe(csso())
.pipe(gulp.dest('./dist'))
}); gulp.task('watch', function() {
gulp.watch('less/**/*.less', ['less']);
});

gulp.watch 与 Browserify 中的错误处理

Browserify 中的常规流与 gulp 中的 vinyl 对象流有点不同,browserify 的错误处理中需要手动触发 end 事件,以停止流在管道中传送。如果不添加 this.emit('end'); ,进程仍然会挂掉。

var gulp = require('gulp');
var browserify = require('browserify');
var source = require("vinyl-source-stream"); gulp.task('browserify', function(){
return browserify('./main.js').bundle()
.on('error', function(err){
console.log(err.message);
this.emit('end');
})
.pipe(source('main.out.js'))
.pipe(gulp.dest('./dist'));
});

使用插件

使用 Stream 的事件 API 虽然可以处理错误,但是在每个插件后面都需要添加错误监听函数,有点恶心,还好有专门的插件处理这个问题。

gulp-plumber

gulp-plumber 可以阻止 gulp 插件发生错误导致进程退出并输出错误日志。

var gulp = require('gulp');
var less = require('gulp-less');
var csso = require('gulp-csso');
var plumber = require('gulp-plumber');
gulp.task('less', function() {
return gulp.src('less/app.less')
.pipe(plumber())
.pipe(less())
.pipe(csso())
.pipe(gulp.dest('./dist'))
});

这比添加错误监听事件省事多了。

stream-combiner2

stream-combiner2 把多个 stream 合并为一个,也就是说只需要添加一个错误监听,相比之下,还是 gulp-plumber 方便。

var combiner = require('stream-combiner2');
var uglify = require('gulp-uglify');
var gulp = require('gulp'); gulp.task('test', function() {
var combined = combiner.obj([
gulp.src('bootstrap/js/*.js'),
uglify(),
gulp.dest('public/bootstrap')
]); // any errors in the above streams will get caught
// by this listener, instead of being thrown:
combined.on('error', console.error.bind(console)); return combined;
});

gulp处理错误的更多相关文章

  1. gulp遇到错误:The following tasks did not complete: default Did you forget to signal async completion?

    运行之后会像下面一样报这个错误,因为事按着一个视频来写的,所以 原本的gulpfile.js如下 const gulp = require('gulp') gulp.task('default',() ...

  2. gulp 打包错误 TypeError: Path must be string. Received undefined

    Running gulp gives “path.js:7 throw new TypeError('Path must be a string. Received ' + inspect(path) ...

  3. gulp使用小结(一)

    这篇文章不会介绍 gulp 的起源.发展:不会去一个个讲解 gulp API:也不想出现大段大段的 gulpfile.js 代码:更木有帮你分析 gulp 实现原理,只有一些我自己对 gulp 的使用 ...

  4. gulp前端自动化构建工具使用

    (1)新建项目目录gulp_web (2)项目目录下建目录src里面存放需要进行gulp处理的文件目录及文件 (3)gulpfile.js文件内容为声明需要打包应用的gulp组件及打包文件路径和打包任 ...

  5. 『奇葩问题集锦』Fedora ubuntu 下使用gulp 报错 Error: watch ENOSPC 解决方案

    用gulp启动,错误如下 Error: watch ENOSPC at exports._errnoException (util.js:746:11) at FSWatcher.start (fs. ...

  6. 一篇迟到的gulp文章

    前言 这篇文章本应该在去年17年写的,但因为种种原因没有写,其实主要是因为懒(捂脸).gulp出来的时间已经很早了,16年的时候还很流行,到17年就被webpack 碾压下去了,不过由于本人接触gul ...

  7. 一篇迟到的gulp文章,代码合并压缩,less编译

    前言 这篇文章本应该在去年17年写的,但因为种种原因没有写,其实主要是因为懒(捂脸).gulp出来的时间已经很早了,16年的时候还很流行,到17年就被webpack 碾压下去了,不过由于本人接触gul ...

  8. gulp常用插件之gulp-notify使用

    更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-notify这是一款gulp通知插件. 更多使用文档请点击访问gulp-notify工具官网. 安装 一键安装不多解释 npm inst ...

  9. ES6转换器之Babel

    ES6部分功能没有支持,所以想学习ES6,得先有个转换器,就是将ES6的代码转换为ES5. 我这里用的是Gulp + Bable的形式来将ES6转换为ES5的. 前提: (1).Gulp和Bable都 ...

随机推荐

  1. 使用 TXT 文本存储

    将爬取的数据以 TXT 文本形式存储: import requests data = requests.get('http://www.baidu.com/').text with open('/tm ...

  2. Java bean中布尔类型使用注意

    JavaBean是一个标准,遵循标准的Bean是一个带有属性和getters/setters方法的Java类. JavaBean的定义很简单,但是还有有一些地方需要注意,例如Bean中含有boolea ...

  3. windows 命令行下 简单好用的查看端口占用情况的方法

    在windows命令行窗口下执行: C:\>netstat -aon|findstr "4444" TCP 127.0.0.1:4444 0.0.0.0:0 LISTENIN ...

  4. 《转》Robot Framework 的安装配置和简单的实例介绍

    Robot Framework 介绍 Robot Framework 是一款基于 Python 的功能自动化测试框架.它具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进 ...

  5. C语言变量的存储布局

    分析以下代码中变量存储空间如何分配: //MemSeg.c: 代码无意义,仅供分析用 #include <stdio.h> #include <stdlib.h> //mall ...

  6. 【EF框架】另一个 SqlParameterCollection 中已包含 SqlParameter。

    查询报表的时候需要通过两次查询取出数据. 第一次,用count(*)查出总数: 第二次,用rownumber分页取出想要的页内容: 为了防止sql注入,使用SqlParameter来传递参数 var ...

  7. 法律&道德

    西弗森是美国加州一名95岁的老妇人,2010年12月份的一天,她在家清理房间,当她翻开一叠纸的时候,一本书从里面掉了下来,她弯腰拾起来,发现是一本名叫<水上飞机独自飞>的书,再一看书页里的 ...

  8. gradle-4.1-all.zip

    1. https://services.gradle.org/distributions/ https://services.gradle.org/distributions/gradle-4.1-a ...

  9. Elasticsearch学习之深入搜索六 --- 平衡搜索结果的精准率和召回率

    1. 召回率和精准度 比如你搜索一个java spark,总共有100个doc,能返回多少个doc作为结果,就是召回率,recall 精准度,比如你搜索一个java spark,能不能尽可能让包含ja ...

  10. LeetCode 22 Generate Parentheses(找到所有匹配的括号组合)

    题目链接 : https://leetcode.com/problems/generate-parentheses/?tab=Description   给一个整数n,找到所有合法的 () pairs ...