在寻找使 Scala.js交叉构建项目的 JavaScript 和 JVM 端都可以访问 Java 库的方法时,请考虑以下实验:
想象一下,一个 Scala.js 项目需要高级矩阵数学功能,例如奇异值分解。虽然 JavaScript 世界有Numeric.js,而 JVM 世界有很多选择,但JAMA尤其是其中之一,在提出这个问题的时候还没有交叉构建 Scala.js 的解决方案。
我们有什么选择?
- 为 Scala.js 重新编写或移植一个矩阵库。
- 将 Numeric.js 外观和 JAMA 包装到一个通用的 Scala.js 接口中。
- 为 Numeric.js 编写外观,然后使用Nashorn编译它以获得 JVM 支持。
- 使用JSweet和时尚的 Scala.js 外观将 JAMA 转换为 JavaScript 。
这个问题反映了选项 4。
在为 JSweet 转译器重新调整 JAMA,通过 npm将转译后的 JavaScript 发布为CommonJS 模块,并为 CommonJS 模块编写Scala.js 外观之后,Scala 代码现在可以在 JVM 端访问 Jama,并在 JS 端访问它的一个端口.
不幸的是,JVM端的核心数据结构在Scala语法中有type:double[][], Array[Array[Double]],但是JSweet将其转换为JavaScript数组类型,js.Array[js.Array[Double] ] 在 Scala.js 语法中。
现在,从 Scala.js 交叉构建的角度来看,存在两个名称相同、功能相同但完全不同且独立的库。
根据 Scala 语法,我们可以在 JS 端构造 3D 单位矩阵,如下所示:
new Matrix(
js.Array[js.Array[Double]](
new js.Array[Double](1.0, 0.0, 0.0),
new js.Array[Double](0.0, 1.0, 0.0),
new js.Array[Double](0.0, 0.0, 1.0)
)
)
在 JVM 端,我们编写:
new Matrix(
Array[Array[Double]](
new Array[Double](1.0, 0.0, 0.0),
new Array[Double](0.0, 1.0, 0.0),
new Array[Double](0.0, 0.0, 1.0)
)
)
我们如何统一这两种实现方式?
将 js.Array 和 Array 等同起来有什么技巧吗?
你会建议一种完全不同的方法来使交叉构建的 Scala.js 项目可以访问 Java 库吗?