こんにちは、マヤミトです。
今回はKotlin/JSとkotlinx-nodejsを使ってサーバーを立てる簡単なサンプルを作ってみました。
kotlinx-nodejsの紹介
kotlinx-nodejsは、Node.jsのAPIのKotlin/JS向けの型定義を提供します。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を返すだけの簡単なサーバーを書いてみます。
funmain(){valserver=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ファイルを以下の内容で作成します。
varnodeExternals=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/