Scala.js 会产生小包吗?

Will Scala.js ever produce small bundles?

虽然我喜欢 Scala 这门语言,Scala.js 这个项目,但我对最终 JS 包的大小有点犹豫,即使是在 fullOptJS 模式下。

我的当务之急是创建一个用于浏览器的小型库。 >150kb 是一个很大的要求,可以说像 BuckleScript/ReasonML 这样的类似工具承诺快速执行和小包。

Scala.js 会在可预见的未来开始生产更小的捆绑包吗?

简短回答:不太可能

设计语言时,总是需要权衡取舍。特别是,跨 JavaScript 和另一个目标交叉编译一种语言通常会导致一系列或多或少相互冲突的目标。例如,生成 "idiomatic, readable JavaScript" 通常与生成 "highly optimized JavaScript".

不一致

在 space 中,Scala.js 的主要设计目标是,按重要性递减顺序排列:

  1. 与 JavaScript 的互操作性:调用和被调用的能力 JavaScript code/libraries。
  2. 与 Scala/JVM 的兼容性:除非使用固有的特定于平台的 API(例如,线程),否则相同的 Scala 代码应该使用 Scala/JVM 和 Scala.js 进行编译,并且表现相同方式。
  3. 运行-时间性能:生成的代码应该尽可能快。
  4. 代码大小:生成的代码应尽可能小。

虽然代码大小绝对是一个问题,但如您所见,它在主要设计目标列表中的位置非常靠后。这意味着代码大小问题通常会屈服于列表中的其他问题。

特别是,它经常与与Scala/JVM兼容的要求不一致。事实上,Scala 有一个相当大的标准库,尤其是集合,而且该库的许多部分相互依赖。这意味着一旦您使用 Scala List,您的代码就需要标准 Scala 集合库的重要部分。 stdlib 的这一部分使大多数重要的 Scala.js 程序重量超过 150 KB。

由于上述条件(设计目标 + 集合库相互依赖性)在可预见的未来不太可能改变,因此 Scala.js 突然产生更少的代码同样不太可能。

严格来说,可能 编写一个 Scala.js 应用程序只产生 10 KB 或更多。但是为了这样做,您必须非常小心,永远不要使用集合库的任何部分。你应该在任何地方使用 js.Arrays、js.FunctionNs 和 js.Promises,而不是 Lists、=> 函数和 Futures,例如.在这一点上,Scala.js 不再是 Scala,因此你最好使用另一种语言(例如 BuckleScript)。