先说下这两个插件配合的用处,简单的说,它们可以拯救你的F5。connect用于建立一个静态服务器,watch监听文件的修改并自动实时刷新浏览器的页面。

  还是options走起。

  connect(V0.9.0)的options(github地址)

  1. port: 静态服务器监听的端口,默认8000
  2. protocol: 协议名,支持'http'和'https',默认'http'
  3. hostname: 合法的主机名,默认'0.0.0.0',意味着只要能ping到本机的设备都可以通过ip访问,设为'localhost'则仅支持本机访问
  4. base: 静态服务器文件根目录,支持String、Array、Object
    ok,介绍完上面四个就可以搭个简单的静态服务器了,文件目录还是接上回,src下结构

    把能用上的option全用上
    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任务也结束了,也就是静态服务器开启过,在执行的一瞬间。这是给人类访问的吗,我当时的表情是这样的:
    其实这个毫秒级的服务器还真不是给人访问的,是用来测试的:开启服务器,跑测试代码,关闭服务器。

    作为一个灵长类生物,要访问就要用到下面这个option

  5. keepalive: 不解释了,直接跑起来
    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的value可以设置为对象吗,对象包含两个属性,path对应上面的文件夹名,options会传递给connect.static模块,详情见页面
    同样还可以设置为数组,可以是字符串数组,也可以是对象数组,我们把main.html改回index.html,然后修改base

    base: [
    'src',
    'dest'
    ]

    dest是前一回的输出目录,目录结构是这样的

    src和dest下面都有index.html,那我们通过http://localhost:9000/访问到的是哪一个呢,实际操作一下,发现是src下面的index.html,可见文件的搜索是前面的文件夹优先级更高
    我们把两个文件夹下的index.html都改为main.html,再次访问http://localhost:9000/,得到的目录结构确是dest的,可见文件夹索引的显示是后面的文件夹优先级更高
    如果我想让它显示src的目录结构,有没有办法呢?有,就是下面的option

  6. directory: 默认为null,设置成'src'就可以完成上面的目标了
  7. debug: 打印每次http请求,默认是false,设置为true后访问http://localhost:9000/,打印出来的如下
    Running "connect:serve" (connect) task
    Waiting forever...
    Started connect web server on http://localhost:9000
    [D] server GET / - 10.211 ms
  8. open: 是否自动打开浏览器,默认是false,设置为true则运行grunt后自动在浏览器打开http://localhost:9000/,同时也可以接受url作为value,比如我们想直接访问main.html
    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
    }
  9. useAvailablePort: 当端口被占用时自动换其他端口,默认为false
    我开启另外一个监听8081的服务器,然后把配置中port改为8081,执行grunt失败,打印出来的log为
    Running "connect:serve" (connect) task
    Waiting forever...
    Fatal error: Port 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
  10. onCreateServer: 创建server成功的回调函数,接受function or function array作为value,默认为null。
    github上给出的示例如下:
    onCreateServer: function(server, connect, options) {
    var io = require('socket.io').listen(server);
    io.sockets.on('connection', function(socket) {
    // do something with socket
    });
    }
  11. middleware: 中间件,接受function or function array作为value。
    当value为function时,传入参数connect、options、middlewares
    middleware : function(connect, options, middlewares) {
    return middlewares; //当前行为保持不变
    }

    当value为function array时,传入参数request、response、next

    middleware: [function(req, res, next) {
    next();
    }]

    以上两个option涉及比较多的nodejs概念,不做详述

  12. livereload: 特意把这个option放到了最后,因为这个option是实现实时刷新的核心,依赖于connect-livereload进行实现,所以将这个插件安装上先
    默认值是false,一般接受端口号作为参数,设置为true时相当于设置为39729,so
    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的配合

  本来想再介绍一下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就不会执行,得不到想要的结果了。

  欲知后事如何,且听下回分解。

