从 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