Visual Studio CodeでTypeScriptのコード補完が効かなくなったのでtsconfigを修正した
要約
Visual Studio Code(以下VS Code)で以下のメッセージが出てTypeScriptのコード補完が効かなくなりました。
To enable project-wide JavaScript/TypeScript language features,
exclude large folders with source files that you do not work on.
TypeScriptのコード補完をする対象ファイルのサイズが大きすぎたようで、tsconfig
で大きいサイズのファイル(今回だとnuxtのoutput)をexclude
したら治りました。
{
// ...
// @ext:vscode.typescript-language-features
// ファイルサイズがTypeScriptのコード補完できるサイズを超えているというエラーの回避用
+"exclude": [
+ "output/public/_nuxt/",
+ ]
}
エラー解決の手順
- JavaScript,TypeScriptのコード補完を有効にするために、作業しないソースファイルがある大きなフォルダーを除外してくださいという通知がでる
- VS Codeで
@ext:vscode.typescript-language-features
の設定を変更し、tsserverのlogファイルを出力する - logからファイルサイズ超過の原因となるファイルを特定
- 該当ファイルを
tsconfig
でexclude
経緯
1. ファイルが大きすぎて補完が効かないというエラーが発生
VS Codeで編集していると、以下のメッセージが出てきました。
To enable project-wide JavaScript/TypeScript language features,
exclude large folders with source files that you do not work on.
プロジェクト全体のJavaScript/TypeScript言語機能を有効にするためには、作業しないソースファイルがある大きなフォルダーを除外してくださいというメッセージでした。
2. typescript-language-featuresのlogを出力する
調べたところ、TypeScriptのリポジトリで今回の問題に対する議論が上がっており、結論、VS Codeに組み込まれているtypescript-language-features
が原因であることがわかりました。
tsserverのlog出力と確認手順
上記リンク先にも記載がありますが補足します。
初めに、VS Code右上の三点リーダーからconfigure editor
を選択し、検索バーに@ext:vscode.typescript-language-features log
と入力します。
次に、tsserverのlogを出す設定をします。初期設定ではTypeScript>Tsserver:log
がoff
になっているのでnormal
を選択してください。
最後に、tsserverのlogがどこに出力されているかを特定します。VS Codeのterminal画面にOUTPUTがあるので、そこでTypeScript
を選択すると、tsserver.log
が見つかります。
tsserver.log
でエラーの原因を特定
3. 先ほど見つけたtsserver.log
を確認します。まず、Could not find source file
が出ており、tsserverがファイルが読み込めていないことが確認できました。
Error: Could not find source file:
'/Users/name/project/client/componenTypeScript/atom/InputField/index.vue'.
続けて、以下のようにNon TS file size exceeded limit
が確認できました。この後に続くフォルダーがエラーメッセージの原因だと考えられます。
今回はnuxtをbuildした後のファイル(output/public/_nuxt
)がtsserverで読み込む対象に含まれており、読み込み可能なファイルサイズを超えてしまいました。
Info 12 [09:58:13.648] Non TS file size exceeded limit (21175977).
Largest files: /Users/name/project/client/output/public/_nuxt/BYFg9WlK.js:555803,
/Users/name/project/client/output/public/_nuxt/CFAdppzp.js:555803,
/Users/name/project/client/output/public/_nuxt/JazV3xHV.js:555803,
/Users/name/project/client/output/public/_nuxt/V42d_FHD.js:555803,
/Users/name/project/client/output/public/_nuxt/i7pFhaQ6.js:555803
tsconfig.json
でファイルサイズが大きなファイルをtsserverの監視対象から除外
4. TypeScriptのlanguage serverがtsconfigから設定を読み込んでいるlog
Info 28 [09:58:19.567] getConfigFileNameForFile:: File: Grid.story.vue ProjectRootPath: client:: Result: /Users/name/project/client/tsconfig.json
Info 29 [09:58:19.567] getConfigFileNameForFile:: File: Grid/index.vue ProjectRootPath: client:: Result: /Users/name/project/client/tsconfig.json
Info 30 [09:58:19.567] getConfigFileNameForFile:: File:BasicPlanConfirm/index.test.TypeScript ProjectRootPath: client:: Result: /Users/name/project/client/tsconfig.json
先ほど、Non TS file size exceeded limit
の原因がoutput/public/_nuxt
であることが分かりました。logを見るとtsserverはtsconfig
で設定を読み込んでいることが分かったので、対象となるファイルをexclude
しました。
tsconfig.json
+ "exclude": [
+ "output/public/_nuxt/",
+ ]
これで無事補完が効くようになりました!
Discussion