从 BuckleScript/Reason 迁移
ReScript 是对 BuckleScript(自 v8.2.0 起)和 Reason(v3.6)的重塑和清理,它使我们能以更连贯的文档和工具提供更紧凑的 compile-to-JS 技术栈。如果你是 BuckleScript 或 Reason 的现有用户,下面是要注意的点:
- ReScript 主要是 BuckleScript 的改版,它的新语法和 Reason 的语法类似,但更加适合 Javascript 人群 
- 即使你不升级,你所有的现有代码也会继续工作 
升级你的代码库
新的语法有很多令人兴奋的改进(特性,速度,错误提示等)。升级是轻松的,向后兼容的,并且可以在每个文件的基础上完成:
npm install rescript@9 # Also works with .rei / .ml / .mli / etc npx rescript convert src/MyFile.re
享受改进后的体验吧!
对单个文件夹进行升级
这对逐目录的转换很有用:
CONSOLE# *.rei, *.ml, *.mli,.... for f in your-folder/**/*.re; do; node_modules/.bin/rescript convert $f && rm $f; done;
升级一整个代码库
如果你对一步到位地转换你的代码库有信心,可以使用以下方法:
npx rescript convert -all
与 Reason 的不同之处
- 完全去除了分号(你仍然可以写分号) 
- 不再需要在 - if、- switch和- try周围加上括号
- 类型参数: - option(int)变为- option<int>
- 旧字符串插值: - {j|hello ${name}|j}变为- j`hello ${name}`。现在有了适当的 unicode 支持!
- 新字符串插值: - `hello world`,同样支持多行和 unicode。- "hello world"现在是单行的
- 多态变体(Polymorphic variants): - `red变为- #red
- 数组: - [|1,2,3|]变为- [1,2,3]。后者是 JS 中的写法
- 列表: - [1,2,3]变为- list[1,2,3](8.1.1 版本更新:现在是- list{1, 2, 3})。这与即将到来的以统一方式访问容器的计划有关,比如- set[...]和- map[...]。也许只是暂时修改
- 异常: - try (compute()) { | Not_found => Js.log("oops")}变为- try compute() catch { | Not_found => Js.log("oops")}
- 一等公民模块: - (module S: Student)变为- module(S: Student)
- 目前没有自定义的中缀运算符(包括 - mod)
- 访问对象: - settings##visible #= true变为- settings["visible"] = true。欢呼吧!
- 创建对象: - Js.t({"age": int})变成了- {"age": int},不再需要- Js.t
- 属性(装饰器): - [@myAttribute "hello"]变为- @myAttribute("hello")。- [%re bla]变为- %re(bla)
- 解引用语法 - result^被移除了,只需使用- result.contents
- fun模式匹配语法被移除了
- 类型声明默认为非递归,与 let 绑定一致。要有递归类型,请使用 - type rec myList<'a> = Nil | Cons('a, myList<'a>)
- 可以使用任意的单词(包括保留关键字)作为标识符: - let \"try" = true