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 相关文章推荐
jQuery实现的Div窗口震动特效
Jun 09 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
Feb 25 Javascript
15个常用的jquery代码片段
Dec 19 Javascript
第二章之Bootstrap 页面排版样式
Apr 25 Javascript
javascript判断firebug是否开启的方法
Nov 23 Javascript
seajs实现强制刷新本地缓存的方法分析
Oct 16 Javascript
在Vue项目中使用snapshot测试的具体使用
Apr 16 Javascript
Element-Ui组件 NavMenu 导航菜单的具体使用
Oct 24 Javascript
js+html实现点名系统功能
Nov 05 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
Jan 08 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
Jul 21 Javascript
JavaScript实现滚动加载更多
Dec 27 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
用libTemplate实现静态网页的生成
2006/10/09 PHP
解决GD中文乱码问题
2007/02/14 PHP
php实现通用的信用卡验证类
2015/03/24 PHP
微信JSSDK分享功能图文实例详解
2019/04/08 PHP
使用PHP开发留言板功能
2019/11/19 PHP
jQuery表格行换色的三种实现方法
2011/06/27 Javascript
jquery tab插件精简版分享
2011/09/10 Javascript
从数据结构的角度分析 for each in 比 for in 快的多
2013/07/07 Javascript
jquery实现metro效果示例代码
2013/09/06 Javascript
jquery 构造函数在表单提交过程中修改数据
2015/05/25 Javascript
基于Jquery easyui 选中特定的tab
2015/11/17 Javascript
快速使用Bootstrap搭建传送带
2016/05/06 Javascript
jQuery滚动插件scrollable.js用法分析
2017/05/25 jQuery
让你彻底掌握es6 Promise的八段代码
2017/07/26 Javascript
React中上传图片到七牛的示例代码
2017/10/10 Javascript
vue单页应用在页面刷新时保留状态数据的方法
2018/09/21 Javascript
[02:19]DOTA选手解说齐贺岁
2018/02/11 DOTA
python网络编程学习笔记(10):webpy框架
2014/06/09 Python
详解python之简单主机批量管理工具
2017/01/27 Python
Python实现的多线程同步与互斥锁功能示例
2017/11/30 Python
在Django中输出matplotlib生成的图片方法
2018/05/24 Python
使用Python编写Prometheus监控的方法
2018/10/15 Python
Pyqt5实现英文学习词典
2019/06/24 Python
python opencv 二值化 计算白色像素点的实例
2019/07/03 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
2019/08/02 Python
与Django结合利用模型对上传图片预测的实例详解
2019/08/07 Python
python selenium 获取接口数据的实现
2020/12/07 Python
斐乐美国官方网站:FILA美国
2019/03/01 全球购物
园林设计师自荐信
2013/11/18 职场文书
城管执法人员纪律作风整顿思想汇报
2014/09/13 职场文书
2015年母亲节活动策划方案
2015/05/04 职场文书
Python基础之数据类型知识汇总
2021/05/18 Python
Python Flask请求扩展与中间件相关知识总结
2021/06/11 Python
厉害!这是Redis可视化工具最全的横向评测
2021/07/15 Redis
Python实现提取PDF简历信息并存入Excel
2022/04/02 Python
Fluentd搭建日志收集服务
2022/09/23 Servers