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経験値を積み上げているという…