苦B的前端每次在制作和修改页面时,都有一个特定的三部曲:coding-save-F5。很多时候都希望自己一改东西,页面就能立刻显示,而现在LiveReload就能做到这点。
LiveReload会监控你指定的目录中文件,如果有文件被更改,它就自动触发浏览器刷新页面。但如果你修改的是CSS或者图片,页面内容会即时更新,无需重新加载。这样我们不用每次修改文件后,都要去按下F5刷新页面,而是直接就能显示,有点类似所见即所得的编辑模式,特别适合使用双屏coding的人。另外同时结合Sublime text和Emmet LiveStyle,能提高不少开发效率。
LiveReload安装前的准备工作:
安装Node.js和Grunt,如果第一次接触,可以参考:Windows下安装Grunt的指南和相关说明,根据步骤操作,创建完package.json 和 Gruntfile.js这2个文件就行。
接下来,开始配置LiveReload所需要的环境和相关插件。这里所提供的有两种安装方案,根据自己需求进行选择。
方案一:grunt-livereload + Chrome Plug-in
优点:安装、配置简单方便。
缺点:需要配合指定的浏览器插件(Firefox也有相关插件,IE么你懂的)。
1. 需要安装2个插接件:grunt-contrib-watch、connect-livereload
执行命令:npm install --save-dev grunt-contrib-watch connect-livereload
2. 安装浏览器插件:Chrome LiveReload
3. 配置一个Web服务器(IIS/Apache),LiveReload需要在本地服务器环境下运行(对file:///文件路径支持并不是很好)。
4. 修改Gruntfile.js文件:
module.exports = function(grunt) { // 项目配置(任务配置) grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), watch: { client: { files: ['*.html', 'css/*', 'js/*', 'images/**/*'], options: { livereload: true } } } }); // 加载插件 grunt.loadNpmTasks('grunt-contrib-watch'); // 自定义任务 grunt.registerTask('live', ['watch']); };
5. 执行:grunt live
看到如下提示,说明已经开始监听任务:
Running "watch" task
Waiting...
6. 打开我们的页面,例如:http://localhost/
7. 再点击Chrome LiveReload插件的ICON,此时ICON圆圈中心的小圆点变成实心的,说明插件执行成功。此时你改下网站文件看看,是不是实时更新了?
方案二:grunt-contrib-watch + grunt-contrib-connect + grunt-livereload
优点:自动搭建静态文件服务器,不需在自己电脑上搭建Web服务器。
不需要浏览器插件的支持(不现定于某个浏览器)。
不需要给网页手动添加livereload.js。
缺点:对于刚接触的人,配置略显复杂。
1. 安装我们所需要的3个插件:grunt-contrib-watch、grunt-contrib-connect、connect-livereload
执行命令:npm install --save-dev grunt-contrib-watch grunt-contrib-connect connect-livereload
2. 修改Gruntfile.js文件:
module.exports = function(grunt) { // LiveReload的默认端口号,你也可以改成你想要的端口号 var lrPort = 35729; // 使用connect-livereload模块,生成一个与LiveReload脚本 // <script src="http://127.0.0.1:35729/livereload.js?snipver=1" type="text/javascript"></script> var lrSnippet = require('connect-livereload')({ port: lrPort }); // 使用 middleware(中间件),就必须关闭 LiveReload 的浏览器插件 var lrMiddleware = function(connect, options) { return [ // 把脚本,注入到静态文件中 lrSnippet, // 静态文件服务器的路径 connect.static(options.base[0]), // 启用目录浏览(相当于IIS中的目录浏览) connect.directory(options.base[0]) ]; }; // 项目配置(任务配置) grunt.initConfig({ // 读取我们的项目配置并存储到pkg属性中 pkg: grunt.file.readJSON('package.json'), // 通过connect任务,创建一个静态服务器 connect: { options: { // 服务器端口号 port: 8000, // 服务器地址(可以使用主机名localhost,也能使用IP) hostname: 'localhost', // 物理路径(默认为. 即根目录) 注:使用'.'或'..'为路径的时,可能会返回403 Forbidden. 此时将该值改为相对路径 如:/grunt/reloard。 base: '.' }, livereload: { options: { // 通过LiveReload脚本,让页面重新加载。 middleware: lrMiddleware } } }, // 通过watch任务,来监听文件是否有更改 watch: { client: { // 我们不需要配置额外的任务,watch任务已经内建LiveReload浏览器刷新的代码片段。 options: { livereload: lrPort }, // '**' 表示包含所有的子目录 // '*' 表示包含所有的文件 files: ['*.html', 'css/*', 'js/*', 'images/**/*'] } } }); // grunt.initConfig配置完毕 // 加载插件 grunt.loadNpmTasks('grunt-contrib-connect'); grunt.loadNpmTasks('grunt-contrib-watch'); // 自定义任务 grunt.registerTask('live', ['connect', 'watch']); };
5. 执行:grunt live
看到如下提示,说明Web服务器搭建完成,并且开始监听任务:
Running "connect:livereload" (connect) task
Started connect web server on 127.0.0.1:8000.
Running "watch" task
Waiting...
注:执行该命令前,如果你有安装过LiveReload的浏览器插件,必须关闭。
6. 打开我们的页面,例如:http://localhost:8000/ 或 http://127.0.0.1:8000/
注:这里所打开的本地服务器地址,是我们刚才通过connect所搭建的静态文件服务器地址,而不是之前你用IIS或Apache自己搭建Web服务器地址。
7. 开始体验吧。
相关插件文档(GitHub):
grunt-contrib-watch
grunt-contrib-connect
connect-livereload
参考资料:
Grunt by Example - A Tutorial for JavaScript's Task Runner
更新于:2015-08-17
总有小伙伴,通过各种方式给我留言,说自己配置出来运行报错。但通常都无法正确表述问题在哪,这让我很难帮到你什么。另外,我也无法保证所有问题都能即时回复,所以大家可以先通过以下3个步骤,进行自查。
1. 核对下各个插件是否都顺利安装。
2. 检查一边是否有遗漏的步骤和地方。
3. 我把本文的配置信息都上传至了Github,有需要的朋友可以下载下来进行对比:Github:2015-08-17
更新于:2015-10-12
grunt-contrib-connect 0.11.x 版本开始,静态文件服务器的创建,需要安装 serve-static 插件支持,否则会出现错误提示“connect.static is not a function Use.” 另外,启用目录浏览,也需要独立安装 serve-index 插件才能支持。
所以这次补充2个新的插件:serve-static(用于创建静态文件服务器)、serve-index(用于启用目录浏览)
执行命令:npm install --save-dev serve-static serve-index
Gruntfile.js文件更新及调整部分:
// 使用 middleware(中间件),就必须关闭 LiveReload 的浏览器插件 var serveStatic = require('serve-static'); var serveIndex = require('serve-index'); var lrMiddleware = function(connect, options, middlwares) { return [ lrSnippet, // 静态文件服务器的路径 原先写法:connect.static(options.base[0]) serveStatic(options.base[0]), // 启用目录浏览(相当于IIS中的目录浏览) 原先写法:connect.directory(options.base[0]) serveIndex(options.base[0]) ]; };
完整版请查看:Github:2015-10-12
星空星浪 说:
神奇的配置,不过原理还是在页面中植入一段JS来起刷新作用。
March 10, 2017 2:29 pm
sam 说:
我已经完全搬了你的配置到我的文件夹里,但是总是出现,connect.static is not a function use,然后就强制继续,中断
June 4, 2016 11:04 am
sam 说:
我是选择第二个版本的,搞了好久啦
June 4, 2016 11:05 am
梦幻神化 说:
serve-static 插件安装了吗?没有安装的话会出现这问题
June 6, 2016 10:20 am
blac 说:
如果访问的页面是线上的页面,js、css访问的是本地的代码,怎么实现呢
November 27, 2017 8:47 pm
梦幻神化 说:
页面上直接引入livereload.js
December 4, 2017 2:07 pm
langhuan 说:
成功运行,也在浏览器打开了,但是报错:无法访问此网站?请问是什么问题呢,谢谢!
May 5, 2016 5:41 pm
梦幻神化 说:
能否说下 错误信息是什么?
May 9, 2016 11:00 am
langhuan 说:
感谢回复,是我访问目录写错了
May 9, 2016 11:02 am
niko 说:
按照方案一和方案二设置好,运行也显示成功
Running “connect:livereload” (connect) task
Started connect web server on http:localhost:8000
Running “watch” task
Waiting…
但是更改其中的页面,刷新并不生效
浏览器版本chrome 45.0.2454.85
编码工具也试了DW HBuilder
之前我还用过F5刷新,也是安装都没有问题,但是就是刷新不了,大神能帮我看下是什么问题么
(使用方法一,运行成功却没有实时刷新的话,只有2种可能:
1. 网页是否是在服务器环境下运行。
2. 有没忘记点击下Chrome LiveReload插件的ICON,让圆圈变为黑色的实心点。)以上两个问题也都排查了,但是还是无法刷新
November 25, 2015 1:31 pm
niko 说:
按照方案一和方案二设置好,运行也显示成功
Running "connect:livereload" (connect) task
Started connect web server on http:localhost:8000
Running "watch" task
Waiting...
但是更改其中的页面,刷新并不生效
浏览器版本chrome 45.0.2454.85
编码工具也试了DW HBuilder
之前我还用过F5刷新,也是安装都没有问题,但是就是刷新不了,大神能帮我看下是什么问题么
November 25, 2015 11:51 am
喵君 说:
想问一下,less修改了怎么样自动生成css,然后页面也能刷新成less修改后的样子?
November 18, 2015 2:05 pm
梦幻神化 说:
watch任务中 监听less文件便可
November 23, 2015 12:36 pm
番茄 说:
l楼主真的好棒,忍不住要来赞一个
November 11, 2015 12:02 pm
bywwcnll 说:
楼主牛逼不解释!---2015.10.12
(Warning: checkForDownload is not defined Use --force to continue.)
October 12, 2015 12:05 pm
kenberkeley 说:
懒人做法:
① npm uninstall grunt-contrib-connect
② npm install grunt-contrib-connect@0.10 --save-dev
October 11, 2015 4:28 pm
梦幻神化 说:
忘更...
这个确实是最便捷的 哈哈哈
新的写法我也贴上去 看各自自己喜欢用哪种吧
October 12, 2015 12:14 pm
熊猫河马 说:
楼主,我在第二种方案实践中。grunt live 的结果是connect.static is not a function Use.我没有nodejs的背景。不知道是不是这个方法已经失效。求解答 。
October 8, 2015 1:45 pm
梦幻神化 说:
我尝试把插件更新到最新版本,发现确实有这问题。
原因:grunt-contrib-connect 0.11.x 版本开始,创建静态服务器需要 serve-static 插件的支持。
解决方法:稍后我会把新的写法更新到文章和Github中。
October 10, 2015 3:46 pm
Pingback 引用通告: Gulp构建前端自动化工作流之:入门介绍及LiveReload的使用 | 蓝色梦想
Pingback 引用通告: Grunt打造前端自动化工作流(四):项目中配置Grunt – 热前端
古德 说:
这个工具搭建的静态服务器无法执行php文件,怎么破?
June 26, 2015 2:14 pm
少年 说:
第一种方案也尝试了,为什么我.都是运行成功. 但是编辑html或者其他文件都没有实时刷新??
配置检查了, 正确的.
May 25, 2015 11:18 am
梦幻神化 说:
使用方法一,运行成功却没有实时刷新的话,只有2种可能:
1. 网页是否是在服务器环境下运行。
2. 有没忘记点击下Chrome LiveReload插件的ICON,让圆圈变为黑色的实心点。
May 31, 2015 1:22 am
pamwdgjgm 说:
方法二装完了怎么用啊,打开sublime编辑网页没有看到实时的效果啊?麻烦仁兄讲解下
May 22, 2015 10:01 am
少年 说:
我也是这样..
// 静态文件服务器的路径
connect.static(options.base[0]),
// 启用目录浏览(相当于IIS中的目录浏览)
connect.directory(options.base[0]);
我把文件改成这样后正常启动:
但是用sublime text3 编辑器编辑无效果..求解
May 22, 2015 6:04 pm
梦幻神化 说:
@少年 @pamwdgjgm 这和用什么编辑器并没有关系。请先检查下操作步骤,根据步骤操作的话,方法一和方法二均能实现页面自动刷新。另外,有问题的话,一定要请把提问表述清楚,不然没人能够解答。
May 31, 2015 1:11 am
evanxu 说:
方案一 中的gruntfile.js配置有点问题。
watch: {
client: {
files: ['*.html', 'css/*', 'js/*', 'images/**/*']
options: {
livereload: true
}
}
}
会报错,提示
Loading "Gruntfile.js" tasks...ERROR
>> SyntaxError: e:\pc_font\Gruntfile.js:8
>> options: {
>> ^^^^^^^
>> Unexpected identifier
Warning: Task "live" not found. Use --force to continue.
Aborted due to warnings.
-------------------------------------------------------------------------
后来我修改了gruntfile.js:
watch: {
livereload: {
options: {
livereload: true
},
files: ['*.html', 'css/*', 'js/*', 'images/**/*']
}
}
就正常了。
具体问题,未知,盼博主回复~
April 21, 2015 4:50 pm
霜之哀伤额 说:
方案1的插件地址挂掉啦
通过方案2写的,要修改ontions.base,这个是数组
March 30, 2015 3:14 pm
梦幻神化 说:
插件地址没有挂,只是谷歌被屏蔽了,安装的话需要翻墙
May 31, 2015 12:51 am
iswear 说:
Hi,博主和楼上的朋友们,春节快乐。
遇到
running “connect:livereload”(connect)task
warning:root path must be a string use –force to continue
通过使用旧版本的grunt-contrib-connect虽然可以,但是不那么漂亮。正确的方法是:
return [
lrSnippet,
connect.static(options.base),
connect.directory(options.base)
];
将
connect.static(options.base) -> connect.static(options.base[0])
connect.directory(options.base) -> connect.directory(options.base[0])
就可以啦。记得传入string而不是数组。
February 17, 2015 9:02 pm
charles 说:
return[
//把脚本注入到静态文本中
lrSnippet,
//静态文件服务器的路径
connect.static(options.base[0]),
//启用目录浏览(相当于IIS中的目录浏览)
connect.directory(options.base[0])
];
这样去修改就行了
April 7, 2015 5:25 pm
梦幻神化 说:
感谢提示,已对文章内容进行修改。
May 31, 2015 12:46 am
luzuoquan 说:
对php文件的支持 好像不行啊
December 12, 2014 1:17 pm
梦幻神化 说:
支持的,你watch任务里有写监听php文件没?
例:files: ['*.php','*.html', 'css/*', 'js/*', 'images/**/*']
另外:
如果你的网站运行在另外的服务器上(非我们所创建的Grunt Web Server),那你只需要将你网站的IP地址指定到你本地电脑即可。
在你页面上添加LiveReload脚本,例(把[]改成<>):
[script src="http://127.0.0.1:35729/livereload.js?snipver=1" type="text/javascript"][/script]
注:此时的端口号需改成LiveReload的默认端口号
December 15, 2014 5:54 pm
luzuoquan 说:
用grunt-connect-livereload 对php文件好像不支持,对html可以正常访问。
December 12, 2014 1:17 pm
Hardi 说:
方案一的第四步,“修改Gruntfile.js”,Gruntfile.js在哪里啊?
安装完那两个插件后,后一个有三个文件夹:
connect-livereload
grunt
grunt-contrib-watch
搜索了下,里面有好多叫Gruntfile.js的文件,到底修改的是那个呢?
November 25, 2014 12:04 pm
梦幻神化 说:
需要自己手动创建下
November 25, 2014 12:37 pm
Hardi 说:
恩,sorry没看清,你开头写到了,
我按照你的代码粘贴进了gruntfiles.js,然后安装了三个插件,运行grunt live,提示:
running "connect:livereload"(connect)task
warning:root path must be a string use --force to continue
aborted due to warnings.
November 25, 2014 1:09 pm
梦幻神化 说:
我看了下,现在grunt-contrib-connect默认安装的是最新版0.9.0, 但其版本在0.8.0以上的话就会发生这个问题。
最好的解决办法是把它降到0.7.1。
不用删除之前安装的文件,直接执行以下命令覆盖就行:npm install grunt-contrib-connect@0.7.1 --save-dev
November 25, 2014 9:02 pm
Hardi 说:
恩,成功了,谢谢啦!
November 26, 2014 10:30 am
Hardi 说:
话说你的网站应该弄一个发邮件提醒用户评论有新回复的功能,否则老得上来查。不过你回复蛮快的说,嘻嘻,谢谢啦
November 26, 2014 10:33 am
梦幻神化 说:
好提议,回头弄个!
November 26, 2014 10:11 pm
琴琴 说:
方案二时,运行grunt live
Running "connect:livereload" (connect) task
Warning:root path must be a string Use --force to continue.
Aborted due to warnings.
November 21, 2014 10:31 am
梦幻神化 说:
你用的grunt-contrib-connect如果是0.8.0或以上版本的的话,尝试将版本降到0.7.1
November 25, 2014 2:57 pm
祝仙森 说:
还有一个神器F5刷新~
May 16, 2014 1:29 pm
jin 说:
方案二测试的时候没有效果
January 8, 2014 1:53 pm
梦幻神化 说:
grunt live 命令执行以后提示什么?
January 9, 2014 3:05 pm
andi 说:
方案二中的问题,可以参考下这个。 http://stackoverflow.com/questions/27176920/grunt-connect-not-starting-with-error-root-path-must-be-a-string
简单方法就是:将
// 静态文件服务器的路径
connect.static(options.base),
// 启用目录浏览(相当于IIS中的目录浏览)
connect.directory(options.base)
改为:
// 静态文件服务器的路径
connect.static(options.base[0]),
// 启用目录浏览(相当于IIS中的目录浏览)
connect.directory(options.base[0])
March 1, 2015 11:55 pm