grunt之connect、watch的更多相关文章

  1. 前端开发 Grunt 之 Connect

    在前端开发过程中,我们需要在开发过程中,将开发中的站点部署到服务器上,然后,在浏览器中查看实际的效果,在 Grunt 环境下,可以直接使用集成在 Grunt 中的 Connect 插件完成站点服务器的 ...

  2. Grunt 之 Connect

    前端开发 Grunt 之 Connect 在前端开发过程中,我们需要在开发过程中,将开发中的站点部署到服务器上,然后,在浏览器中查看实际的效果,在 Grunt 环境下,可以直接使用集成在 Grunt ...

  3. 前端开发 Grunt 之 Connect详解

    在前端开发过程中,我们需要在开发过程中,将开发中的站点部署到服务器上,然后,在浏览器中查看实际的效果,在 Grunt 环境下,可以直接使用集成在 Grunt 中的 Connect 插件完成站点服务器的 ...

  4. Grunt - 前端开发所见即所得

    首先要安装全局的grunt-cli sudo npm install grunt-cli -g 1,项目中初始化npm文件,项目名不要和[关键词]如grunt重复,一直回车即可 npm init 2, ...

  5. Grunt - grunt-contrib-connect

    快速搭建本地化服务 推荐加强版 : http://www.cnblogs.com/CyLee/p/5331055.html 首先要安装全局的grunt-cli sudo npm install gru ...

  6. Grunt 插件使用汇总

    最近使用了很多 Grunt 插件,这里把使用 Grunt 中涉及的从开发.代码检查.单元测试.E2E 测试,直到发布所涉及的插件,做一个比较完全的汇总. 环境搭建 1. 创建 Web 前端开发环境 2 ...

  7. Warning: connect.static is not a function

    grunt-contrib-connect从0.11.x版本开始不支持connect.static和connect.directory 你应该安装serve-static(加载静态文件)和serve- ...

  8. 页面livereload width grunt

    step-1.   安装node 环境 step-2.  npm  install grunt-cli  \ grunt http://www.gruntjs.net/docs/getting-sta ...

  9. grunt、Browsersync服务及weinre远程调试

    一.grunt server服务 前端开发时,经常需要把静态文件映射成web服务,传统的做法是丢到apache,但太重太不友好了.开发angular的时候,官方的chrome插件对file:///的支 ...

随机推荐

  1. Vue组件基础用法

    前面的话 组件(Component)是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.根据项目需求,抽象出一些组件,每个组件里包含了展现.功能和样式.每个页面,根据自己所需, ...

  2. nodejs01--什么是nodejs,nodejs的基本使用

    nodejs使用范围 -直接在cmd命令行运行,在你的电脑上直接运行 -可以搭建一个web服务器(express,koa) -一些基本的使用 -modules是如何工作的 -npm管理modules ...

  3. 计算机四级网络工程师--《操作系统(Operating System)》重点内容学习

    开篇语 今天开始看<操作系统>,没办法,计算机网络技术还算有点底子.至于操作系统要不是以前看过一些这方面的书籍,以及上学期学了单片机工作原理,我估计我真的是懵逼的!所幸,在网上找的233网 ...

  4. C语言程序设计进阶 翁恺 第4周编程练习

    第4周编程练习 查看帮助 返回 第4周编程练习 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业 ...

  5. laravel 中使用ajax和vue总结

    最近写一个项目是基于laravel框架的,这个框架传言是为艺术而创作的优雅框架,简洁分明的风格,很吸引我,所以最近研究比较多.本次就是基于该框架然后将Vue插件加入实现一定的功能,vue插件本身强大, ...

  6. BaseAction 使用

    public class AreaAction extends BaseAction<Area> { @Autowired private AreaService areaService; ...

  7. zabbix 3.2.7 (源码包)安装部署

    Zabbix 3.2.7 + CentOS7 安装 环境准备: 操作系统 CentOS Linux release 7.2.1511 (Core) zabbix server 10.30.94.60 ...

  8. Java 脚本引擎

    脚本引擎,就是一个编程语言的解释器,它的功能是解释执行用户的程序文本,将它译成计算机能执行的机器代码,完成一系列的功能. Java脚本引擎简单地说就是指Java提供的一组兼容操作各种脚本语言的的API ...

  9. vue elementUI之Form表单 验证

    首先说一下 我在form表单里面遇见的坑: 1.例如我要给后台传的不是对象,而是一个数组,怎么写验证? 2.比如我有四个弹出框,都要做验证,这个时候就要注意了,每一个弹出框的ref都不能给的一样,并且 ...

  10. JavaWeb(三)servlet

    Servlet * 什么是Servlet 是运行在web服务器端的Java应用程序,它使用JAVA语言编写,具有Java语言的优点.与Java程序的区别:Servlet对象主要封装了对Http请求的处 ...