几乎所有构建系统都选择使用watch机制来解决开发过程中需要反复生成构建后文件的问题,但在watch机制下,长期以来我们必须忍受修改完代码,保存完代码必须喝口茶才能刷新看看效果的问题。在这里我们尝试探讨为什么watch不是银弹,并尝试寻找一种更好的方案来解决这个问题。

watch基于的事实

当一个文件修改,我们能知道其修改可能导致的文件修改,那么重新构建这些文件即可。

通常对于文件A,构建成文件B这种场景,这种对应关系是极好确定的。但现实场景下,构建过程往往不是那么简单。例如:

文件A + 文件B(被文件A引用) -> 文件C

在这种场景下,文件B的修改,可能难以定位哪些文件需要重新跑构建任务,因为可能有很多文件引用了文件B。

除非我们建立一个依赖树,并在每次文件更新的情况下更新依赖树,并根据新的依赖树触发文件构建。但这对每一个插件都需要自行实现这个机制,并且极易出错。故实际上watch机制仅仅是重跑了整个task。所以当项目越来越大的时候,watch机制将越来越慢(因为越来越多文件需要重新跑整个过程,即使通过缓存减少了整个过程所需的耗时)。

解决方案

    • src直接可用

      AlloyTeam & @ldjking,简单来说直接让src直接可跑,把构建任务放置在浏览器端,甚至根本不构建,既可做到及时修改及时刷新,在开发过程中减少了时间消耗。线下构建仅仅负责性能优化上的问题,不负责开发效率。
      典型代表有LESSReact等。但也有一些问题:

      1. 难以在浏览器端实现优雅的构建方式,难以提供强大的功能进一步减少开发成本,大部分只能采用类似<style type="text/less"></style>的方式引入脚本。
      2. 开发模式下的执行顺序不一定和实际场景相同,可能导致隐形bug出现,例如实现一个HTML inline由于开发模式下inline是异步的,而发布模式下inline时同步的,产生莫名其妙的bug。
      3. 浏览器编译性能堪忧,例如js版的sass,编译速度几乎无法忍受。
      4. 需要维护线上、线下两套构建系统,增加了工具开发成本。
    • 本地服务器动态构建

      一个事实是:在合理的规范支持下,我们可以从浏览器请求的文件,回溯到该文件构建过程中的入口文件。这样我们就可以动态触发一次构建过程。

      通过在本地建立一个服务器,让服务器捕获请求后,在服务器中动态构建。只要回溯到入口文件,我们便能将入口文件丢进gulp插件组成的管道中,则输出便是浏览器需要的文件。

      这样我们就能解决上面的所有问题。

最新文章

  1. C#并行编程之数据并行
  2. DG的Switchover切换
  3. C#的变迁史 - C# 5.0 之其他增强篇
  4. JAVA下的Thread.sleep方法一定要try
  5. [付费视频]Delphi视频Android开发使用静态库(A)和动态库(SO)
  6. iOS:界面适配(三)--iPhone不同机型适配 6/6plus 前
  7. java 面向对象编程--第十章 接口
  8. SelectedValue 失效
  9. .NET String.Format 方法 线程安全问题
  10. php多种实例理解无限极分类
  11. wildfly9 配置SSL单向认证/https
  12. [布局]bootstrap基本标签总结2
  13. [C#] 后端post的请求方法
  14. [置顶] android系统功能调用大全
  15. Oracle sql执行计划
  16. hadoop在子节点上没有datanode进程
  17. virtio 简介
  18. JS——页面带参数跳转
  19. js变量的解构赋值
  20. 一本通1646GT 考试

热门文章

  1. codeforces-1114F-线段树练习
  2. FutureTask实现超时任务
  3. gradle 汉化
  4. hdu4035 Maze
  5. Python3正则表达式(4)
  6. Eclipse中修改包名,提交SVN时报 is out of date,怎么办?
  7. windows + php + redis的安装
  8. ext2文件系统学习(二)—— 目录磁盘结构
  9. 用Jersey构建RESTful服务1--HelloWorld
  10. Shell Step by Step (4) —— Cron &amp;amp; Echo