虽然我喜欢Scala这个语言,而Scala.js就是这个项目,但是,即使在fullOptJS模式下,我也会因最终的JS包的大小而略有不同。
我迫切需要创建一个在浏览器中使用的小型库。 > 150kb是一个很大的问题,可以说像BuckleScript / ReasonML这样的工具可以保证快速执行和微小的捆绑。
Scala.js会在可预见的未来开始生产更小的捆绑包吗?
答案 0 :(得分:9)
简短回答:不太可能。
在设计语言时,总会有权衡。特别是,跨JavaScript和另一个目标交叉编译语言通常会导致一系列或多或少的冲突目标。例如,生成“惯用的,可读的JavaScript”通常与生成“高度优化的JavaScript”不一致。
在那个空间中,Scala.js的主要设计目标是按重要性递减的顺序:
虽然代码大小肯定是一个问题,但正如您所看到的,它在主要设计目标列表中占据相当低的位置。这意味着代码大小问题通常会产生列表中的其他问题。
特别是,它通常与与Scala / JVM 兼容的要求不一致。实际上,Scala有一个非常大的标准库,特别是集合,并且该库的许多部分相互依赖。这意味着只要您使用Scala List
,您的代码就需要标准Scala集合库的重要部分。这部分stdlib是大多数非平凡的Scala.js程序重量超过150 KB的原因。
由于上述条件(设计目标+集合库的相互依赖性)在可预见的未来不太可能发生变化,因此Scala.js同样不太可能突然产生更少的代码。
严格地说,编写一个只生成10 KB或更多的Scala.js应用程序是可能。但是为了做到这一点,你必须非常小心,不要使用集合库的任何部分。您应该在任何地方使用js.Array
,js.FunctionN
和js.Promise
,而不是List
s,=>
函数和Future
s,例如。此时,Scala.js不再是Scala,因此使用其他语言(例如BuckleScript)会更好。