Gulp.js watch错误处理笔记

如下gulpfile.js文件:

 代码如下 复制代码
var gulp = require('gulp'),
  coffee = require('gulp-coffee'),
  path = {
    scripts: ['coffee/**/*.coffee']
  };
gulp.task('coffee', function() {
  return gulp.src(path.scripts)
    .pipe(coffee())
    .pipe(gulp.dest('js'));
});
gulp.task('watch', function() {
  gulp.watch(path.scripts, ['coffee']);
});

命令行下执行:

 代码如下 复制代码
gulp watch

gulp watch命令监控.coffee文件变化,并自动编译成js文件。
问题是,Zed有自动保存文件的功能,CoffeeScript语句输入一半,切换到其他窗口做点其他事情,Zed就把文件保存好了。gulp watch监测到文件变化,试图编译.coffee文件,但因为语句仅有一半,于是gulp报错并强制退出。
这么一来,我不时就要重启gulp watch命令。

解决办法

一个最简单的解决办法,是利用gutil.log捕捉错误,而不是任由错误被抛出:

 代码如下 复制代码
var gulp = require('gulp'),
  coffee = require('gulp-coffee'),
  gutil = require('gulp-util'),
  path = {
    scripts: ['coffee/**/*.coffee']
  };
gulp.task('coffee', function() {
  return gulp.src(path.scripts)
    .pipe(coffee())
    .on('error', gutil.log) // 在这里捕捉编译错误
    .pipe(gulp.dest('js'));
});
gulp.task('watch', function() {
  gulp.watch(path.scripts, ['coffee']);
});

但是,这种处理方式,gulp watch在碰上错误时虽然不再强制退出,但也不再继续。gulp watch命令名存实亡,这时对.coffee文件做的修改,并不能被编译。
更美好的处理方式是使用gulp-plumber1:
npm install gulp-plumber --save
新的gulpfile.js文件:

 代码如下 复制代码
var gulp = require('gulp'),
  coffee = require('gulp-coffee'),
  plumber = require('gulp-plumber'),
  path = {
    scripts: ['coffee/**/*.coffee']
  };
gulp.task('coffee', function() {
  return gulp.src(path.scripts)
    .pipe(plumber()) //plumber给pipe打补丁
    .pipe(coffee())
    .pipe(gulp.dest('js'));
});
gulp.task('watch', function() {
  gulp.watch(path.scripts, ['coffee']);
});

这样哪怕编译错误,gulp watch命令也能正常工作。

原文来自:陈三博客,zfanw.com 感谢站长

时间: 2024-07-29 20:12:23

Gulp.js watch错误处理笔记的相关文章

前端任务构建利器Gulp.js使用指南

在软件开发中,任务运行器的好处是不言而喻的.它们可以帮助自动运行常见的冗长的任务,让你可以专注于更重要的事情中,比如敲出很棒的代码.说的严肃点,自动运行一些比如图片压缩.代码压缩.单元测试以及更多的任务的技能,简直就是节省时间的利器. 对于很多前端开发者而言,时下使用最多的任务管理器就是Grunt了,一个可以让你在Gruntfile.js文件中使用JavaScript定义 各种运行任务的工具.基本上,只要你了解JavaScript,创建一个Grunt任务是非常简单直接的事情.丰富的第三方插件比如

ie 11-IE11 js参数错误,想知道问题出在哪里

问题描述 IE11 js参数错误,想知道问题出在哪里 一个08年的asp.net程序,想同的环境,连机器都是一样的,为什么我的电脑上运行是总是报js的参数错误,测试起来很麻烦,求问题的根源所在 解决方案 08年到现在7年了,,可能是浏览器兼容的问题 解决方案二: 贴出你的错误信息.你这样说神都帮不了你 解决方案三: web.cofig没配置好,而且什么错误也没说..IE11去掉了很多dom特性,自己检查下IE11 javascript及相关兼容性更新

Three.js源码阅读笔记(Object3D类)_基础知识

这是Three.js源码阅读笔记的第二篇,直接开始. Core::Object3D Object3D似乎是Three.js框架中最重要的类,相当一部分其他的类都是继承自Object3D类,比如场景类.几何形体类.相机类.光照类等等:他们都是3D空间中的对象,所以称为Object3D类.Object3D构造函数如下: 复制代码 代码如下: THREE.Object3D = function () { THREE.Object3DLibrary.push( this ); this.id = THR

JS表单学习笔记(思维导图)

导图   本文转自博客园xingoo的博客,原文链接:JS表单学习笔记(思维导图),如需转载请自行联系原博主.

可简单避免的三个JS发布错误

Web应用程序开发是倾向于在客户端运行所有用户逻辑和交互代码,让服务器暴露REST或者RPC接口.编译器是针对JS作为一个平台,第二版 ECMAScript正是考虑到这一点在设计.客户端框架例如Backbone, Ember和Require鼓励创建功能丰富的应用程序,不仅有丰富的代码,而且各个组件,组件与数据之间有很多相互作用. 这真的很好,或许还能产生一些优秀的用户体验,但是毫无疑问的是,这是很难开发web应用程序和web页面. 根本原因是在互联网上服务你的代码和数据,运行在一些随机的浏览器上

Vue.js第二天学习笔记(vue-router)_javascript技巧

vue中vue-router的使用: main.js如何配置(es6的写法):在引用之前记得先   npm 下所需要的vue import Vue from 'vue' import App from './App.vue' import Router from 'vue-router' import Resource from 'vue-resource' //import VueTouch from 'vue-touch' var VueTouch = require('vue-touch'

可简单避免的三个JS发布错误的详细介绍_基础知识

Web应用程序开发是倾向于在客户端运行所有用户逻辑和交互代码,让服务器暴露REST或者RPC接口.编译器是针对JS作为一个平台,第二版 ECMAScript正是考虑到这一点在设计.客户端框架例如Backbone, Ember和Require鼓励创建功能丰富的应用程序,不仅有丰富的代码,而且各个组件,组件与数据之间有很多相互作用.这真的很好,或许还能产生一些优秀的用户体验,但是毫无疑问的是,这是很难开发web应用程序和web页面.根本原因是在互联网上服务你的代码和数据,运行在一些随机的浏览器上,在

Vue.js第一天学习笔记(数据的双向绑定、常用指令)_javascript技巧

数据的双向绑定(ES6写法)  效果: 没有改变 input 框里面的值时: 将input 框里面的值清空时: 重新给  input 框输入  豆豆 后页面中  span  里绑定{{testData.name}}的值随着 input 框值的变化而变化. 在Vue.js中可以使用v-model指令在表单元素上创建双向数据绑定.并且v-model指令只能用于:<input>.<select>.<textarea>这三种标签. <template> <di

学习Node.js模块机制的笔记

一.CommonJS的模块规范 Node与浏览器以及 W3C组织.CommonJS组织.ECMAScript之间的关系 Node借鉴CommonJS的Modules规范实现了一套模块系统,所以先来看看CommonJS的模块规范. CommonJS对模块的定义十分简单,主要分为模块引用.模块定义和模块标识3个部分. 1. 模块引用 模块引用的示例代码如下: var math = require('math'); 在CommonJS规范中,存在require()方法,这个方法接受模块标识,以此引入一