こんにちは、マヤミトです。
今回はKotlin/JSとkotlinx-nodejsを使ってサーバーを立てる簡単なサンプルを作ってみました。
kotlinx-nodejsの紹介
kotlinx-nodejsは、Node.jsのAPIのKotlinラッパーを提供します。TypeScriptでいう d.ts
ファイルがまとまっていると考えるとわかりやすいかもしれません。
https://github.com/Kotlin/kotlinx-nodejs
導入
build.gradle
に依存を追加し、targetをnodejsにします。
repositories {
mavenCentral()
jcenter() // 追加
}
dependencies {
implementation(kotlin("stdlib-js"))
implementation("org.jetbrains.kotlinx:kotlinx-nodejs:0.0.7") // 追加
}
kotlin.js {
nodejs() // 追加
}
簡単なhttpサーバーを書いてみる
リクエストが来たらそれのurlとmethodを返すだけの簡単なサーバーを書いてみます。
fun main() {
val server = http.createServer { req, res ->
res.write("url: ${req.url}\n")
res.write("method: ${req.method}")
res.end()
}
server.listen(8080)
}
Node.jsでサーバーを書いたことのある人ならわかるかもしれませんが、用意されている関数の使い方などはほぼ変わりません。私はNode初心者ですが、JavaScriptで書かれたサンプルをほぼそのままKotlinに書き換えることができました。
サーバーの起動
ターミナルで
./gradlew nodeRun
を実行すると、指定したポート(今回は8080)でサーバーが起動します。
実際にcurlで叩いてみるとこんな感じです。
curl -X GET localhost:8080/hoge
url: /hoge
method: GET
curl -X POST localhost:8080/hoge
url: /hoge
method: POST
JSへのビルド
Gradle経由ではなく、JSのファイルを吐き出してnodeコマンドで実行したい場合、追加でいくつか設定が必要です。
まず、 build.gradle
に webpack-node-externals
の依存を追加し、ターゲットにbrowserを追加します。
dependencies {
implementation(kotlin("stdlib-js"))
implementation("org.jetbrains.kotlinx:kotlinx-nodejs:0.0.7")
implementation(npm("webpack-node-externals", "2.5.1")) // 追加
}
kotlin.js {
browser() // 追加
nodejs()
}
プロジェクトルートの webpack.config.d
ディレクトリの中に webpack.config.js
ファイルを以下の内容で作成します。
var nodeExternals = require('webpack-node-externals');
config.target = 'node';
config.externals = [nodeExternals()];
ターミナルで
./gradlew browserWebpack
を実行すると、 build/distributions
以下にビルド後のJavaScriptのファイルが生成されます。デフォルトだと生成されるファイル名は プロジェクト名.js
ですが、任意の名前に変更したい場合は以下の内容を build.gradle
の webpackTask
に追加します。
kotlin.js {
browser {
webpackTask {
outputFileName = "main.js" // 生成したいファイル名
}
}
nodejs()
}
生成されたJavaScriptのファイルは、nodeコマンドから実行することができます。
node main.js
まとめ
- Kotlin/JSでもサーバーサイドはできる
- JSを吐き出したいときにはターゲットをブラウザにしてWebpackでビルドするという直感に反する作業が必要
情報が少なかった割には意外とすんなりできてしまいました。Kotlin好きの皆さんもぜひ一度試してみてください。
今回のサンプルコードは自分のGitHubにて公開しているのでよかったらどうぞ。
https://github.com/yt8492/KotlinOnNodeJSSample
参考
https://github.com/Kotlin/kotlinx-nodejs
https://saku.io/build-for-node-runtime-using-webpack/