【问题标题】:Will Scala.js ever produce small bundles?Scala.js 会生成小包吗?
【发布时间】:2018-01-24 03:17:33
【问题描述】:

虽然我喜欢 Scala 这门语言和 Scala.js 这个项目,但我对最终 JS 包的大小感到有些迟疑,即使是在 fullOptJS 模式下也是如此。

我的迫切需要是创建一个小型库以供在浏览器中使用。 >150kb 是一个很大的要求,并且可以说是 BuckleScript/ReasonML 等类似工具承诺快速执行和小包。

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

【问题讨论】:

  • 定义小的?我没听说过 ReasonML,它看起来像 OCaml,也就是说,它的语法非常丑陋……就像 bucklescript……
  • @Aluan,它是服务器的有状态接口,在 vanilla js 中最多 500 loc。我正在用 Scala 编写服务器,并希望使用公共域和 RPC。

标签: scala.js scalajs-bundler


【解决方案1】:

简短回答:不太可能

在设计语言时,总是需要做出权衡。特别是,跨 JavaScript 和另一个目标交叉编译一种语言通常会导致一系列或多或少相互冲突的目标。例如,生成“惯用的、可读的 JavaScript”通常与生成“高度优化的 JavaScript”不一致。

在该领域,Scala.js 的主要设计目标是,按重要性降序排列:

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

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

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

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

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

【讨论】:

  • 感谢@sjrd 的详尽回答。我已经读到基本集合库应该在不久的将来进行模块化,并且正在进行一个项目来替代(afaik)github.com/scala/collection-strawman。如此多地参与社区,您对此有何看法?
  • 最初,我们的梦想是新馆藏库的相互依赖性确实会减少。但是,随着它变得越来越大并支持旧库中的更多功能,依赖项似乎又重新出现了。不幸的是,这似乎是固有的。
  • 啊,好吧,有道理。谢谢!
  • 关于新馆藏图书馆的讨论是否试图减少相互依赖,但未能在任何地方在线访问?
  • scalajs-bundler 与问题无关,也与答案无关...
猜你喜欢
  • 2019-12-10
  • 2015-08-19
  • 1970-01-01
  • 2018-02-05
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 2018-11-13
  • 2015-02-18
相关资源
最近更新 更多