Grunt 之 watch 和 livereload
现在 watch 中已经集成了 livereload ,所以把它们放在一起说明。
watch 可以监控特定的文件,在添加文件、修改文件、或者删除文件的时候自动执行自定义的任务,比如 livereload 等等。
1. 安装
项目定义在 GitHub 上,地址:https://github.com/gruntjs/grunt-contrib-watch
可以通过 NPM 直接进行安装
npm install grunt-contrib-watch --save-dev
安装之后,需要在 Gruntfile.js 中添加任务的注册。
grunt.loadNpmTasks('grunt-contrib-watch');
通过 grunt watch 运行 watch 任务。
2. 配置 watch
与 connect 类似,在 watch 下面定义自己的子任务,下面的示例将会监控 src 目录下的任意 *.html 文件,在文件被修改之后,输出被修改的文件名。
这里通过 watch 的事件进行处理。
'use strict';  
module.exports = function (grunt) {  
    // Project configuration.
    grunt.initConfig({  
        watch:{
            start:{
                files: ['src/*.html']
            }
        }
    });
    grunt.event.on('watch', function(action, filepath, target) {
          grunt.log.writeln(target + ': ' + filepath + ' has ' + action);
    });
    grunt.loadNpmTasks('grunt-contrib-watch');
}
我们启动 watch 任务,注意这个任务会持续监控。
PS C:\study\grunt> grunt watch
Running "watch" task
Waiting...
start: src\index.html has changed
>> File "src\index.html" changed.
Completed in 0.001s at Sun Sep 06 2015 14:52:52 GMT+0800 (China Standard Time) - Waiting...
这里我们使用了 files 参数,这个参数可以为一个路径字符串或者一个字符串的数组,作为监控的目标。路径的写法可以参考:Grunt 之通配符
多数情况下,我们希望在文件发生变化之后,直接执行特定的任务,比如在修改了 *.js 的脚本文件之后,自动进行文件检查。这可以通过 tasks 来直接声明。
这里的 jshint 是我们后面会讲到的一个 javascript 语法检查库,现在还不能用呀。
watch: {
  scripts: {
    files: ['**/*.js'],
    tasks: ['jshint']
  },
},
这里我们自定义一个名为 hello 的任务。
tasks 是一个任务名称的字符串或者,一个任务名称的字符串数组,作为我们执行的任务。
'use strict';  
module.exports = function (grunt) {  
    // Project configuration.
    grunt.initConfig({  
        watch:{
            start:{
                files: ['src/*.html'],
                tasks: ['hello']
            }
        }
    });
    grunt.registerTask('hello', 'Hello, world task description.', function() {
            grunt.log.writeln('Hello, world.');
    });
    grunt.loadNpmTasks('grunt-contrib-watch');
}
3. 高级选项
可以通过 options 配置更加详细的设置。
1. options.spawn
boolean 类型,默认 true。默认会创建一个新的子进程来执行触发的任务。通过设置为 false,可以使得触发的任务可以共享进程上下文,并且提高速度。但是,这会导致监控任务容易崩溃,所以,请尽量使用这个特性,在新的子进程中执行任务。
watch: {
  scripts: {
    files: ['**/*.js'],
    tasks: ['jshint'],
    options: {
      spawn: false,
    },
  },
},
2. options.interrupt
boolean 类型,默认为 false。还是和进程相关。
在文件发生修改的时候,会生成子进程来执行任务,默认的行为是对于每个目标来说,在上一个处理完成之后,仅仅生成一个新的子进程来执行任务。设置 interrupt 为 true,将会导致中止上一个进程,生成一个新进程来处理最后的变更。
watch: {
  scripts: {
    files: '**/*.js',
    tasks: ['jshint'],
    options: {
      interrupt: true,
    },
  },
},
3. options.debounceDelay
这是整数类型的参数,如果同样的文件或者路径被修改,需要等待多长时间才触发事件。默认 500 毫秒。
watch: {
  scripts: {
    files: '**/*.js',
    tasks: ['jshint'],
    options: {
      debounceDelay: 250,
    },
  },
},
4. options.event
字符串或者数组,默认为 'all'
指定监控目标的特定事件类型,可以为 'all', 'changed', 'added' 和 'deleted'.
watch: {
  scripts: {
    files: '**/*.js',
    tasks: ['generateFileManifest'],
    options: {
      event: ['added', 'deleted'],
    },
  },
},
5. options.reload
boolean 类型参数,默认为 false。
默认情况下,如果 Gruntfile.js 文件被监控,在这个文件被修改之后,会导致监控任务重新启动。并且重新加载 Gruntfile.js。
如果 reload 设置为 true,任何被监控文件的修改都会导致监控任务重新启动。除非你的 Gruntfile.js 依赖于其它文件,否则不使用这个参数。
watch: {
  configFiles: {
    files: [ 'Gruntfile.js', 'config/*.js' ],
    options: {
      reload: true
    }
  }
}
6. options.forever
boolean 类型参数,默认为 true。
这个整个任务级别的参数,不能在单个目标上配置。默认情况下,监控任务会处理 grunt.fatal 和 grunt.warn ,防止导致的退出监控问题。如果你不希望监控任务覆盖 grunt.fatal 和 grunt.warn ,可以将 forever 设置为 false。
options.atBegin
boolean 类型,默认为 false。
在监控任务启动的时候,自动触发对应的任务。
7. options.cwd
字符串或者对象类型,默认为 process.cwd()
设置当前的工作目录,默认为 process.cwd(),可以设置为字符串的目录来定义监控和产生的子任务的目录,或者一个对象来描述各自独立的路径。
 options: {
    cwd: {
        files: 'match/files/from/here',
        spawn: 'but/spawn/files/from/here'
    }
}
4. livereload
这就是配合 connect 的 livereload 了。我们单独拿出来说明。
它是 options 的一个属性,类型为 boolean, 数值,或者配置对象。默认为 false
设置为 true 等价设置为 35729.
实际上,会启用一个支持重新加载的服务器,这个服务器工作在上述端口号上,通过这个服务器可以获取一个脚本,当文件被修改之后,通过这个脚本通知前端浏览器自动重新加载内容。
例如:
watch: {
  css: {
    files: '**/*.sass',
    tasks: ['sass'],
    options: {
      livereload: true,
    },
  },
},
启动之后,实际上在指定的端口上创建了一个服务器,如果访问的话,可以看到返回的信息。
访问:http://localhost:35729/
返回的内容
{"tinylr":"Welcome","version":"0.0.5"}
需要的话,还可以工作在 https 上,那就需要通过 key 和 cert 进行配置了。
watch: {
  css: {
    files: '**/*.sass',
    tasks: ['sass'],
    options: {
      livereload: {
        port: 9000,
        key: grunt.file.read('path/to/ssl.key'),
        cert: grunt.file.read('path/to/ssl.crt')
        // you can pass in any other options you'd like to the https server, as listed here: http://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener
      }
    },
  },
},
更多内容可以查看 enable livereload on your HTML.
Grunt 之 watch 和 livereload的更多相关文章
- 分享Grunt.js配置: watch + liveReload 实时监测文件变化自动刷新浏览器
		
