为什么watch机制不是银弹?
几乎所有构建系统都选择使用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插件组成的管道中,则输出便是浏览器需要的文件。
这样我们就能解决上面的所有问题。
最新文章
- C#并行编程之数据并行
- DG的Switchover切换
- C#的变迁史 - C# 5.0 之其他增强篇
- JAVA下的Thread.sleep方法一定要try
- [付费视频]Delphi视频Android开发使用静态库(A)和动态库(SO)
- iOS:界面适配(三)--iPhone不同机型适配 6/6plus 前
- java 面向对象编程--第十章 接口
- SelectedValue 失效
- .NET String.Format 方法 线程安全问题
- php多种实例理解无限极分类
- wildfly9 配置SSL单向认证/https
- [布局]bootstrap基本标签总结2
- [C#] 后端post的请求方法
- [置顶] android系统功能调用大全
- Oracle sql执行计划
- hadoop在子节点上没有datanode进程
- virtio 简介
- JS——页面带参数跳转
- js变量的解构赋值
- 一本通1646GT 考试