TypeScript ビルドプロセス

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
Aceコマンドを実行する
node --loader ts-node/esm bin/console.js
他のTypeScriptファイルを実行する
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を本番サーバーにコピーし、依存関係をインストールし、環境変数を定義してアプリケーションを実行できます。