node.js中watch机制详解


Posted in Javascript onNovember 17, 2014

几乎所有构建系统都选择使用watch机制来解决开发过程中需要反复生成构建后文件的问题,但在watch机制下,长期以来我们必须忍受修改完代码,保存完代码必须喝口茶才能刷新看看效果的问题。在这里我们尝试探讨为什么watch不是银弹,并尝试寻找一种更好的方案来解决这个问题。

watch基于的事实

当一个文件修改,我们能知道其修改可能导致的文件修改,那么重新构建这些文件即可。

通常对于文件A,构建成文件B这种场景,这种对应关系是极好确定的。但现实场景下,构建过程往往不是那么简单。例如:

文件A + 文件B(被文件A引用) -> 文件C
在这种场景下,文件B的修改,可能难以定位哪些文件需要重新跑构建任务,因为可能有很多文件引用了文件B。

除非我们建立一个依赖树,并在每次文件更新的情况下更新依赖树,并根据新的依赖树触发文件构建。但这对每一个插件都需要自行实现这个机制,并且极易出错。故实际上watch机制仅仅是重跑了整个task。所以当项目越来越大的时候,watch机制将越来越慢(因为越来越多文件需要重新跑整个过程,即使通过缓存减少了整个过程所需的耗时)。

解决方案

src直接可用

AlloyTeam & @ldjking,简单来说直接让src直接可跑,把构建任务放置在浏览器端,甚至根本不构建,既可做到及时修改及时刷新,在开发过程中减少了时间消耗。线下构建仅仅负责性能优化上的问题,不负责开发效率。
典型代表有LESS、React等。但也有一些问题:

难以在浏览器端实现优雅的构建方式,难以提供强大的功能进一步减少开发成本,大部分只能采用类似<style type="text/less"></style>的方式引入脚本。
开发模式下的执行顺序不一定和实际场景相同,可能导致隐形bug出现,例如实现一个HTML inline由于开发模式下inline是异步的,而发布模式下inline时同步的,产生莫名其妙的bug。
浏览器编译性能堪忧,例如js版的sass,编译速度几乎无法忍受。
需要维护线上、线下两套构建系统,增加了工具开发成本。
本地服务器动态构建

一个事实是:在合理的规范支持下,我们可以从浏览器请求的文件,回溯到该文件构建过程中的入口文件。这样我们就可以动态触发一次构建过程。

通过在本地建立一个服务器,让服务器捕获请求后,在服务器中动态构建。只要回溯到入口文件,我们便能将入口文件丢进gulp插件组成的管道中,则输出便是浏览器需要的文件。

这样我们就能解决上面的所有问题。

Javascript 相关文章推荐
js 分页全选或反选标识实现代码
Aug 09 Javascript
jquery得到font-size属性值实现代码
Sep 30 Javascript
JavaScript基础教程之alert弹出提示框实例
Oct 16 Javascript
解决js函数闭包内存泄露问题的办法
Jan 25 Javascript
js实现的简单图片浮动效果完整实例
May 10 Javascript
Bootstrap按钮组简单实现代码
Mar 06 Javascript
JS简单实现数组去重的方法示例
Mar 27 Javascript
Spring shiro + bootstrap + jquery.validate 实现登录、注册功能
Jun 02 jQuery
JS实现页面打印(整体、局部)
Aug 18 Javascript
vue2.0 使用element-ui里的upload组件实现图片预览效果方法
Sep 04 Javascript
JS轮播图的实现方法
Aug 24 Javascript
编写v-for循环的技巧汇总
Dec 01 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(jquery)
Nov 16 #Javascript
js构造函数、索引数组和属性的实现方式和使用
Nov 16 #Javascript
JQuery表单验证插件EasyValidator用法分析
Nov 15 #Javascript
不到30行JS代码实现Excel表格的方法
Nov 15 #Javascript
Node.js中HTTP模块与事件模块详解
Nov 14 #Javascript
jquery中append()与appendto()用法分析
Nov 14 #Javascript
jQuery 插件开发指南
Nov 14 #Javascript
You might like
PHP 显示客户端IP与服务器IP的代码
2010/10/12 PHP
PHP无刷新上传文件实现代码
2011/09/19 PHP
php 模拟POST提交的2种方法详解
2013/06/17 PHP
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
分析PHP中单双引号的误区和双引号小隐患
2016/07/19 PHP
php cli模式下获取参数的方法
2017/05/05 PHP
php判断电子邮件是否正确方法
2018/12/04 PHP
(JS实现)MapBar中坐标的加密和解密的脚本
2007/05/16 Javascript
js控制框架刷新
2008/08/01 Javascript
juqery 学习之四 筛选查找
2010/11/30 Javascript
jquery中的on方法使用介绍
2013/12/29 Javascript
vue.js+boostrap项目实践(案例详解)
2016/09/21 Javascript
jQuery中Find选择器用法示例
2016/09/21 Javascript
JavaScript省市区三级联动菜单效果
2016/09/21 Javascript
浅谈Javascript中的Label语句
2016/12/14 Javascript
Iscrool下拉刷新功能实现方法(推荐)
2017/06/26 Javascript
Node.js 利用cheerio制作简单的网页爬虫示例
2018/03/01 Javascript
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
Vue 路由 过渡动效 数据获取方法
2018/07/31 Javascript
详解jQuery中的easyui
2018/09/02 jQuery
JS实现时间校验的代码
2020/05/25 Javascript
vue使用svg文件补充-svg放大缩小操作(使用d3.js)
2020/09/22 Javascript
[47:43]Alliance vs KG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python中使用socket发送HTTP请求数据接收不完整问题解决方法
2015/02/04 Python
Python生成不重复随机值的方法
2015/05/11 Python
python如何将图片转换为字符图片
2020/08/19 Python
windows下python安装小白入门教程
2018/09/18 Python
python 模拟创建seafile 目录操作示例
2019/09/26 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
Python使用re模块验证危险字符
2020/05/21 Python
Window10上Tensorflow的安装(CPU和GPU版本)
2020/12/15 Python
通过css3动画和opacity透明度实现呼吸灯效果
2019/08/09 HTML / CSS
计算机应用毕业生自荐信
2013/10/23 职场文书
信访工作汇报材料
2014/10/27 职场文书
PHP解决高并发问题
2021/04/01 PHP
Python中非常使用的6种基本变量的操作与技巧
2022/03/22 Python