rescript初体验

2024-07-23 32:12:59/34天之前

最近一直想写一些什么,刚好这段时间注意到了rescript便用这门语言去开发我的一个新的项目。所以随便记录一下我对这门语言的一些使用想法和期望。 这里附带上rescript地址,感兴趣的可以自行阅读文档。

关于之前我对vite-plugin-compression2的优化,我采用手动编写tar pack模块以换取更小的体积和更符合项目需要的模块设计,但是抽离这个模块 让他成为一个更通用的包的想法一直影响着我。至于为什么要重复造轮子,我私以为目前社区中存在的tar-stream也好node-tar也罢尽管他们十分优秀 但是他们不适合作为底层库集成在第三方应用中,为什么呢因为他们不具备模块化和better tree shake的设计。我深知SSD的宝贵因此我需要设计更面向 现代的tar包。关于为什么是rescript 我一直想试一下类型安全而不是rust这种需要node binding的方式去开发一个库所以他成了我的首选。

类型安全远比类型约束更靠谱

以下分别有一段代码

// typescript
while (condit) {
  if (!notMatch) return null
  // ...next
}
// rescript
let notMath = ref(false)
let condit = ref(true)
while (condit) {
  if (someCondit) {
    notMath := true
    condit := false
  }
  // ...next
}

switch notMath {
  | true => xxx
  | _ => // next logic
}

第一段代码我们能明显地看到early return, 这在javascript或者typescript很容易编写这种代码,但是他对一段代码块来说这是不和谐的,因为我们需要保证return的类型。 这样的话我们就需要定义相应的类型以保证类型安全。而在rescript中我们能保证我们的loop能被执行而不需要担心具体需要提前返回还是怎么样只需要根据需要去做返回这一点我们如果 不是刻意编写代码或者有这样的习惯是很难去做到的。这样尽可能的保证一个case执行完毕能帮助我们更好的发现我们程序的问题。这只是其中一小部分更不用说数据类型相等以及可选match 的方式。这种ML系语言更方便用户去组织他们的逻辑以降低心智负担。 试想一下如果我们有个非常复杂的函数他有若干参数在javascript中我们很容易写出

fn(a, b, c, ...z)

而在rescript 中我们能利用管道符号降低理解成本

let result = [1, 2, 3]
  ->Array.map(a => a + 1)
  ->Array.filter(a => mod(a, 2) == 0)

但rescript并非是一个好的解决方案

尽管rescript编写的很爽,但是在构建js库的时候它还具有不少的痛点比如Js Binding 过于繁琐以及生成的d.ts并不符合人体工学需要用户二次手动定义,他对于自己的编译工具过分的 固执己见,用户需要花费精力去做相对的打包工具集成, 因为rescript自带的import/export 很难生成一个单一的chunk文件,而这件事就需要开发者手动去做, 包括对模块风格的固执己见让 用户很有自己的coding style这一点对于习惯了自由的javascript人并不好。

CC BY-NC-SA 4.02024-PRESENT © Kanno