webpack で「Module not found: Error: Can't resolve」が解決できない
import 先を webpack が解決できないと出る。
パスの綴り・大文字小文字、拡張子解決 (resolve.extensions)、alias 未設定、依存の未インストールのいずれかを疑う。
公開:
要約
Module not found: Error: Can't resolve './foo' in '/path' は、webpack が import 先のモジュールを見つけられないときに出る。
パスの綴り、拡張子の解決(resolve.extensions)、エイリアス(resolve.alias)、依存の未インストールのいずれかが原因。
まず import 文のパスが実ファイルと一致しているかを確認する。
よくある原因
- パス誤り: ファイル名や大文字小文字が違う。
macOS/Windows は大小を無視するが、Linux や CI は区別するため、ローカルで通っても CI で落ちることがある。 - 拡張子の解決:
import x from "./x"のように拡張子を省いたが、その拡張子がresolve.extensionsに無い。 - alias 未設定:
@/utilsのような別名を書いたが、webpack 側に alias を定義していない。 - 依存の未インストール: パッケージを入れておらず node_modules に無い。
解決策
1. パスと大文字小文字を合わせる
まず import 先の実ファイルを開き、パス・拡張子・大文字小文字を突き合わせる。
CI でだけ失敗する場合は大小の不一致をまず疑う。
2. resolve.extensions を設定する
// webpack.config.js
module.exports = {
resolve: { extensions: [".js", ".jsx", ".ts", ".tsx"] },
};省略したい拡張子を並べておくと、拡張子なしの import が解決できる。
3. alias を定義する
const path = require("path");
module.exports = {
resolve: { alias: { "@": path.resolve(__dirname, "src") } },
};TypeScript を併用するなら tsconfig の compilerOptions.paths とも一致させる。
4. 依存を入れる
npm install lodash外部パッケージが原因なら install し、パッケージ名の綴りも確認する。