Kotlin/JavaScriptを試してみた
Kotolinとは
ググって
KotlinでJavaScriptにトランスコンパイル
スタンドアロンコンパイラを使う方法とGradle等のJVMビルドツールを使う方法がある。実際に開発すると仮定すると、インクリメンタルビルドが可能なGradleを使うことになると思われる。
手順としては、
- JREをインストール(JVMやAndroid向けの開発も行う場合はJDKが必要だが、JavaScript開発の場合はJREで良い)
- Gradleをインストール(当然、Gradle Wrapperを使ってもよい)
- プロジェクトのスケルトンを作る(build.gradle)
という感じになる。
Hello World
ブラウザでHello Worldが動くところまでを試してみた。IntelliJ IDEA等のIDEを使えばプロジェクトテンプレートがあるかもしれないが、IDEを使わずにテキストエディタのみでやってみた。
ここに記載する手順は、次の環境で確認した。
まずビルドファイルを作る。任意の空ディレクトリ内で次のように build.gradle ファイルを作成する。
ext.kotlin_version の部分は、使いたいKotlinのバージョンを指定する。
group 'org.example'
version '1.0-SNAPSHOT'
buildscript {
ext.kotlin_version = '1.1.4'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
apply plugin: 'kotlin2js'
repositories {
mavenCentral()
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version"
}
task assembleWeb(type: Sync) {
configurations.compile.each { File file ->
from(zipTree(file.absolutePath), {
includeEmptyDirs = false
include { fileTreeElement ->
def path = fileTreeElement.path
path.endsWith(".js") && (path.startsWith("META-INF/resources/") ||
!path.startsWith("META-INF/"))
}
})
}
from compileKotlin2Js.destinationDir
into "${projectDir}/web"
dependsOn classes
}
assemble.dependsOn assembleWeb
次にMainとなるコードを記述する。
fun main(args: Array<String>) {
println("Hello World")
}
ビルドは gradle build コマンドを実行する。ビルドに成功すると、 web ディレクトリ以下にJavaScriptが生成される。
ブラウザで実行するために、HTMLファイルを作成する。ここでは作業ディレクトリ直下にHTMLファイルを作成する(webディレクトリ配下にHTMLファイルを配置してしまうと、ビルド時に消えてしまう)。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <script type="text/javascript" src="web/kotlin.js"></script> <script type="text/javascript" src="web/kotlin_main.js"></script> </body> </html>
作成したHTMLファイルをブラウザで読み込み、開発者ツールのコンソールを確認すると、 Hello World と表示されているはずである。
試してみた感想
実用レベルだが、自分で積極的に使うことはないかなぁというのが正直な感想。
実用となる根拠としては、
- DOM操作が可能
- js()関数で生JavaScriptコードの埋め込みが可能
- Dynamic型でJavaScript側のオブジェクトが操作可能
- CommonJS, AMD形式のモジュールとしてビルド可能
- SourceMapが出力可能
- dead code elimination (DCE) が使える
というあたり。
一方で積極的に使うことはないなぁという根拠としては、
- 実行時にKotlin Runtime (kotlin.js) に依存しなければならず、非圧縮状態で1.3MB程度ある
というところが個人的に最大のネックになる。kotlin.jsはminifyすれば数百KB程度になると思われるが、どうせRuntimeに依存しないといけないのであれば、私ならScala.jsを選択する。
Scala.jsの場合、
- 最初からビルドツールチェーンでminifyが考慮されている(fullOptJS指定時、Google Closure Compilerが使われる)
- Scala/JDKのクラスライブラリが一部JavaScriptコードに変換される https://www.scala-js.org/libraries/libs.html
- 単純にScala.jsの方がユーザーが多い(と思われる)
というメリットがあるため、Kotlinの現状では、チームメンバーがKotlinに精通しまくっているということでもない限りは選ぶことはない。
(蛇足として、そもそもHaxeおじさんなのでScala.jsも積極的には選択しないのだけど、自社の人間はScala.js経験値を積み上げているという…