Rails7のフロントエンド開発環境としてjsbundlingのesbuildを採用した際にTypeScriptの導入に少し手こずりましたので備忘録として記事にしました。参考になれば幸いです。
esbuildではTypeScriptの型チェックは行ってくれない
esbuildはデフォルトでTypeScriptのコンパイルをサポートしています。
そのため、特段何かインストールしたりや設定する必要はありません。
ただしサポートしているのはコンパイルのみで、型チェックまでは行ってくれません。そのため別途tsc -noEmit
等のコマンドを並行して実行する必要があります。
それを踏まえると以下のようなnpm scriptsになるかと思います。
package.json(抜粋)
"scripts": { "build:js": "esbuild ./app/javascript/application.ts --bundle --sourcemap --outdir=app/assets/builds", "build:css": "sass ./app/assets/stylesheets/application.bootstrap.scss ./app/assets/builds/application.css --no-source-map --load-path=node_modules", "type-check": "tsc -w --noEmit" }
これでも良いのですが、build:jsとtype-checkがそれぞれ別で動いてしまいますので、型チェック(type-check)が通ったらコンパイル(build:js)を実行するようなことができません。
そのため今回はtsc-watchという型チェックの監視プロセスの結果によって挙動を制御するnpmパッケージがありましたので、それを使用します。
yarn add -D tsc-watch
tsc-watchをインストールしましたら、package.jsonとProcfile.devを以下のように書き換えます。
package.json(抜粋)
"scripts": { "build:js": "esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds", "build:css": "tailwindcss -i ./app/assets/stylesheets/application.tailwind.css -o ./app/assets/builds/tailwind.css", "failure:js": "rm ./app/assets/builds/application.js && rm ./app/assets/builds/application.js.map", "dev:js": "tsc-watch --noClear -p tsconfig.json --onSuccess \"yarn build:js\" --onFailure \"yarn failure:js\"" }
また、Procfile.devでのjsコマンドもyarn dev:js
に変更します。
Procfile.dev
web: bin/rails server -b 0.0.0.0 -p 3000 js: yarn dev:js css: yarn build:css --watch
このようにすることでTypeScriptの型チェックが成功すればコンパイルを実行し、失敗すれば前回のコンパイルファイルを削除させるような分岐をすることができます。
ちなみに、tsc-watchは内部的にtsc
コマンドを使用していますので、開発環境にTypeScriptがインストールされていない状態だとcannot find module 'typescript/bin/tsc'
というエラーが出てしまいます。そのため、別途TypeScriptをインストールする必要がありますのでご注意ください。
yarn add -D typescript