【TypeScript / Next.js】build用のtsconfig.jsonを用意してtestなどの不要なファイルを除く方法
やりたいこと
前提として、TypeScript/Next.jsで構成されたアプリケーションの開発の話です
TypeScriptではtsconfig.json
でコンパイラで読み込む対象と除外する対象のファイルのパスを指定することができます
そこで、開発時には全てのファイルをコンパイル対象にし、build時にはtestやstorybookなどbuildに必要のないファイルを除外してbuildを高速化・軽量化できるようにすることができないか、というのが今回の目的です
ちなみに、ChatGPTにbuild時に不要なファイルを除外することについて聞いてみるとこんな感じの回答が返ってきました
方針と調査
全てを含むtsconfig.json
と、buildに不要なファイルをexcludeで除いたtsconfig.build.json
を用意し、build時だけtsconfig.build.json
を読み込むようにすることができれば今回の目的は達成できるのではないかと考えました
ただTypeScriptコンパイラを実行するだけであれば次のように--project
オプションで指定できます
tsc --project tsconfig.build.json
また、webpackの場合も次の記事のようにすれば実現できます
しかし、Next.jsでtsconfig.json
を切り替える方法について調べてみると意外と出てきませんでした・・・
一応、Next.jsの公式ドキュメントによるとnext.config.js
のoptionでtypescriptに関する設定ができそうに見えます
ただし、ignoreBuildErrors
の設定しか触れられていません
そこで、Next.jsのソースコードでtypescriptに関する設定ができないか探してみると、次の部分で指定のtsconfigPath
を読み込んでくれることが分かりました
つまり、next.config.js
でtsconfigPath
を指定してあげれば任意のtsconfig.json
でbuildすることができそうです!
余談ですが、リポジトリのURLにアクセスして次のように github.com
をgithub.dev
にするとブラウザでVSCodeが開けるので検索などが楽です
やってみる
まずnode_modules
以外の全てをコンパイルするためのtsconfig.json
を用意します
デフォルトでtsconfig.json
が読み込まれるので、別途このファイルを参照するためのパスの指定はしていません
{
"compilerOptions": {
// 省略
},
"include": [
// 省略
],
"exclude": [
"node_modules"
]
}
そして、tsconfig.json
のexcludeにtestやstorybookを除外したものをtsconfig.build.json
とします
この場合は*.test.tsx
と*.storybook.tsx
を除外するようにしていますが、ご自身が除外したいファイルに応じて変更してください
exclude以外は同じなのでtsconfig.json
をextends
して利用します
{
"extends": "./tsconfig.json",
"exclude": [
"node_modules",
"**/*.test.tsx",
"**/*.storybook.tsx"
]
}
あとはnext.config.js
でtsconfig.build.json
を読み込むようにすれば完了です
module.exports = {
typescript: {
tsconfigPath: 'tsconfig.build.json',
},
}
確認
next build
を実行すると次のような表示が出てtsconfig.build.json
が参照されていることが確認できました!
Using tsconfig file: tsconfig.build.json
終わりに
公式ドキュメントにtsconfigPath
に関する記述を追加するPRでも出してみようかな
Discussion