将 kotlin 代码编译为 JVM 和 JavaScript

Compile kotlin code to both JVM and JavaScript

我真的很喜欢编写一次框架,然后能够将其编译为 jvm 字节码以及 javascript 供 Web 使用的想法。

目前可以使用 kotlin 编译器吗?

这是可能的,但您可能会遇到一些困难。首先,您只能使用 Maven 构建和配置它:只需设置两个执行。第二个问题是 IDE 无法处理多个目标,因此您可以使用技巧 enable/disable stdlib/kotlin-js-library

你可以在https://github.com/Kotlin/kotlinx.html

看到它

它是多模块项目。模块 jvm 只为 JVM 编译,模块 js 只编译给 javascript,模块共享给两者

注意 maven 配置文件:当您编辑共享模块时,您可以启用 js 或 jvm,但不能同时启用:否则 IDE 会发疯。在编译期间,默认情况下两个配置文件都处于活动状态,因此您将获得多目标 jar

一段时间以来,这会导致问题。不过想法很好,所以一直有人问。

检查我的项目 https://github.com/C06A/KUrlet,我就是这样做的:在根级模块中包含共享代码,并将其源目录包含在每个子模块的 sourceSets 属性 中(一个针对 JVM,一个 - - JS).

我创建了一个针对JVM的projet kotlin maven,它可以编译为JVM和JS。

  1. 打开 Intellij IDEA -> 文件 -> 新建 -> 项目 -> Maven -> 检查 "create from archetype" -> 选择 "org.jetbrains.kotlin:kotlin-archetype-jvm"

  2. 编辑GroupId:com.example.training; ArtifactId:kotlin2js; Version:1.0-快照

NOTE: a name of project (module) should not contains "-" (a dash) but "_" (an underscore) is ok.

  1. 在路径 src/main/kotlin/com.example.training/

    中创建一个名为 Person 的 class kotlin
    data class Person (
        val id, Int,
        val firstname: String)
    
  2. 编辑pom.xml

    a) 添加依赖"kotlin-stdlib.js"

     <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-stdlib-js</artifactId>
            <version>${kotlin.version}</version>
     </dependency>
    

    b) 在插件 "kotlin-maven-plugin" 中添加目标 "js"

    c)(互操作性可选 Kotlin/JS)添加用于解压 lib "kotlin-stdlib-js"

    中所需的 js 文件的插件
          <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>unpack</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>unpack</goal>
                        </goals>
                        <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>org.jetbrains.kotlin</groupId>
                                <artifactId>kotlin-stdlib-js</artifactId>
                                <version>${kotlin.version}</version>
                                                  <outputDirectory>${project.build.directory}/js/lib</outputDirectory>
                            <includes>*.js</includes>
                            </artifactItem>
                        </artifactItems>
                        </configuration>
                    </execution>
                </executions>
        </plugin>
    
    1. 运行 mvn clean compile

    2. 文件夹 classes 包含 java 的 Person.class。文件夹 js 包含 kotlin2js.js 和 kotlin2js.meta.js 用于 JS,所有解压的 js 文件都在子文件夹 lib 中。