Skip to main content

V2 - 望之如梅

· 12 min read

很高兴在这一刻向大家介绍reSKRipt V2版本的正式发布。

如果你想快速了解如何升级到V2,那么可以参考V2迁移手册,此文更多地用于介绍我们的心路历程和V2的版本规划。

唯心 - 关于代号

reSKRipt在GitHub上的第一个提交始于2021年1月24日,与今天(2021年8月26日)几乎正好7个月。为了纪念这个值得庆贺的日子,也为了更好地鼓舞我们自己向前迈进,我们决定给reSKRipt的每个大版本一个贴心的称号。我们的历史版本也将按相应的代码命名并永久保存。

作为一个已经结束使命的版本,我们也为V1版本起了一个代号:

V1 - Preserved Heart - 坚韧之心

在开源在GitHub之前,作为一个团队内部的工具,reSKRipt早已在内部的源码平台上孵化了3年之久,有过近百个版本。把一个团队高度一致的技术栈下诞生的工具开放出来,甚至推进成为一个顶级互联网公司的代码库初始化工具,是一件需要勇气和坚持的事情。

在这不长不短的3年时间里,我们经历了很多的升级、迁移、需求、质疑,最终为工具的统一与改进埋下了一株深根,即使是自夸,我们也相信这份坚韧的心,值得保留在代码的历史之中。

另一方面,V1作为初始之作,固定了整个工具的流程、逻辑、架构,从发展的角度看,亦不谓于“核心”的定位。在我们进一步选择更现代化的工具如Vite、ESBuild、SWC之前,V1留下的财富将会贯穿于reSKRipt的生命。

因此,V1谓之于“坚韧”,谓之于“心”。而V2版本,也被赋予了相应的代号:

V2 - Long Awaited - 望之如梅

V2相关的第一个议题始于2021年4月,距V1的发布仅3月之久。当然很遗憾地ESM化并没有进入到V2版本中。自那时开始,我们就一直在等待一个成熟、合适地机会,推动V2版本的诞生与发布,其计划的时间线之长久,称为“望梅”当之无愧。

“望之如梅”一词取自于“望梅止渴”,意在表达我们长时间对它的期待,以及身体力行地不断演进向其靠拢。历经4个月的时间,终于在webpack-dev-server发布4.0.0之际,让其落于地面,与所有用户相见。

我们也相信,在V2版本中带来的变化,同样是所有用户所期盼、所需要的,正如干渴之时的一棵梅果,虽不及最先进的那些工具一样饮之如怡,却也足够让开发与构建更为舒心。

契机 - 社区迭代

我们在生产工具的时候,一向尊重大版本的重要性。如果无限制地追求自身的整洁而发布大版本来淘汰一些瑕疵,定会失信于用户。因此我们对于大版本的规划,往往会与社区相应工具的版本对齐,并以此为契机抖落原本加于自身的包袱,也同时给用户提供一个低成本的升级路径。

V1版本的契机无疑是Webpack 5.0的发布,基于Webpack新增的持久缓存能力,我们将编译时间普遍缩短了2/3以上,10万行规模的项目也可以轻松在3分钟内完成整个构建过程。

而V2的发布,依然立足于社区之上,引入了非常关键的一个更新:webpack-dev-server的4.0版本。你可以在这里看到官方发布的4.0的升级手册。当然大部分的变化已经被reSKRipt内部封装屏蔽,绝大部分用户无需关心它的破坏性变化。我们需要了解的是,webpack-dev-server 4.0版本为我们带来了更稳定的热更新能力、更合理的日志架构。

当然更新一个社区的核心工具并不是一件容易的事,有不少的第三方插件可能因此而无法工作。为此,我们投入了大量的工作,例如重新定制并实现了skr dev的进度条功能,以此致力于提供一致、优秀的开发体验。

轻装 - 清理债务

是的,每一个大版本都必然会产生一系列的破坏性变更,同时也是一次清理自身的债务与负担的机会。

我们在V2版本之初,就大幅度调整了项目的构建和配置,这是“内功”的修为。相比于V1,我们全盘TypeScript化了测试用例、引入了一个用于集成测试的五脏俱全的“微型”TodoMVC项目,大面积地清理了历史的代码。

同样地,我们也借此废弃了一部分的配置和参数,并以功能更强、更加正交的能力给予替代,你依然可以通过V2迁移手册查阅所有的这些变化。

革命 - 全面异步

如果说参数、配置的变更是我们在工具层面上的进化,那么V2真正最重要的破坏性变更,则是对外暴露的API的全面异步化。

在V1版本时,我们希望reSKRipt能全面地兼容于社区的各类构建工具链,比如electron-forgeelectron-webpack等,因此诸如@reskript/config-webpack暴露的createWebpackConfig等API都是同步的,在那个时代,我们的心态是被动的,既然社区有工具只能使用同步的API来对接,我们就提供同步的API。

但最终我们发现,如果禁锢自己永远无法达到自身期待的那个理想之乡,因此我们决定投身于社区的建设。如果社区的主流工具无法对接异步的API,我们就去贡献相关的逻辑,让整个社区也能受益于异步的能力。我们已经electron-forge提交了相关议题作为我们迈出的第一步。

在全面的异步化之后,我们得到了大量的收益,几乎所有的文件检查、读取都可以并行化。例如计算Webpack缓存标识符的逻辑,需要读取5+个文件并合并计算哈希,在异步化之后,我们可以并行地处理这些文件,来获得不小的性能优势。

异步化也同样为我们打下了开拓未来的基石,我们相信随着工程的思想发展,构建这个环节会有越来越多的机器对源码的解读,这一切都会在未来产生大量的源代码的读取、解析、汇聚,而异步解除了我们串行IO的性能的担忧,便于在未来更专注地投入工具能力的升级。

精耕 - 事关体验

作为一个开发者的工具,我们坚持开发者体验是评价它的最重要的指标之一。因此我们在V2的开发中也加入了大量开发者体验上的提升。

首先,我们完全重写了子命令的管理与调用逻辑,现在你可以不安装任何的@reskript/cli-*子命令包,单纯地通过skr --help看到所有可用的子命令。

我们也进一步支持了子命令的自动安装,假设你没有安装@reskript/cli-dev,在执行skr dev时经过友好地询问,我们会自动为你装上相应的包,并顺利地将命令运行起来。

我们同样追求更好地适配社区的工具,skr test从V2版本开始可以将你的参数全部传递到jest之上,以发挥出jest完整的能力。

我们还从V2版本开始支持了TailwindCSS,你可以通过简单的配置开启使用tailwind进行样式开发。

我们用clipanion作为新的命令行编排框架,并将在未来不久带来命令的自动补全等实用能力,皆在提供最佳的使用体验。

我们也同样关心你的升级体验,现在你可以通过在项目根目录下执行npx @reskript/doctor migrate-v2来进行自动化地检测,尽可能地发现需要修改的内容。同时你也可以暂时停留在V1版本,通过export SKR_FLAGS=deprecation-error来发现在V2中会被废弃的参数的使用。

结语 - 始终相伴

在你看到这篇博客之际,V2版本已经经过了5+个beta版本,在内部10+个产品上完成了验证,这些产品包括了普通项目、monorepo仓库、微前端架构等等复杂的场景,我们有信心为大家交付一个高质量的初始版本。

我们欢迎并推荐你升级到V2版本,如果在此期间遇到任何的困难,欢迎通过Github向我们咨询