🐈

vscodeでワークスペースをrootで開いた際、サブディレクトリのjestモジュールが読み込まれない問題の解決方法

2021/02/03に公開

はじめに

TypeScriptのモノリポ構成のパッケージでJestのテストファイルを開いた際に Cannot find name 'describe' と表示されてしまう問題の解決方法です。

課題

下記のような構成で複数のプロジェクトが1つのパッケージにあるとします。
VSCODEでワークスペースをrootで開いた場合、jestのモジュールが読み込まれず、エラーが表示される。

- .vscode
- app1
  - ...
- app2
  - ...
- .prettierrc.js

解決方法

自分が調べた限り解決方法を2つ見つけました。

  1. 開くワークスペースをapp1のようにプロジェクトがrootになるようにする
  2. tsconfig.json でtestファイルもビルドに含まれるようにする

開くワークスペースをapp1のようにプロジェクトがrootになるように開く

こちらはVSCODEで開くワークスペースを変更するだけです。

しかし、rootに.vscode.prettierrc.jsのような設定ファイルが置かれている場合、開く場所を変えると読み込まれないです。
この時、各プロジェクトでシンボリックリンクを作成するなどの対策が必要です。

またこの方法は他のプロジェクトやrootのファイルが参照しづらいというデメリットがあります。

tsconfig.json でtestファイルもビルドに含まれるようにする

こちらはtsconfig.jsonの設定を変えることで対応可能です。rootのワークスペースから開くことができるので、他のプロジェクトファイルの参照も簡単に可能です。
下記のようにテストファイルもビルドに含まれるようにすると正しく読み込まれました。

tsconfig.json
{
  "compilerOptions": {
    "target": "ES2019",
    "module": "commonjs",
    "sourceMap": true,
    "outDir": "./dist",
    "strict": true,
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": [
    "./src/**/*",
    "__tests__"
  ]
}

しかし、このままではビルド時の成果物に不要なテストコードも含まれてしまいます。この時の解決方法としてはtsconfig.jsontsconfig-build.json のようにビルド用のconfigファイル別途作成するで対応可能です。

参考資料

https://ucwork.hatenablog.com/entry/2018/12/28/101847

https://stackoverflow.com/questions/57452111/vscode-not-recognizing-types-in-sub-directories

おわりに

調べた際に、以外と情報がなかったのでまとめました。

Discussion