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 相关文章推荐
JS Range HTML文档/文字内容选中、库及应用介绍
May 12 Javascript
使用js判断当前时区TimeZone是否是夏令时
Feb 23 Javascript
jquery插件orbit.js实现图片折叠轮换特效
Apr 14 Javascript
JS实现仿QQ聊天窗口抖动特效
May 10 Javascript
JS跨域解决方案之使用CORS实现跨域
Apr 14 Javascript
angularjs点击图片放大实现上传图片预览
Feb 24 Javascript
微信小程序开发之toast提示插件使用示例
Jun 08 Javascript
vue-router单页面路由
Jun 17 Javascript
详解React 在服务端渲染的实现
Nov 16 Javascript
微信小程序switch组件使用详解
Jan 31 Javascript
微信小程序日期时间选择器使用方法
Feb 01 Javascript
Electron 调用命令行(cmd)
Sep 23 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网上调查系统
2006/10/09 PHP
php中使用addslashes函数报错问题的解决方法
2013/02/06 PHP
php增删改查示例自己写的demo
2013/09/04 PHP
PHP循环结构实例讲解
2014/02/10 PHP
Yii视图CGridView实现操作按钮定义地址示例
2016/07/14 PHP
wordpress自定义标签云与随机获取标签的方法详解
2019/03/22 PHP
JavaScript 用Node.js写Shell脚本[译]
2012/09/20 Javascript
Ext JS添加子组件的误区探讨
2013/06/28 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
2013/11/26 Javascript
控制input输入框中提示信息的显示和隐藏的方法
2014/02/12 Javascript
jquery实现类似淘宝星星评分功能实例
2014/09/12 Javascript
由ReactJS的Hello world说开来
2015/07/02 Javascript
jQuery使用animate创建动画用法实例
2015/08/07 Javascript
使用JS动态显示文本
2017/09/09 Javascript
vue路由拦截及页面跳转的设置方法
2018/05/24 Javascript
详解vue中多个有顺序要求的异步操作处理
2019/10/29 Javascript
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
2018/07/25 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
2019/11/08 Python
python爬虫模拟浏览器访问-User-Agent过程解析
2019/12/28 Python
python和php学习哪个更有发展
2020/06/17 Python
Django解决frame拒绝问题的方法
2020/12/18 Python
美国著名的婴儿学步鞋老品牌:Robeez
2016/08/20 全球购物
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
Europcar德国:全球汽车租赁领域的领导者
2018/08/15 全球购物
办公室内勤岗位职责范本
2013/12/09 职场文书
篝火晚会主持词
2014/03/25 职场文书
我的求职择业计划书
2014/04/04 职场文书
党员目标管理责任书
2014/07/25 职场文书
房屋所有权证明
2014/10/20 职场文书
临床医学生职业规划书范文
2014/10/25 职场文书
2016年公共机构节能宣传周活动总结
2016/04/05 职场文书
sqlserver2017共享功能目录路径不可改的解决方法
2021/04/16 SQL Server
关于golang高并发的实现与注意事项说明
2021/05/08 Golang
RPM包方式安装Oracle21c的方法详解
2021/08/23 Oracle
如何利用 CSS Overview 面板重构优化你的网站
2021/10/24 HTML / CSS
python opencv将多个图放在一个窗口的实例详解
2022/02/28 Python