尝试 Kotlin Multiplatform Projects
Kotlin 的 Multiplatform Projects 看起来是个挺不错的跨平台技术。能 JVM 能 JS 还能 Native。不过真正要弄起来还是会遇到些问题的。
介绍在这里,照着写一遍也不会遇到什么问题。简单来说就是 common 模块里出现 expect 关键字的声明,都要在所有的 platform 模块里实现并加上 actual 关键字。
遇到的第一个问题是 coroutines 在 Kotlin/JS 上的测试。目前 kotlin coroutines 的教程上讲的都是用runBlocking
来包住测试代码块。
@Test
fun test() = runBlocking<Unit> {
// ...
}
但是 Kotlin/JS 现在没有runBlocking
了。有篇博客介绍了一种方法,用promise
来包住测试代码块。
@Test
fun test() = promise {
// ...
}
不过这个解决方法还是有些局限性的。若是需要onBefore
或者onAfter
的话,还要自行加入锁机制,保证运行顺序。
另外一个问题就是如何在浏览器上测试生成的 js 代码。官方给出的示例是 node.js 来测试的。在浏览器测试的话就应该用 headless browser 了。搜索了一番发现 mocha-headless-chrome 可以用。那么解决方法就是生成测试入口 html,再调用 mocha-headless-chrome 来载入这个 html。
想要让生成的 js 代码既能在 node.js 上跑,也能在浏览器上跑,只需要把moduleKind
改为moduleKind
。
[compileKotlin2Js, compileTestKotlin2Js]*.configure {
kotlinOptions.metaInfo = true
kotlinOptions.moduleKind = 'umd'
}
所用的代码都可以在这里找到。