grunt插件之watch

当文件被添加、更改或删除时,运行预定义的任务

安装插件

npm install grunt-contrib-watch --save-dev

安装完插件后,可以在Gruntfile中用这行代码启用插件

grunt.loadNpmTasks('grunt-contrib-watch');

可以使用grunt watch命令启动这个任务

设置

files

类型: String|Array

定义了这个任务将要监视的文件,可以为一个路径字符串或者一个字符串的数组.

tasks

类型: `String|Array`
这定义了当监视的文件事件发生时要运行的任务。

options.spawn

类型:Boolean
默认值:true

默认会创建一个新的子进程来执行触发的任务。通过设置为 false,可以使得触发的任务可以共享进程上下文,并且提高速度。但是,这会导致监控任务容易崩溃,所以,请尽量使用这个特性,在新的子进程中执行任务。

watch: {
  scripts: {
    files: ['**/*.js'],
    tasks: ['jshint'],
    options: {
      spawn: false,
    },
  },
},
options.interrupt

类型:Boolean
默认值:false

在文件发生修改的时候,会生成子进程来执行任务,默认的行为是对于每个目标来说,在上一个处理完成之后,仅仅生成一个新的子进程来执行任务。设置 interrupttrue,将会导致中止上一个进程,生成一个新进程来处理最后的变更。

watch: {
  scripts: {
    files: '**/*.js',
    tasks: ['jshint'],
    options: {
      interrupt: true,
    },
  },
},
options.debounceDelay

类型:Integer
默认值:500

如果同样的文件或者路径被修改,需要等待多长时间才触发事件。默认 500 毫秒。

options.event

类型:String|Array
默认值:'all'

指定监控目标的特定事件类型,可以为 'all', 'changed', 'added' 和 'deleted'.

options.reload

类型:Boolean
默认值:false

默认情况下,如果 Gruntfile.js 文件被监控,在这个文件被修改之后,会导致监控任务重新启动。并且重新加载 Gruntfile.js

如果 reload 设置为 true,任何被监控文件的修改都会导致监控任务重新启动。除非你的 Gruntfile.js 依赖于其它文件,否则不使用这个参数。

options.forever

类型:Boolean
默认值:true

这是整个任务级别的参数,不能在单个目标上配置。默认情况下,监控任务会处理 grunt.fatalgrunt.warn ,防止导致的退出监控问题。如果你不希望监控任务覆盖 grunt.fatalgrunt.warn ,可以将 forever 设置为 false

options.dateFormat

类型: Function

这是一个任务级别的参数,不能在单个目标上配置。默认情况下,当watch完成任务时,它将显示消息Completed in 1.301s at Thu Jul 18 2013 14:58:21 GMT-0700 (PDT) - Waiting...您可以通过提供自己的函数来覆盖此消息:

atch: {
  options: {
    dateFormat: function(time) {
      grunt.log.writeln('The watch finished in ' + time + 'ms at' + (new Date()).toString());
      grunt.log.writeln('Waiting for more changes...');
    },
  },
  scripts: {
    files: '**/*.js',
    tasks: 'jshint',
  },
},
options.atBegin

类型:Boolean
默认值:false

此选项将在监视器启动时触发每个指定任务的运行。

options.livereload

类型:Boolean|Number|Object
默认值:false

设置为true或设置为端口号以启动实时加载,默认和推荐的端口号是35729

如果启用了一个实时重新加载服务器,则将启动每个目标的watch任务。然后在指定的任务运行后,将通过修改的文件触发实时重新加载服务器。

另请参阅如何在HTML上启用livereload

例:

watch: {
  css: {
    files: '**/*.sass',
    tasks: ['sass'],
    options: {
      livereload: true,
    },
  },
},

livereload传递一个对象允许侦听特定端口和主机名/ IP或https连接(通过keycert参数 )

options.cwd

类型:String|Object
默认值:process.cwd()

能够设置当前工作目录。默认为process.cwd()。可以是一个字符串,以设置cwd来匹配文件和生成任务或一个对象来独立设置

ptions: {
  cwd: {
    files: 'match/files/from/here',
    spawn: 'but/spawn/files/from/here'
  }
}

在发射事件之前剥离路径:

options: {
  cwd: {
    files: 'a/path',
    event: 'a/path'
  }
}

a/path在发射事件之前将被剥离。此选项对于指定与livereload一起使用的基本目录很有用。

options.livereloadOnError

类型:Boolean
默认值:true

如果执行的任务遇到错误,则可以防止实时重新启动。如果设置为false,则只有当所有任务成功完成时,才会触发活动载入。

示例

//简单的配置,在任何添加文件,更改或删除的时候运行jshint
grunt.initConfig({
  watch: {
    files: ['**/*'],
    tasks: ['jshint'],
  },
});
//高级配置 在添加,更改或删除特定文件时运行特定任务。
grunt.initConfig({
  watch: {
    gruntfile: {
      files: 'Gruntfile.js',
      tasks: ['jshint:gruntfile'],
    },
    src: {
      files: ['lib/*.js', 'css/**/*.scss', '!lib/dontwatch.js'],
      tasks: ['default'],
    },
    test: {
      files: '<%= jshint.test.src %>',
      tasks: ['jshint:test', 'qunit'],
    },
  },
});
使用watch事件

