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 相关文章推荐
用正则表达式 动态创建/增加css style script 兼容IE firefox
Mar 10 Javascript
asp(javascript)全角半角转换代码 dbc2sbc
Aug 06 Javascript
Jquery同辈元素选中/未选中效果的实例代码
Aug 01 Javascript
jQuery的基本概念与高级编程
May 14 Javascript
基于jQuery实现二级下拉菜单效果
Feb 01 Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
May 17 Javascript
基于BootStrap实现局部刷新分页实例代码
Aug 08 Javascript
vue.js实现表格合并示例代码
Nov 30 Javascript
JavaScript中Object基础内部方法图
Feb 05 Javascript
Vue中使用webpack别名的方法实例详解
Jun 19 Javascript
Vue实现点击显示不同图片的效果
Aug 10 Javascript
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
Dec 17 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 和 MySQL 时区的一点总结
2008/03/26 PHP
php文件怎么打开 如何执行php文件
2011/12/21 PHP
对淘宝URL中ID提取的PHP代码
2013/09/01 PHP
php中异常处理方法小结
2015/01/09 PHP
php微信公众号开发之翻页查询
2018/10/20 PHP
如何用javascript去掉字符串里的所有空格
2007/02/08 Javascript
JavaScript高级程序设计(第3版)学习笔记6 初识js对象
2012/10/11 Javascript
THREE.JS入门教程(1)THREE.JS使用前了解
2013/01/24 Javascript
点击弹出层效果&amp;弹出窗口后网页背景变暗效果的实现代码
2014/02/10 Javascript
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
2016/01/26 Javascript
Javascript设计模式之观察者模式(推荐)
2016/03/29 Javascript
Angular2数据绑定详解
2017/04/18 Javascript
Bootstrap模态框插件使用详解
2017/05/11 Javascript
JS实现无缝循环marquee滚动效果
2017/05/22 Javascript
jQuery实现base64前台加密解密功能详解
2017/08/29 jQuery
Vue中&quot;This dependency was not found&quot;问题的解决方法
2018/06/19 Javascript
element-ui 中的table的列隐藏问题解决
2018/08/24 Javascript
vue悬浮可拖拽悬浮按钮的实例代码
2019/08/20 Javascript
JavaScript数组排序的六种常见算法总结
2020/08/18 Javascript
Python解析nginx日志文件
2015/05/11 Python
Python 中的Selenium异常处理实例代码
2018/05/03 Python
python生成以及打开json、csv和txt文件的实例
2018/11/16 Python
Python 通过调用接口获取公交信息的实例
2018/12/17 Python
python实现列表的排序方法分享
2019/07/01 Python
Python netmiko模块的使用
2020/02/14 Python
Python转换字典成为对象,可以用&quot;.&quot;方式访问对象属性实例
2020/05/11 Python
惠普加拿大在线商店:HP加拿大
2017/09/15 全球购物
Coltorti Boutique官网:来自意大利的设计师品牌买手店
2018/11/09 全球购物
英国标志性生活方式品牌:Skinnydip London
2019/12/15 全球购物
市场营销专业推荐信
2013/11/03 职场文书
实习生的自我评价
2014/01/08 职场文书
酒店员工职业生涯规划
2014/02/25 职场文书
《云房子》教学反思
2014/04/20 职场文书
学雷锋标语
2014/06/25 职场文书
关于长城的导游词
2015/01/30 职场文书
学生逃课万能检讨书2000字
2015/02/17 职场文书