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中常用编程知识
Apr 08 Javascript
纯css实现窗户玻璃雨滴逼真效果
Aug 23 Javascript
JS日期格式化之javascript Date format
Oct 01 Javascript
node.js 动态执行脚本
Jun 02 Javascript
JQuery实现图片轮播效果
May 08 jQuery
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
Sep 07 Javascript
基于node.js实现爬虫的讲解
Feb 18 Javascript
关于layui的动态图标不显示的解决方法
Sep 04 Javascript
js实现窗口全屏示例详解
Sep 17 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
Apr 26 Javascript
jQuery 添加元素和删除元素的方法
Jul 15 jQuery
在Vue中使用Viser说明(基于AntV-G2可视化引擎)
Oct 28 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
在mysql数据库原有字段后增加新内容
2009/11/26 PHP
让PHP开发者事半功倍的十大技巧小结
2010/04/20 PHP
PHP的autoload机制的实现解析
2012/09/15 PHP
php像数组一样存取和修改字符串字符
2014/03/21 PHP
从零开始学YII2框架(六)高级应用程序模板
2014/08/20 PHP
php类中的$this,static,final,const,self这几个关键字使用方法
2015/12/14 PHP
php smtp实现发送邮件功能
2017/06/22 PHP
php和asp语法上的区别总结
2019/05/12 PHP
PHP number_format函数原理及实例解析
2020/07/14 PHP
结合JQ1.9通过js正则判断各种浏览器版本的方法
2013/12/30 Javascript
jquery easyui使用心得
2014/07/07 Javascript
JavaScript数组和循环详解
2015/04/27 Javascript
JS实现1000以内被3或5整除的数字之和
2016/02/18 Javascript
Javascript的表单验证-揭开正则表达式的面纱
2016/03/18 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
prototype.js常用函数详解
2016/06/18 Javascript
简单三步实现报表页面集成天气
2016/12/15 Javascript
微信小程序实现拖拽 image 触摸事件监听的实例
2017/08/17 Javascript
JavaScript函数、闭包、原型、面向对象学习笔记
2018/09/06 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
2020/07/21 Javascript
[05:31]DOTA2英雄梦之声_第08期_莉娜
2014/06/23 DOTA
[45:52]2018DOTA2亚洲邀请赛 4.1小组赛 A组加赛 LGD vs Liquid
2018/04/02 DOTA
[01:20]2018DOTA2亚洲邀请赛总决赛战队LGD晋级之路
2018/04/07 DOTA
Python的socket模块源码中的一些实现要点分析
2016/06/06 Python
Python批量更改文件名的实现方法
2017/10/29 Python
对python:threading.Thread类的使用方法详解
2019/01/31 Python
python3.6使用tkinter实现弹跳小球游戏
2019/05/09 Python
浅析matlab中imadjust函数
2020/02/27 Python
Python爬虫分析微博热搜关键词的实现代码
2021/02/22 Python
一款超酷的js+css3实现的3D标签云特效兼容ie7/8/9
2013/11/18 HTML / CSS
让IE支持HTML5的方法
2012/12/11 HTML / CSS
xml有哪些解析技术?区别是什么
2016/04/26 面试题
优秀应届毕业生自荐书
2014/06/29 职场文书
证婚人致辞精选
2015/07/28 职场文书
教学副校长工作总结
2015/08/13 职场文书