2025/08/03 19:11 Comptime.ts: compile-time expressions for TypeScript

やあ、ロボ子!今日は`comptime.ts`という面白いものを見つけたのじゃ!

`comptime.ts`ですか?それは一体何をするものなのですか?

これはTypeScriptコンパイラで、`comptime`とマークされた式をコンパイル時に評価してくれるのじゃ!つまり、実行時ではなく、コンパイル時に計算が終わるから、コードが最適化されるってわけ。

コンパイル時の計算で最適化、ですか。具体的にはどういうことでしょう?

例えば、設定ファイルから値を読み込んで、それを使って何か計算する時、普通は実行時に計算するじゃろ?でも`comptime.ts`を使えば、コンパイル時に計算結果を埋め込めるから、実行時の処理が軽くなるのじゃ!

なるほど!それは便利ですね。Bun macrosやZig comptimeに触発されたプロジェクトとのことですが、インストールは簡単ですか?

`bun add comptime.ts`とかで簡単にインストールできるぞ!ViteやBun bundlerでも使えるし、CLIやAPIからも使えるみたいじゃ。

Viteで使う場合は、Viteの設定に`comptime()`プラグインを追加するんですね。

そうそう!`comptime()`関数で囲んだ式がコンパイル時に評価されるのじゃ。Promiseの解決もできるらしいぞ。

`comptime.defer()`関数というのもありますね。これはどういう時に使うんですか?

これは全てのモジュールのコンパイル時評価が終わった後にコードを実行したい時に使うのじゃ。例えば、コンパイル時に生成したファイルを最後に処理するとかじゃな。

仕組みとしては、TypeScriptコードを解析して、`type: "comptime"`でマークされたインポートを探し、関連する式を評価して結果で置き換えるんですね。

その通り!ただし、JSONシリアライズ可能な値しか使えないという制限があるから注意が必要じゃ。

ベストプラクティスとしては、定数値の計算や静的コンテンツの生成、パフォーマンスが重要なコードの最適化に利用するのが良いみたいですね。

そうじゃな。例えば、複雑な数式をコンパイル時に計算しておけば、実行時の負荷を減らせるじゃろ?

トラブルシューティングの際は、エラーメッセージを確認したり、`DEBUG=comptime:*`で詳細なログを出力したりすると良さそうですね。

あと、`comptime.ts`は、`type: "comptime"`でマークされたインポートを削除して、コンパイル時の式を置き換えるけど、コンパイル後に残る可能性のある他の冗長なコードは削除しないらしいから、そこも注意じゃ。

なるほど、不要なコードは自分で削除する必要があるんですね。

そういうことじゃ!しかし、コンパイル時に計算できるって、まるでタイムマシンみたいじゃな!

確かにそうですね!でも、過去に戻ってバグを修正することはできませんよ、博士。

むむ、それは残念じゃ!でも、コンパイル時にバグを見つけられるように頑張るぞ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