http://www.tuicool.com/articles/2eaQJn 用Grunt配置watch和liveReload组件,可以实时检测指定的文件变化并自动刷新浏览器.目前基本已经成为了我的必 ...
 - grunt使用watch和livereload的Gruntfile.js的配置
		
周末在家看angularJS, 用grunt的livereload的自动刷新, 搞了大半天, 现在把配置贴出来, 免得以后忘记了, 只要按照配置一步步弄是没有问题的; 开始的准备的环境安装是: (1) ...
 - 详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
		
http://www.jb51.net/article/70415.htm 含Grunt系列教程 这篇文章主要通过两种方案详解Grunt插件之LiveReload实现页面自动刷新,需要的朋友可以 ...
 - Grunt插件之LiveReload 实现页面自动刷新,所见即所得编辑
		
苦B的前端每次在制作和修改页面时,都有一个特定的三部曲:coding-save-F5.很多时候都希望自己一改东西,页面就能立刻显示,而现在LiveReload就能做到这点. LiveReload会监控 ...
 - Grunt 插件使用汇总
		
最近使用了很多 Grunt 插件,这里把使用 Grunt 中涉及的从开发.代码检查.单元测试.E2E 测试,直到发布所涉及的插件,做一个比较完全的汇总. 环境搭建 1. 创建 Web 前端开发环境 2 ...
 - grunt 合并压缩任务
		
module.exports = function(grunt) { // LiveReload的默认端口号,你也可以改成你想要的端口号 var lrPort = 35729; // 使用connec ...
 - grunt live
		
{ "name": "grunt-live-test", "version": "0.1.0", "autho ...
 - 初探grunt.js
		
package.js { "name": "ttd_v3", "version": "0.1.0", "aut ...
 - Grunt之watch详解
		
Grunt 之 watch 和 livereload 现在 watch 中已经集成了 livereload ,所以把它们放在一起说明. watch 可以监控特定的文件,在添加文件.修改文件.或者删除文 ...
 
随机推荐
- git在本地创建远程仓库
			
类似的博文,在前面的帖子里面也提到过,当时讲述的是一个入门级别的.其URL是ssh://username@repo-host-address/repo-path这种格式. 今天再说说如何创建类似Git ...
 - UIPickerView自定义背景
			
#import <UIKit/UIKit.h> @interface MyPicker : UIPickerView { } @end -------------------------- ...
 - JQ查找替换
			
resultStr = resultStr.replace(/\n/gi , "<br />"); //可以全部替换resultStr = resultStr.repl ...
 - json 解析
			
纠结了两天的json数组反序列化,终于在同事的帮助下,找到方法了,特作笔记如下: using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Sy ...
 - Python 从sketch中读取文件
			
=============================== RESTART: Shell =============================== >>> import o ...
 - java处理日期时间
			
java.util.Calendar Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR.MONTH.DAY_OF_MONTH.HOUR 等 日历字段之间的转换提供了一些方法,并为操作 ...
 - IOS Bugs5 linker command failed with exit code 1 (use -v to see invocation)
			
Ld /Users/Rubert/Library/Developer/Xcode/DerivedData/OC_Language-emftyzftyvhdpuaxipddjmpnpvox/Build/ ...
 - 正则表达式中的\b
			
转自百度知道:https://zhidao.baidu.com/question/58688915.html\b表示的应该是ASCII码中的BS字符(退格字符),匹配字与字中间那个看不见的东西(即一个 ...
 - SpringJDBC
			
<!-- JdbcTemplate:最基础的springJDBC模板,这个模板支持最简单的jdbc数据库访问功能以及简单的索引参数查询 NamedParameterJdbcTemplate:使用 ...
 - git的使用(3) 多分支情况下的pull
			
当你存在多个分支的时候,你需要pull下来分支上面的内容,你需要指定分支进行同步命令: git pull origin branch (branch 是你的分支的名字)