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内置对象arguments详解
Mar 16 Javascript
jQuery 删除或是清空某个HTML元素示例
Aug 04 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 图片库
Jan 09 Javascript
EasyUI中实现form表单提交的示例分享
Mar 01 Javascript
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
Dec 10 Javascript
Javascript从数组中随机取出不同元素的两种方法
Sep 22 Javascript
jQuery插件MovingBoxes实现左右滑动中间放大图片效果
Feb 28 Javascript
Scala解析Json字符串的实例详解
Oct 11 Javascript
create-react-app修改为多页面支持的方法
May 17 Javascript
vue封装可复用组件confirm,并绑定在vue原型上的示例
Oct 31 Javascript
基于jQuery实现可编辑的表格
Dec 11 jQuery
vue Treeselect下拉树只能选择第N级元素实现代码
Aug 31 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静态变量当缓存的方法
2013/11/13 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
2014/06/19 PHP
php实现的css文件背景图片下载器代码
2014/11/11 PHP
php中curl使用指南
2015/02/05 PHP
CI框架表单验证实例详解
2016/11/21 PHP
Yii2学习笔记之汉化yii设置表单的描述(属性标签attributeLabels)
2017/02/07 PHP
(function($){...})(jQuery)的意思
2010/07/22 Javascript
js中匿名函数的N种写法
2010/09/08 Javascript
jQuery实现的一个tab切换效果内部还嵌有切换
2014/08/10 Javascript
Angular中的Promise对象($q介绍)
2015/03/03 Javascript
深入理解逻辑表达式的用法 与或非的用法
2016/06/06 Javascript
jQuery操作cookie
2016/08/08 Javascript
基于zepto.js实现登录界面
2017/10/09 Javascript
微信小程序实现文字从右向左无限滚动
2020/11/18 Javascript
通过js随机函数Math.random实现乱序
2020/05/19 Javascript
vuex 多模块时 模块内部的mutation和action的调用方式
2020/07/24 Javascript
jquery实现简单每周轮换的日历
2020/09/10 jQuery
vue 动态添加的路由页面刷新时失效的原因及解决方案
2021/02/26 Vue.js
在Python的Flask框架中使用模版的入门教程
2015/04/20 Python
TensorFlow实现Softmax回归模型
2018/03/09 Python
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
Django forms表单 select下拉框的传值实例
2019/07/19 Python
Python 字符串类型列表转换成真正列表类型过程解析
2019/08/26 Python
Django 实现xadmin后台菜单改为中文
2019/11/15 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
2020/04/16 Python
python实现四人制扑克牌游戏
2020/04/22 Python
Jupyter notebook如何实现指定浏览器打开
2020/05/13 Python
解决Python3.8运行tornado项目报NotImplementedError错误
2020/09/02 Python
法国隐形眼镜网站:VisionDirect.fr
2020/03/03 全球购物
《桂林山水》教学反思
2014/02/08 职场文书
五型班组建设方案
2014/02/10 职场文书
竞聘上岗演讲稿
2014/05/16 职场文书
我的中国梦演讲稿800字
2014/08/19 职场文书
2014年学生会工作总结范文
2014/11/07 职场文书
我们的节日端午节活动总结
2015/02/11 职场文书
Go语言grpc和protobuf
2022/04/13 Golang