サポートされるバージョンと設定
このページでは、WebAssemblyプロポーザル、サポートされるブラウザ、およびKotlin/Wasmを用いた効率的な開発のための推奨設定について詳しく説明します。
ブラウザのバージョン
Kotlin/Wasmは、ガベージコレクション (WasmGC)や例外処理といった最新のWebAssemblyプロポーザルに依拠し、WebAssembly内で改善と新機能を導入しています。
これらの機能が正しく動作することを確認するために、最新のプロポーザルをサポートする環境を提供してください。お使いのブラウザバージョンが新しいWasmGCをデフォルトでサポートしているか、または環境に変更を加える必要があるかを確認してください。
Chrome
バージョン119以降の場合:
デフォルトで動作します。
以前のバージョン (119より古い) の場合:
古いブラウザでアプリケーションを実行するには、1.9.20より古いKotlinバージョンが必要です。
- ブラウザで
chrome://flags/#enable-webassembly-garbage-collection
にアクセスします。 - WebAssembly Garbage Collectionを有効にします。
- ブラウザを再起動します。
- ブラウザで
Chromiumベース
Edge、Brave、Opera、Samsung InternetなどのChromiumベースのブラウザを含みます。
バージョン119以降の場合:
デフォルトで動作します。
以前のバージョン (119より古い) の場合:
古いブラウザでアプリケーションを実行するには、1.9.20より古いKotlinバージョンが必要です。
--js-flags=--experimental-wasm-gc
コマンドライン引数を使用してアプリケーションを実行します。
Firefox
バージョン120以降の場合:
デフォルトで動作します。
バージョン119の場合:
- ブラウザで
about:config
にアクセスします。 javascript.options.wasm_gc
オプションを有効にします。- ページを再読み込みします。
- ブラウザで
Safari/WebKit
バージョン18.2以降の場合:
デフォルトで動作します。
以前のバージョン (18.2より古い) の場合:
サポートされていません。
Safari 18.2はiOS 18.2、iPadOS 18.2、visionOS 2.2、macOS 15.2、macOS Sonoma、およびmacOS Venturaで利用可能です。 iOSおよびiPadOSでは、Safari 18.2はオペレーティングシステムにバンドルされています。これを入手するには、デバイスをバージョン18.2以降にアップデートしてください。
詳細については、Safariリリースノートを参照してください。
Wasmプロポーザルのサポート
Kotlin/Wasmの改善はWebAssemblyプロポーザルに基づいています。ここでは、WebAssemblyのガベージコレクションプロポーザルと (レガシーな) 例外処理プロポーザルのサポートに関する詳細を見つけることができます。
ガベージコレクションプロポーザル
Kotlin 1.9.20以降、KotlinツールチェインはWasmガベージコレクション (WasmGC) プロポーザルの最新バージョンを使用しています。
このため、Wasmプロジェクトを最新バージョンのKotlinにアップデートすることを強く推奨します。また、Wasm環境では最新バージョンのブラウザを使用することをお勧めします。
例外処理プロポーザル
Kotlinツールチェインは、デフォルトでレガシー例外処理プロポーザルを使用しており、生成されたWasmバイナリをより広範な環境で実行できるようにしています。
Kotlin 2.0.0以降、Kotlin/Wasm内でWasm例外処理プロポーザルの新しいバージョンのサポートを導入しました。
このアップデートにより、新しい例外処理プロポーザルがKotlinの要件に合致し、プロポーザルの最新バージョンのみをサポートする仮想マシンでKotlin/Wasmを使用できるようになります。
新しい例外処理プロポーザルは、-Xwasm-use-new-exception-proposal
コンパイラオプションを使用して有効化されます。これはデフォルトで無効になっています。
プロジェクトのセットアップ、依存関係の使用、およびその他のタスクについては、Kotlin/Wasmの例で詳しく学ぶことができます。
デフォルトインポートの使用
Kotlin/WasmコードをJavascriptにインポートする方法は、デフォルトエクスポートから名前付きエクスポートに移行しました。
引き続きデフォルトインポートを使用したい場合は、新しいJavaScriptラッパーモジュールを生成します。次のスニペットを含む.mjs
ファイルを作成します。
// Specifies the path to the main .mjs file
import * as moduleExports from "./wasm-test.mjs";
export { moduleExports as default };
新しい.mjs
ファイルをリソースフォルダに配置すると、ビルドプロセス中にメインの.mjs
ファイルの隣に自動的に配置されます。
.mjs
ファイルをカスタムの場所に配置することもできます。この場合、手動でメインの.mjs
ファイルの隣に移動するか、インポートステートメント内のパスをその場所に一致するように調整する必要があります。
Kotlin/Wasmのコンパイルが遅い
Kotlin/Wasmプロジェクトで作業しているときに、コンパイルに時間がかかることがあります。これは、Kotlin/Wasmツールチェインが変更を加えるたびにコードベース全体を再コンパイルするためです。
この問題を軽減するために、Kotlin/Wasmターゲットはインクリメンタルコンパイルをサポートしています。これにより、コンパイラは前回のコンパイルからの変更に関連するファイルのみを再コンパイルできます。
インクリメンタルコンパイルを使用すると、コンパイル時間が短縮されます。これにより、現時点での開発速度は2倍になり、将来のリリースでさらに改善される予定です。
現在の設定では、Wasmターゲットのインクリメンタルコンパイルはデフォルトで無効になっています。 これを有効にするには、プロジェクトのlocal.properties
またはgradle.properties
ファイルに次の行を追加します。
kotlin.incremental.wasm=true
Kotlin/Wasmのインクリメンタルコンパイルを試して、フィードバックを共有してください。 皆様の洞察は、この機能をより早く安定させ、デフォルトで有効にするのに役立ちます。
完全修飾クラス名の診断
Kotlin/Wasmでは、アプリケーションサイズの増加を避けるため、デフォルトではコンパイラがクラスの完全修飾名 (FQNs) を生成されたバイナリに保存しません。
このため、完全修飾名機能を明示的に有効にしない限り、Kotlin/WasmプロジェクトでKClass::qualifiedName
プロパティを呼び出すと、コンパイラはエラーを報告します。
この診断はデフォルトで有効になっており、エラーは自動的に報告されます。この診断を無効にし、Kotlin/WasmでqualifiedName
を許可するには、build.gradle.kts
ファイルに次のオプションを追加して、すべてのクラスの完全修飾名を保存するようにコンパイラに指示します。
// build.gradle.kts
kotlin {
wasmJs {
...
compilerOptions {
freeCompilerArgs.add("-Xwasm-kclass-fqn")
}
}
}
このオプションを有効にすると、アプリケーションサイズが増加することに注意してください。
配列の範囲外アクセスとトラップ
Kotlin/Wasmでは、配列に範囲外のインデックスでアクセスすると、通常のKotlin例外ではなくWebAssemblyトラップがトリガーされます。トラップは現在の実行スタックを直ちに停止します。
JavaScript環境で実行される場合、これらのトラップはWebAssembly.RuntimeError
として現れ、JavaScript側でキャッチできます。
実行可能ファイルをリンクする際に、コマンドラインで次のコンパイラオプションを使用することで、Kotlin/Wasm環境でのこのようなトラップを回避できます。
-Xwasm-enable-array-range-checks
または、GradleビルドファイルのcompilerOptions {}
ブロックに追加します。
// build.gradle.kts
kotlin {
compilerOptions {
freeCompilerArgs.add("-Xwasm-enable-array-range-checks")
}
}
このコンパイラオプションを有効にすると、トラップの代わりにIndexOutOfBoundsException
がスローされます。
詳細については、このYouTrack issueを参照し、フィードバックを共有してください。
実験的アノテーション
Kotlin/Wasmは、一般的なWebAssemblyの相互運用性のためにいくつかの実験的アノテーションを提供しています。
@WasmImport
と@WasmExport
を使用すると、Kotlin/Wasmモジュールの外部で定義された関数を呼び出したり、Kotlin関数をホストまたは他のWasmモジュールに公開したりできます。
これらのメカニズムはまだ進化中のため、すべてのアノテーションは実験的としてマークされています。 これらを使用するには明示的にオプトインする必要があり、その設計や動作は将来のKotlinバージョンで変更される可能性があります。
デバッグ中の再読み込み
モダンブラウザでのアプリケーションのデバッグは、特別な設定なしで動作します。 開発用Gradleタスク (*DevRun
) を実行すると、Kotlinは自動的にソースファイルをブラウザに提供します。
ただし、ソースをデフォルトで提供すると、Kotlinのコンパイルとバンドルが完了する前に、ブラウザでアプリケーションが繰り返し再読み込みされる問題が発生する可能性があります。 回避策として、Kotlinのソースファイルを無視し、提供される静的ファイルの監視を無効にするようにwebpack設定を調整します。プロジェクトのルートにあるwebpack.config.d
ディレクトリに、以下の内容の.js
ファイルを追加します。
config.watchOptions = config.watchOptions || {
ignored: ["**/*.kt", "**/node_modules"]
}
if (config.devServer) {
config.devServer.static = config.devServer.static.map(file => {
if (typeof file === "string") {
return {
directory: file,
watch: false,
}
} else {
return file
}
})
}