如何让Kotlin代码兼容JVM后端与JS前端并实现JS导出?
解决方案
方法一:为JVM项目提供空的@JsExport注解实现
由于JVM项目编译时无法识别Kotlin/JS标准库的kotlin.js.JsExport注解,你可以在JVM项目的源码中创建一个同名的空注解类,让编译器跳过错误:
- 在JVM项目的
src/main/kotlin/kotlin/js路径下创建JsExport.kt文件 - 写入以下代码:
package kotlin.js @Retention(AnnotationRetention.BINARY) @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY) annotation class JsExport
这样JVM编译时会识别这个本地注解,不会报错;而JS项目仍会使用标准库中的@JsExport,完全不影响导出功能。
方法二:使用expect/actual注解适配双平台
这种方式更符合Kotlin的平台适配规范,通过定义期望注解,再分别为JS和JVM提供实际实现:
- 在共用源码中定义
expect注解:
@OptionalExpectation @Retention(AnnotationRetention.BINARY) @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY) expect annotation class JsExport()
- 在JS项目中添加
actual类型别名,映射到标准库注解:
actual typealias JsExport = kotlin.js.JsExport
- 在JVM项目中添加
actual空注解:
@Retention(AnnotationRetention.BINARY) @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY) actual annotation class JsExport()
之后你在共用源码中直接使用@JsExport即可,JS项目会正常导出类/方法,JVM项目则会忽略注解的实际作用,保持兼容性。
注意事项
- 方法一适合快速解决问题,无需修改共用源码,但需注意同步标准库
@JsExport的注解目标和保留策略(如果后续标准库有更新) - 方法二更具扩展性,能更好地应对后续的平台适配需求,但需要在两个项目中分别维护
actual实现
内容的提问来源于stack exchange,提问作者Brian White
相关产品推荐
相关产品推荐

