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对表单元素的基本操作使用总结
Jul 18 Javascript
JavaScript实现的一个倒计时的类
Mar 12 Javascript
JavaScript通过Date-Mask将日期转换成字符串的方法
Jun 04 Javascript
js实现文字滚动效果
Mar 03 Javascript
JavaScript生成带有缩进的表格代码
Jun 15 Javascript
使用jquery给新生的th绑定hover事件的实例
Feb 10 Javascript
Angular2安装angular-cli
May 21 Javascript
React-Native左右联动List的示例代码
Sep 21 Javascript
Express之托管静态文件的方法
Jun 01 Javascript
Vue实例的对象参数options的几个常用选项详解
Nov 08 Javascript
Vue3 响应式侦听与计算的实现
Nov 11 Javascript
Vue3.0 手写放大镜效果
Jul 25 Vue.js
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代码
2006/12/06 PHP
php 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
php中is_null,empty,isset,unset 的区别详细介绍
2013/04/28 PHP
php xml常用函数的集合(比较详细)
2013/06/06 PHP
PHP中读取文件的8种方法和代码实例
2014/08/05 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
JavaScript在IE和Firefox浏览器下的7个差异兼容写法小结
2010/06/18 Javascript
js自定义事件代码说明
2011/01/31 Javascript
jQuery EasyUI API 中文文档 可调整尺寸
2011/09/29 Javascript
JavaScript的继承的封装介绍
2013/10/15 Javascript
JavaScript获得url所有参数键值表的方法
2015/03/21 Javascript
jquery实现的3D旋转木马特效代码分享
2015/08/25 Javascript
js实现兼容PC端和移动端滑块拖动选择数字效果
2017/02/16 Javascript
Node.JS文件系统解析实例详解
2017/05/15 Javascript
JavaScript箭头(arrow)函数详解
2017/06/04 Javascript
了解前端理论:rscss和rsjs
2019/05/23 Javascript
jQuery操作元素的内容和样式完整实例分析
2020/01/10 jQuery
Python代码解决RenderView窗口not found问题
2016/08/28 Python
python Celery定时任务的示例
2018/03/13 Python
基于python的图片修复程序(实现水印去除)
2018/06/04 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
2018/09/04 Python
PYTHON如何读取和写入EXCEL里面的数据
2019/10/28 Python
全网最详细的PyCharm+Anaconda的安装过程图解
2021/01/25 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
HTML5事件方法全部汇总
2016/05/12 HTML / CSS
欧缇丽英国官方网站:Caudalie英国
2016/08/17 全球购物
英国高街品牌:Miss Selfridge(塞尔弗里奇小姐)
2016/09/21 全球购物
TCP协议通讯的过程和步骤是什么
2015/10/18 面试题
高中毕业自我鉴定
2013/12/19 职场文书
五好家庭申报材料
2014/12/20 职场文书
年会主持人开场白台词
2015/05/29 职场文书
2015年食品安全宣传周活动总结
2015/07/09 职场文书
2015年教学副校长工作总结
2015/07/22 职场文书
保险公司增员口号
2015/12/25 职场文书
《藏戏》教学反思
2016/02/23 职场文书
Java并发编程之详解CyclicBarrier线程同步
2021/06/23 Java/Android