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 相关文章推荐
JavaScript 异步调用框架 (Part 2 - 用例设计)
Aug 03 Javascript
JQuery 选择器 xpath 语法应用
May 13 Javascript
JavaScript 高级篇之函数 (四)
Apr 07 Javascript
jquery实现图片等比例缩放以及max-width在ie中不兼容解决
Mar 21 Javascript
jQuery布局插件UI Layout简介及使用方法
Apr 03 Javascript
Bootstrap每天必学之导航条
Nov 27 Javascript
总结JavaScript三种数据存储方式之间的区别
May 03 Javascript
jquery判断checkbox是否选中及改变checkbox状态的实现方法
May 26 Javascript
Javascript之Date对象详解
Jun 07 Javascript
bootstrap fileinput完整实例分享
Nov 08 Javascript
ES6新特性之字符串的扩展实例分析
Apr 01 Javascript
react 生命周期实例分析
May 18 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 isset()与empty()的使用区别详解
2010/08/29 PHP
php清除和销毁session的方法分析
2015/03/19 PHP
Yii2.0建立公共方法简单示例
2019/01/29 PHP
PHP中__set()实例用法和基础讲解
2019/07/23 PHP
JavaScript检测实例属性, 原型属性
2015/02/04 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
2015/08/22 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
2016/12/13 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
js实现分页功能
2017/05/24 Javascript
ECMAscript 变量作用域总结概括
2017/08/18 Javascript
详解Angular操作cookies方法
2018/06/01 Javascript
layer.msg()去掉默认时间,实现手动关闭的方法
2019/09/12 Javascript
JavaScript如何把两个数组对象合并过程解析
2019/10/10 Javascript
Vue封装Axios请求和拦截器的步骤
2020/09/16 Javascript
JavaScript如何操作css
2020/10/24 Javascript
Python 过滤字符串的技巧,map与itertools.imap
2008/09/06 Python
Python open读写文件实现脚本
2008/09/06 Python
Python写的Socks5协议代理服务器
2014/08/06 Python
python中readline判断文件读取结束的方法
2014/11/08 Python
Django的数据模型访问多对多键值的方法
2015/07/21 Python
浅谈python正则的常用方法 覆盖范围70%以上
2018/03/14 Python
python使用MQTT给硬件传输图片的实现方法
2019/05/05 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
2019/10/30 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
2020/01/20 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
接口自动化多层嵌套json数据处理代码实例
2020/11/20 Python
京东全球售:直邮香港,澳门,台湾,美国,澳大利亚等地区
2017/09/24 全球购物
MyBag中文网:英国著名的时尚包袋电商零售网站
2020/07/31 全球购物
汽车专业人才自我鉴定范文
2013/12/29 职场文书
毕业生个人求职自荐信
2014/02/26 职场文书
社会治安综合治理管理责任书
2014/04/16 职场文书
学生干部培训方案
2014/06/12 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
绵山导游词
2015/02/05 职场文书
同学聚会通知短信
2015/04/20 职场文书