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的变量作用域深入理解
Oct 25 Javascript
js中查找最近的共有祖先元素的实现代码
Dec 30 Javascript
js加强的经典分页实例
Mar 15 Javascript
通过javascript获取iframe里的值示例代码
Jun 24 Javascript
js分页工具实例
Jan 28 Javascript
如何用angularjs制作一个完整的表格
Jan 21 Javascript
JS模态窗口返回值兼容问题的完美解决方法
May 28 Javascript
JS获取复选框的值,并传递到后台的实现方法
May 30 Javascript
jQuery实现鼠标滑过图片移动特效
Dec 08 Javascript
利用JS实现简单的日期选择插件
Jan 23 Javascript
React学习笔记之事件处理(二)
Jul 02 Javascript
微信小程序页面间传递数组对象方法解析
Nov 06 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+jQuery实现自动补全功能源码
2013/05/15 PHP
PHP SPL标准库之SplFixedArray使用实例
2015/05/12 PHP
火狐4、谷歌12不支持Jquery Validator的解决方法分享
2011/06/20 Javascript
B/S模式项目中常用的javascript汇总
2013/12/17 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
JS实现单行文字不间断向上滚动的方法
2015/01/29 Javascript
JS实现转动随机数抽奖特效代码
2020/04/16 Javascript
jquery中表单 多选框的一种巧妙写法
2015/09/06 Javascript
Bootstrap项目实战之首页内容介绍(全)
2016/04/25 Javascript
移动端使用localStorage缓存Js和css文的方法(web开发)
2016/09/20 Javascript
javascript创建对象的3种方法
2016/11/02 Javascript
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
2017/04/26 Javascript
angular6开发steps步骤条组件
2019/07/04 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
JS判断浏览器类型与操作系统的方法分析
2020/04/30 Javascript
[01:10:58]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
linux系统使用python获取cpu信息脚本分享
2014/01/15 Python
python中的字典详细介绍
2014/09/18 Python
Python中isnumeric()方法的使用简介
2015/05/19 Python
Python多进程机制实例详解
2015/07/02 Python
python3 发送任意文件邮件的实例
2018/01/23 Python
redis之django-redis的简单缓存使用
2018/06/07 Python
pandas 将list切分后存入DataFrame中的实例
2018/07/03 Python
Django REST Framework序列化外键获取外键的值方法
2019/07/26 Python
python统计文章中单词出现次数实例
2020/02/27 Python
Java如何基于wsimport调用wcf接口
2020/06/17 Python
Python pip使用超时问题解决方案
2020/08/03 Python
Python os库常用操作代码汇总
2020/11/03 Python
CSS3教程(1):什么是CSS3
2009/04/02 HTML / CSS
利用三角函数在canvas上画虚线的方法
2018/01/11 HTML / CSS
国际贸易个人求职信范文
2014/01/04 职场文书
课外科技活动总结
2014/08/27 职场文书
2014年大学宣传部工作总结
2014/12/19 职场文书
2016年大学生社区服务活动总结
2016/04/06 职场文书
新西兰:最新留学学习计划书写作指南
2019/07/15 职场文书
使用Oracle命令进行数据库备份与还原
2021/12/06 Oracle