概要
"exclude": ["node_modules"]
コンパイルする対象から除外するファイルを記述します。
includeと同じワイルドカードが使えます。
このオプションは指定しない場合、デフォルトで以下の値を含みます。
node_modules
bower_components
jspm_packages
- outDirオプションで指定しているディレクトリ配下のファイル
逆に言うと、tsconfig.json
に明示的にこのオプションが指定されている場合は、上記のデフォルト値が指定されなくなるので注意が必要です。
詳しく
$ npx tsc -v
Version 4.0.3
{
"compilerOptions": {
"outDir": "./dist",
"allowJs": true
},
"exclude": ["node_modules"]
}
src/
└── hoge.ts
となっているとしましょう。
この状態でtsc
コマンドを叩くと、1 回目は成功します。
src/
└── hoge.ts
dist/
└── hoge.js
これは想定通りだと思いますが、この状態でもう一回叩くと下記のようなエラーが出ます。
src/hoge.ts:1:7 - error TS2451: Cannot redeclare block-scoped variable 'hoge'.
1 const hoge: string = "hoge";
~~~~
dist/hoge.js:2:5
2 var hoge = "hoge";
~~~~
'hoge' was also declared here.
Found 1 error.
ディレクトリ構造を見るとなんかすごいことになっています。
src/
└── hoge.ts
dist/
├── dist
│ └── hoge.js
├── hoge.js
└── src
└── hoge.js
これはつまり上述の通り、明示的にexclude
にnode_moduls
のみを指定した影響で、outDirに指定されているディレクトリ(今回で言うとdist
)がexclude
のデフォルト指定から外れてしまったためです。
そしてallowJsがtrue
になっているので、コンパイル結果であるhoge.js
もコンパイル対象になってしまったんですね。
それでもexclude
に明示的に指定する必要がある場合は純粋にoutDirに指定しているファイルも明示的に指定すれば解決です。
{
"compilerOptions": {
"outDir": "./dist",
"allowJs": true
},
"exclude": ["node_modules", "dist"] // <- dist を足した
}
これで正常にコンパイルできるようになります。
files と include と exclude の適用順番
簡単に言うと優先順位はfiles > exclude > include
includeで指定されたファイルはexcludeで除外されるが、filesに指定したファイルはexcludeに関係なく問答無用でコンパイル対象になる。
また、このルールによってコンパイル対象になったファイルが参照するファイルもコンパイル対象に含まれる。