ReScript 12.0发布,提供了新的构建系统
来源: InfoQ - 后端
ReScript是一门强类型并可编译为JavaScript的语言,最近发布了ReScript 12.0版本,完成了为期多年的开发路线图,对编译器工具链进行了现代化改造,并通过改进的语法和性能提供了更佳的开发者体验。
ReScript 12.0引入了多项重要特性,包括完全重写的构建系统、改进的运算符、支持模式匹配的字典字面量、嵌套记录类型、JSX保留模式以及正则表达式字面量。此次发布还带来了模块化的运行时架构和平台专用二进制文件,显著减小了安装体积。
ReScript 12的亮点特性之一是新的构建系统,该系统已于去年11月提前推出,具备智能依赖追踪和更快的增量构建能力。新系统现在能更精确地追踪依赖关系,避免不必要的重新编译,并且即使在monorepo包之间也能与增量工作流集成。这解决了随着项目规模扩大和monorepo日益普及而暴露出来的旧构建系统的局限性,此前的构建系统主要适用于单包项目。
对于仍需使用旧版“legacy”构建系统的项目,可通过rescript-legacy命令执行build、build -w和clean操作。预计该命令将在v13中移除。
ReScript 12最终完成了去年早些时候引入的统一运算符工作。算术运算符如+、-、*、/、%和**现在对int、float和bigint具有一致的行为,编译器可根据左操作数自动推断正确的具体类型。开发者现在也可使用+进行字符串拼接,不再需要过去用于浮点运算的+.、-.、*.和/.等遗留运算符。
ReScript 12还支持编译为普通JavaScript对象的字典字面量,相比Dict.fromArray大幅减少了样板代码。模式匹配也支持字典,可简洁地解构JSON载荷和配置对象:
let user = dict{"firstname": "John", "role": "manager"}
switch user {
| dict{"name": name, "role": role} => Console.log2(name, role)
| _ => Console.log("missing user metadata")
}开发者可通过"jsx": { "version": 4, "preserve": true }启用JSX保留模式。编译器将直接输出JSX语法,而非将其转换为react/jsx-runtime调用,这对ESBuild、SWC或Babel等打包工具非常有用,使其能够应用自己的转换逻辑。此举既保持了与React Compiler的兼容性,又确保输出中的JSX保持可读性。
从ReScript 11升级的团队应查阅迁移指南并预留过渡时间。本次发布包含若干破坏性变更,最重要的是移除了对JSX v3的支持、采用新的运行时包结构(以@rescript/runtime取代原有设置),以及API命名变更(原先以Exn结尾的函数现在改为以OrThrow结尾)。迁移工具包含一个codemod,可自动完成机械式的重命名以简化过渡过程。
由于引入了平台专用包(如@rescript/darwin-arm64、@rescript/linux-x64和@rescript/win32-x64),安装体积可以大幅缩小。npm现在只会安装与操作系统和架构匹配的二进制文件,从而加快安装速度,并减小CI流水线中的缓存占用。
围绕ReScript 12发布相关的新闻,社区讨论尚不热烈,但该语言仍持续将自身定位为TypeScript的替代方案,提供更强的类型保证。在Reddit上,有用户评论称这是个好消息,因为他曾以为该项目已经停止维护。也有用户质疑为何应选择ReScript而非TypeScript,一位评论者给出了如下对比:
TS仍然包含JavaScript的所有缺陷,并且其设计本质上是不健全的。ReScript是用OCaml构建的,因此你可能会获得市面上最快的编译器之一,再也不用等待5分钟才能完成生产构建。
较早的对比指出,ReScript的类型系统是健全的,能保证绝不出错;而TypeScript的类型系统仅仅基于推测,有时在运行时仍可能出错。ReScript的编译速度也远快于TypeScript,尽管TypeScript在生态系统采用率和JavaScript互操作性方面仍占优势。
ReScript是一门开源的编程语言,可编译为高效且人类可读的JavaScript。它最初源自OCaml,现已演变为拥有独立语法和工具链的独特语言。ReScript在React开发中尤为流行,提供一流的JSX支持和极速的编译器,可轻松扩展至任意规模的代码库。
原文链接: