TypeScriptのビルドプロセス
TypeScriptで書かれたアプリケーションは、本番環境で実行する前にJavaScriptにコンパイルする必要があります。
TypeScriptのソースファイルのコンパイルは、さまざまなビルドツールを使用して行うことができます。しかし、AdonisJSでは、最もシンプルなアプローチを採用し、以下の信頼性のあるツールを使用しています。
以下に挙げるすべてのツールは、公式のスターターキットとして開発依存関係として事前にインストールされています。
-
TSC は、TypeScriptの公式コンパイラです。TSCを使用して型チェックを行い、本番ビルドを作成します。
-
TS Node は、TypeScriptのJust-in-Timeコンパイラです。これにより、TypeScriptファイルをコンパイルせずに実行することができ、開発には非常に便利なツールです。
-
SWC は、Rustで書かれたTypeScriptコンパイラです。開発時にTS Nodeと組み合わせて使用し、JITプロセスを非常に高速化します。
ツール | 用途 | 型チェック |
---|---|---|
TSC | 本番ビルドの作成 | はい |
TS Node | 開発 | いいえ |
SWC | 開発 | いいえ |
コンパイルせずにTypeScriptファイルを実行する
ts-node/esm
ローダーを使用して、TypeScriptファイルをコンパイルせずに実行できます。たとえば次のコマンドを実行することで、HTTPサーバーを起動できます。
node --loader="ts-node/esm" bin/server.js
-
--loader
:ローダーフラグは、ESモジュールシステムにモジュールローダーフックを登録します。ローダーフックは、Node.js APIの一部です。 -
ts-node/esm
:TypeScriptソースをJavaScriptにJust-in-Timeコンパイルするためのライフサイクルフックを登録するts-node/esm
スクリプトへのパスです。 -
bin/server.js
:AdonisJSのHTTPサーバーエントリーポイントファイルへのパスです。詳細はこちらを参照してください:ファイル拡張子に関する注意事項
同様に、他のTypeScriptファイルに対してもこのプロセスを繰り返すことができます。例えば:
node --loader ts-node/esm bin/test.js
node --loader ts-node/esm bin/console.js
node --loader ts-node/esm path/to/file.js
ファイル拡張子に関する注意事項
ディスク上のファイルは.ts
の拡張子で保存されているにもかかわらず、私たちはいたるところで.js
の拡張子を使用していることに気付いたかもしれません。
これは、ESモジュールでは、インポートやスクリプトの実行時に.js
拡張子を使用するようにTypeScriptが強制されるためです。この選択の背後にある理論については、TypeScriptのドキュメントで学ぶことができます。
開発サーバーの実行
bin/server.js
ファイルを直接実行する代わりに、以下の理由からserve
コマンドの使用をオススメします。
- コマンドにはファイルウォッチャーが含まれており、ファイルの変更時に開発サーバーを再起動します。
serve
コマンドは、アプリケーションで使用しているフロントエンドアセットバンドラーを検出し、その開発サーバーを起動します。たとえば、プロジェクトのルートにvite.config.js
ファイルがある場合、serve
コマンドはvite
の開発サーバーを起動します。
node ace serve --watch
--assets-args
コマンドラインフラグを使用して、Viteの開発サーバーコマンドに引数を渡すことができます。
node ace serve --watch --assets-args="--debug --base=/public"
Viteの開発サーバーを無効にするには、--no-assets
フラグを使用します。
node ace serve --watch --no-assets
Node.jsコマンドラインにオプションを渡す
serve
コマンドは、開発サーバー(bin/server.ts
ファイル)を子プロセスとして起動します。子プロセスにnodeの引数を渡したい場合は、コマンド名の前にそれらを定義することができます。
node ace --no-warnings --inspect serve --watch
本番ビルドの作成
AdonisJSアプリケーションの本番ビルドは、node ace build
コマンドを使用して作成されます。build
コマンドは、以下の操作を実行して、./build
ディレクトリ内にスタンドアロンのJavaScriptアプリケーションを作成します。
- 既存の
./build
フォルダを削除します(存在する場合)。 ace.js
ファイルをゼロから書き直して、ts-node/esm
ローダーを削除します。- Viteを使用してフロントエンドアセットをコンパイルします(設定されている場合)。
tsc
を使用してTypeScriptのソースコードをJavaScriptにコンパイルします。metaFiles
配列に登録されている非TypeScriptファイルを./build
フォルダにコピーします。package.json
およびpackage-lock.json/yarn.lock
ファイルを./build
フォルダにコピーします。
ace.js
ファイルへの変更はビルドプロセス中に失われます。ビルドの前にAceが開始される前に実行する追加のコードがある場合は、代わりにbin/console.ts
ファイル内で行うべきです。
以上です!
node ace build
ビルドが作成されたら、build
フォルダに移動し、本番依存関係をインストールしてアプリケーションを実行できます。
cd build
# 本番依存関係のインストール
npm i --omit=dev
# サーバーの実行
node bin/server.js
--assets-args
コマンドラインフラグを使用して、Viteビルドコマンドに引数を渡すことができます。
node ace build --assets-args="--debug --base=/public"
フロントエンドアセットのコンパイルを回避するには、--no-assets
フラグを使用します。
node ace build --no-assets
スタンドアロンビルドとは何ですか?
スタンドアロンビルドとは、元のTypeScriptソースなしで実行できるアプリケーションのJavaScript出力を指します。
スタンドアロンビルドを作成することで、デプロイするコードのサイズを削減できます。ソースファイルとJavaScript出力の両方をコピーする必要がないためです。
本番ビルドを作成した後、./build
を本番サーバーにコピーし、依存関係をインストールし、環境変数を定義してアプリケーションを実行できます。