- Node.js
Node.js Cannot find moduleの原因と直し方
Error: Cannot find module 'ms' は、require や import で読み込もうとしたモジュール(パッケージやファイル)を、Node.js が見つけられなかったときのエラーです。 エラー文の '...' の形で、原因の系統が分かれます。
エラー文の '...' |
何が見つからないか | 多い原因 |
|---|---|---|
'ms'・'express'(名前だけ) |
npm のパッケージ | npm install していない・別のフォルダーにある |
'./utils'(./ で始まる) |
自分のファイル | パスの間違い・大文字小文字 |
'/home/.../app.js'(絶対パス) |
実行しようとしたファイル | 実行したフォルダーが違う・ビルドしていない |
ERR_MODULE_NOT_FOUND ... '/x/src/math' |
ESM の import 先 | 拡張子(.js)を書いていない |
確認環境:Node.js 22.22.2、npm(確認日 2026年10月11日)。以下のエラーはすべて実際に実行して確かめました。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Node.js Cannot find moduleの原因と直し方」
エラー文の読み方:Require stack
Error: Cannot find module 'ms'
Require stack:
- /srv/s4/nm/app.js
code: 'MODULE_NOT_FOUND',
requireStack: [ '/srv/s4/nm/app.js' ]
| 部分 | 意味 |
|---|---|
Cannot find module 'ms' |
見つからなかったもの |
Require stack: の一番上 |
その require を書いたファイル。ここから探し始めた |
code: 'MODULE_NOT_FOUND' |
CommonJS(require)のとき。ESM(import)は ERR_MODULE_NOT_FOUND |
Require stack の一番上のファイルを開き、その中の require('ms') を探すのが出発点です。stack が何行もあるときは、下から上に向かって「どのファイルが、どのファイルを読み込んだか」の順番です。
原因1:パッケージを npm install していない
$ node app.js
Error: Cannot find module 'ms'
$ npm install ms
$ node app.js
7200000
| 確認すること | 方法 |
|---|---|
| package.json の dependencies に入っているか | 無ければ npm install パッケージ名 |
| node_modules にあるか | npm ls ms(無ければ (empty)) |
| clone しただけではないか | git では node_modules を管理しないので、clone 後に npm install |
npm ls で、入っているかどうかが分かります。
$ npm ls ms
nm@1.0.0 /srv/s4/nm
`-- ms@2.1.3 ← 入っている
$ npm ls nope
nm@1.0.0 /srv/s4/nm
`-- (empty) ← 入っていない
どこを探したかを確かめる
require.resolve("ms"); // '/srv/s4/nm/node_modules/ms/index.js'(見つかった場所)
require.resolve.paths("ms"); // 探す場所の一覧
// [ '/srv/s4/nm/node_modules', '/srv/s4/node_modules', '/srv/node_modules', '/node_modules' ]
Node.js は、require を書いたファイルのフォルダーから上へ順に node_modules を探します。 別のフォルダー(モノレポの別のパッケージ、ホームの node_modules など)に入れても見つかりません。
原因2:自分のファイルのパスが違う
(app2.js で require("./utils")、実際の場所は src/utils.js)
Error: Cannot find module './utils'
Require stack:
- /srv/s4/nm/app2.js
./ は、require を書いたファイルがあるフォルダーが起点です。実行したフォルダー(カレントディレクトリ)ではありません。require("./src/utils") に直すと動きました。
大文字小文字が違う
(ファイルは src/utils.js、require("./src/Utils"))
Error: Cannot find module './src/Utils'
Linux では大文字小文字を区別するため、見つかりませんでした。 Mac や Windows の通常の設定では、大文字小文字を区別しないことが多く、手元では動くのに、Linux のサーバー・Docker・CI でだけ落ちる、という形で出会います。ファイル名と require の綴りを完全に一致させます。
原因3:ESM(import)では拡張子が必須
(app8.mjs で import { mul } from "./src/m2")
Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/srv/s4/nm/src/m2' imported from /srv/s4/nm/app8.mjs
Did you mean to import "./src/m2.js"?
import で自分のファイルを読み込むときは、.js まで書く必要があります(Node.js 公式ドキュメント「Mandatory file extensions」)。require では省略できたので、CommonJS から ESM に書き換えたときに出ます。確認環境では、Did you mean to import "./src/m2.js"? と正しい書き方が表示されました(.mjs のファイルを指定したときは、この案内は出ませんでした)。
| 書き方 | require(CommonJS) | import(ESM) |
|---|---|---|
"./src/utils" |
動く(.js を補う) | エラー |
"./src/utils.js" |
動く | 動く |
"./lib"(フォルダーの index.js) |
動く | エラー(ERR_UNSUPPORTED_DIR_IMPORT。./lib/index.js と書く) |
TypeScript で ESM を書くときも、出力される JavaScript のファイル名に合わせて .js を書きます(import { x } from "./utils.js")。
原因4:実行したフォルダー・ビルドの有無
$ cd /srv/s4 && node app.js
Error: Cannot find module '/srv/s4/app.js' ← 実行したフォルダーに app.js が無い
$ node dist/index.js
Error: Cannot find module '/srv/s4/nm/dist/index.js' ← まだビルドしていない
絶対パスで表示されるときは、node に渡したファイル自体が無いという意味です。
| 状況 | 確認すること |
|---|---|
| 実行したフォルダーが違う | pwd で今いるフォルダー、package.json の場所 |
| TypeScript・ビルドツール | npm run build を先に実行したか、出力先(outDir)と node に渡したパスが合っているか |
package.json の main・start |
"start": "node dist/index.js" のパスが正しいか |
似たエラー:ファイルを読むときの ENOENT
(src/readcfg.js で fs.readFileSync("config.json")、ファイルは src/config.json)
Error: ENOENT: no such file or directory, open 'config.json'
require の ./ はファイルの場所が起点ですが、fs.readFileSync の相対パスは実行したフォルダーが起点です。ファイルの場所を起点にするなら、path.join(__dirname, "config.json")(ESM では new URL("./config.json", import.meta.url))で書きます。
Docker・CI で出るとき
| 状況 | 確認すること |
|---|---|
コンテナの中で Cannot find module 'express' |
Dockerfile で npm install(npm ci)を実行しているか |
| ボリュームでソースをマウントしている | ホストのフォルダーで、コンテナの node_modules が隠れていないか |
| CI でだけ失敗する | npm ci を実行しているか、大文字小文字の違い(CI は Linux が多い) |
devDependencies のパッケージ |
本番用に npm ci --omit=dev で入れると、devDependencies は入らない |
確認の手順(チェックリスト)
| 順番 | 確認すること | 方法 |
|---|---|---|
| 1 | 見つからないもの | '名前' はパッケージ、'./...' は自分のファイル、絶対パスは実行したファイル |
| 2 | どこで読み込んだか | Require stack の一番上 |
| 3 | パッケージが入っているか | npm ls 名前、無ければ npm install |
| 4 | パスと大文字小文字 | ./ はファイルの場所が起点。Linux は大文字小文字を区別 |
| 5 | ESM なら拡張子 | import ... from "./utils.js" |
| 6 | 実行の場所・ビルド | pwd、npm run build、dist のパス |
よくある質問
Q. node_modules を消して入れ直すと直りますか。
A. node_modules が壊れている(途中で止まったインストールなど)場合は直ります。rm -rf node_modules && npm install(lock ファイルどおりに入れるなら npm ci)です。ただし、パスや拡張子の間違いは直らないので、上の原因を先に確かめます。
Q. グローバルに入れたパッケージを require できません。
A. npm install -g で入れたものは、コマンドとして使うためのもので、通常は require の探す場所に入っていません(require.resolve.paths で確かめられます)。プロジェクトで使うものは、プロジェクトのフォルダーで npm install します。
まとめ
'名前'はパッケージ、'./...'は自分のファイル、絶対パスは実行したファイルが見つからない- Require stack の一番上が、その require を書いたファイル
- パッケージは
npm lsで確認しnpm install。探すのはファイルのフォルダーから上の node_modules - Linux は大文字小文字を区別する。手元で動いて CI で落ちる典型
- ESM の import は拡張子が必須。
Did you mean to import ...?に従う fsの相対パスは実行したフォルダーが起点(ENOENT)。__dirnameを使う
参考・出典
確認日はいずれも 2026年10月11日です。
- Node.js ドキュメント「Modules: ECMAScript modules」(Mandatory file extensions):https://nodejs.org/api/esm.html
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Node.js Cannot find moduleの原因と直し方」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。