この記事では、Vite.jsに関わるtsconfig
の設定について説明していきます。これらの設定は、プロジェクトのビルドプロセスや動作に大きく影響するため、適切に設定することが重要です。
isolatedModules
TypeScriptコンパイラ(tsc
)は複数のファイルを考慮したトランスパイルを行うため、全体の型情報を元にトランスパイルを行います。しかし、BabelやSWCなどの他のトランスパイラはシングルファイルのトランスパイルを行うため、全体の型情報を元にトランスパイルすることができません。
isolatedModules
オプションを有効にすると、TypeScriptが正しく解釈できない場合に警告を出すようになります。これは、tsc
以外のコンパイラでも正しくコンパイルできるようなコードを書くことを強制するためのオプションです。
例えば
export type User = { name: string; age: number; };
という型を定義したファイルがあるが、これを
export { User } from './types';
とexportしていたとします。 この時 export しているファイルのみをみるとこれが実体を持つオブジェクトなのか型なのか判断がつきません。 このように一つのファイルを見ても判断が付くように、この場合は
export { type User } from './types';
と type をつけて対応します。
viteではesbuildを使用しており、esbuildでもファイルを独立してみるためこのオプションは必須になります。
{ "compilerOptions": { "isolatedModules": true } }
useDefineForClassFields
TypeScriptのターゲットをESNext
またはES2022
とすると、このオプションは自動的にtrue
になります。useDefineForClassFields
オプションを有効にすることで、ES(ECMAScript)の仕様に沿ったクラスフィールドの初期化が行われます。
例えば下記の様なTypeScriptで書かれたclassがあったとします。
class Sample { value1 = "" value2?: string }
このファイルを useDefineForClassFields
を false
でトランスパイルすると
"use strict"; class Sample { constructor() { this.value1 = ""; } }
となり、 useDefineForClassFields
を true
でトランスパイルすると
"use strict"; class Sample { value1 = ""; value2; }
となります。結果から分かるようにTypeScriptでは値を格納していない value2
のプロパティが useDefinedForClassFields
の値によって、吐き出されない場合があります。
このオプションを有効化することで、例えば Object.keys(instance)
の挙動などが以前と異なる場合があります。MobXなどの多くのライブラリはuseDefineForClassFields
がtrue
であることを前提としていますが、いくつかのライブラリはまだ対応していない場合があるため、注意が必要です。
{ "compilerOptions": { "useDefineForClassFields": true } }
target
Viteを使用する場合、tsconfig
に記載したtarget
オプションよりも、vite.config.js
に記載したtarget
オプションが優先されます。es2022
以上でない場合、静的初期化ブロック(static initialization blocks)などのサポートされなくなります。
静的初期化ブロックの例
class ClassWithStaticInitializationBlock { static staticProperty1 = 'Property 1'; static staticProperty2; static { this.staticProperty2 = 'Property 2'; } }
この場合、ターゲットはESNext
やES2022
以上のバージョンを指定することが推奨されます。
{ "compilerOptions": { "target": "ESNext" } }
その他の重要なオプション
strict
: すべての厳格モードのチェックを有効にします。module
: Viteではesnext
が推奨されます。jsx
: Reactを使用する場合は、react-jsx
やreact-jsxdev
を設定します。
{ "compilerOptions": { "strict": true, "module": "esnext", "jsx": "react-jsx" } }
これらの設定を正しく行うことで、Vite.jsプロジェクトのビルドプロセスがスムーズに進み、開発体験が向上します。プロジェクトの要件に合わせて、適切にtsconfig
の設定を調整しましょう。