エラー文の通り、何かしらの原因でtypescriptコンパイラがソースファイルを見つけられていない、という事象が起きています。
なので、typescriptコンパイラが「どういう考えで」「どのパス」に対象のソースファイルを探しに行っているのかを知ることが出来れば、原因が特定できそうです。
コンパイラのファイル探しの挙動を見る方法
下記のどちらかを行うことで、typescriptコンパイラのファイル探しの挙動をみることが出来ます。(参考)
-
tsc
でコンパイル時に--traceResolution
オプションを付ける -
tsconfig.json
のtraceResolution
をtrue
に設定しコンパイルする
このようなログが出るようになります↓
======== Resolving module './infra/logger/LoggerModule.js' from '/app/AppModule.ts'. ========
Step #0: Explicitly specified module resolution kind: 'Node16'.
Step #0: Resolving in ESM mode with conditions 'node', 'import', 'types'.
Step #0: Loading module as file / folder, candidate module location '/app/infra/logger/LoggerModule.js', target file type 'TypeScript'.
Step #0: File name '/app/infra/logger/LoggerModule.js' has a '.js' extension - stripping it.
Step #0: File '/app/infra/logger/LoggerModule.ts' exist - use it as a name resolution result.
Step #0: ======== Module name './infra/logger/LoggerModule.js' was successfully resolved to '/app/infra/logger/LoggerModule.ts'. ========
/app/AppModule.ts
でimportされている./infra/logger/LoggerModule.js
について、Node16
というモジュール解決方法に従って/app/infra/logger/LoggerModule.ts
というパスを探しに行っていることが分かります。
疑うポイント
下記以外にも疑うポイントたくさんあると思います!切り分けていきましょう!
コンパイラ設定は合っているが対象ファイルがない
-
npm install
/yarn install
忘れていませんか? - ファイル名の大文字小文字だけを変えた場合、その改名がgit commitできていますか?
対象ファイルはあるがコンパイラ設定が誤っている
- baseUrlは正しく設定されていますか?
- moduleResolutionは正しく設定されていますか?
- moduleDetectionは正しく設定されていますか?
ちなみに僕は「ファイル名の大文字小文字だけを変えた」時に改名がgit commitできておらず、ローカルではビルド成功するのにCDでだけ落ちており、数時間詰まりました。ファ●ク