标签:
先说下这两个插件配合的用处,简单的说,它们可以拯救你的F5。connect用于建立一个静态服务器,watch监听文件的修改并自动实时刷新浏览器的页面。
还是options走起。
connect: { options: { port: 9000, protocol: ‘http‘, hostname: ‘localhost‘ }, serve :{ options: { base: [ ‘src‘ ] } } }
然后grunt,打印出这么个玩意儿
Running "connect:serve" (connect) task Started connect web server on http://localhost:9000 Done, without errors.
访问http://localhost:9000/,居然报“这个网页无法使用”,什么意思?
原因是当grunt任务结束时,connect任务也结束了,也就是静态服务器开启过,在执行的一瞬间。这是给人类访问的吗,我当时的表情是这样的:
其实这个毫秒级的服务器还真不是给人访问的,是用来测试的:开启服务器,跑测试代码,关闭服务器。
connect: { options: { port: 9000, protocol: ‘http‘, hostname: ‘localhost‘ }, serve :{ options: { base: [ ‘src‘ ], keepalive: true } } }
比较下上面的,感受一下
Running "connect:serve" (connect) task Waiting forever... Started connect web server on http://localhost:9000
正常访问,http://localhost:9000直接链接到了index.html,这应该是服务器端的一个重定向,我们把index.html修改为main.html,然后手动刷新页面,看到的是整个文件夹下的目录结构(注意这不是静态服务器必须的功能,只能说connect在这一点上做的很细腻)。
base: [ ‘src‘, ‘dest‘ ]
dest是前一回的输出目录,目录结构是这样的
Running "connect:serve" (connect) task Waiting forever... Started connect web server on http://localhost:9000 [D] server GET / 200 7484 - 10.211 ms
open: ‘<%=connect.options.protocol%>://<%=connect.options.hostname%>:<%=connect.options.port%>/main.html‘
还可以接受Object作为value,Object结构如下
{ target: ‘<%=connect.options.protocol%>://<%=connect.options.hostname%>:<%=connect.options.port%>/main.html‘, appName: ‘chrome‘, // name of the app that opens callback: function() {} // called when the app has opened }
Running "connect:serve" (connect) task Waiting forever... Fatal error: Port 8081 is already in use by another process.
设置此option为true,再次执行,自动换到了8082端口
Running "connect:serve" (connect) task Waiting forever... Started connect web server on http://localhost:8082
onCreateServer: function(server, connect, options) { var io = require(‘socket.io‘).listen(server); io.sockets.on(‘connection‘, function(socket) { // do something with socket }); }
middleware : function(connect, options, middlewares) { return middlewares; //当前行为保持不变 }
当value为function array时,传入参数request、response、next
middleware: [function(req, res, next) { next(); }]
以上两个option涉及比较多的nodejs概念,不做详述
connect: { options: { port: 9000, protocol: ‘http‘, hostname: ‘localhost‘ }, serve :{ options: { base: [ ‘src‘ ], keepalive: true, livereload: true } } }
执行grunt,访问服务器的任何一个有内容的链接,打开开发者工具,发现body(记住该html必须要有body,偷懒就看不到效果了)的底部产生了这样一段代码
<script>//<![CDATA[ document.write(‘<script src="//‘ + (location.hostname || ‘localhost‘) + ‘:35729/livereload.js?snipver=1"><\/script>‘) //]]></script><script src="//localhost:35729/livereload.js?snipver=1"></script>
这段代码单独存在是没有意义的,必须配合watch
本来想再介绍一下watch的,发现已经这么长了,就仅说说livereload的实现吧。
watch是监视器,监听文件的改动并进行相应的动作。它有一个专门的option是用来实现网页自动刷新的功能的:livereload。是的,和上面的option是一模一样的。
那么,给出最终的代码
connect: { options: { port: 9000, open: true, hostname: ‘localhost‘, livereload: true //声明给 watch 监听的端口 }, livereload :{ options: { base: [ ‘src‘ ] } } }, watch: { livereload: { options: { livereload: true }, files: [ ‘src/{,*/}*‘ ] } }
细心就会发现,keepalive这个值不见了,因为watch的存在grunt会一直处于执行的状态,所以服务器不会终止。反倒是如果设置了keepalive为true,connect会一直阻塞,watch就不会执行,得不到想要的结果了。
欲知后事如何,且听下回分解。
标签:
原文地址:http://www.cnblogs.com/tarol/p/4242360.html