watch当观察文件被修改时,此任务将发出一个事件。如果您希望编辑文件时简单通知,或者如果您正在使用此任务与另一项任务相一致,这将非常有用。以下是使用watch事件的简单示例:

grunt.initConfig({
  watch: {
    scripts: {
      files: ['lib/*.js'],
    },
  },
});
grunt.event.on('watch', function(action, filepath, target) {
  grunt.log.writeln(target + ': ' + filepath + ' has ' + action);
});

watch事件不是用来替换配置和运行标准的Grunt API的,如果尝试从watch事件中执行任务,可能会遇到错误

根据需要编译文件

一个非常普遍的要求是只根据需要编译文件.这里是一个例子,只有改变内容的文件才执行jshint任务:

grunt.initConfig({
  watch: {
    scripts: {
      files: ['lib/*.js'],
      tasks: ['jshint'],
      options: {
        spawn: false,
      },
    },
  },
  jshint: {
    all: {
      src: ['lib/*.js'],
    },
  },
});

// On watch events configure jshint:all to only run on changed file
grunt.event.on('watch', function(action, filepath) {
  grunt.config('jshint.all.src', filepath);
});

如果您需要动态修改配置,则spawn设置为false,以使watch在相同的上下文下运行。

如果您同时保存多个文件,您可以选择更强大的方法:

var changedFiles = Object.create(null);
var onChange = grunt.util._.debounce(function() {
  grunt.config('jshint.all.src', Object.keys(changedFiles));
  changedFiles = Object.create(null);
}, 200);
grunt.event.on('watch', function(action, filepath) {
  changedFiles[filepath] = action;
  onChange();
});
Live Reloading

Live Reloading已经内置在watch任务中.设置选项livereloadtrue使用默认端口35729或设置为自定义端口:livereload: 1337

grunt.initConfig({
  watch: {
    options: {
      livereload: true,
    },
    css: {
      files: ['public/scss/*.scss'],
      tasks: ['compass'],
    },
  },
});

您还可以为单个监视目标配置实时重新载入,或运行多个实时重新加载服务器。只要确定您是否启动在不同端口上运行的多台服务器:

grunt.initConfig({
  watch: {
    css: {
      files: ['public/scss/*.scss'],
      tasks: ['compass'],
      options: {
        // Start a live reload server on the default port 35729
        livereload: true,
      },
    },
    another: {
      files: ['lib/*.js'],
      tasks: ['anothertask'],
      options: {
        // Start another live reload server on port 1337
        livereload: 1337,
      },
    },
    dont: {
      files: ['other/stuff/*'],
      tasks: ['dostuff'],
    },
  },
});

在HTML中启用实时重新加载

一旦启动了live reload服务器,就可以访问live reload脚本。在页面上启用实时重新加载,在闭合标签</body>前面田间一个script标签指向livereload.js

<script src="//localhost:35729/livereload.js"></script>

请随意将此脚本添加到您的模板环境中,并以某种形式的dev标志进行切换。

使用实时重新加载浏览器扩展

您可以通过安装浏览器扩展程序来重新加载页面,而不是在页面中添加脚本标记。请访问如何安装和使用浏览器扩展来帮助安装浏览器的扩展

一旦安装,请使用默认的实时重新加载端口35729,浏览器扩展将自动重新加载您的页面,而不需要<script>标签。

使用连接中间件

由于在开发时使用了live reloading,所以您可能想要禁用生成的构建(并且不使用浏览器扩展)。一种方法是使用连接中间件将脚本标签插入到页面中。尝试使用connect-livereload中间件将实时重新加载脚本注入到您的页面中。

封装自己的Live Reload

框架tiny-lr可以很轻松得实现Live reloading,鼓励阅读文档tiny-lr,如果想自己触发live reload服务,只需将文件POST到URL:http://localhost:35729 /changed,或者如果你想封装自己的live reload 实现,请使用以下示例:

// Create a live reload server instance
var lrserver = require('tiny-lr')();

// Listen on port 35729
lrserver.listen(35729, function(err) { console.log('LR Server Started'); });

// Then later trigger files or POST to localhost:35729/changed
lrserver.changed({body:{files:['public/css/changed.css']}});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,418评论 25 707
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,130评论 2 34
  • 中文翻译 ng help ng build 构建您的应用程序并将其放入输出路径(dist /默认情况下)。 别名:...
    4ea0af17fd67阅读 2,009评论 0 0
  • 本文参加#未完待续,就要表白#活动,本人承诺,文章内容为原创,且未在其他平台发表过。 命中与你相依,我会默默...
    喜欢就是一种放肆阅读 122评论 0 4