Cannot find module 报错怎么解决?Node.js 模块找不到的 6 种原因与修复
现象:Cannot find module 'xxx'
Error: Cannot find module 'express'
Require stack:
- /app/server.js
或 ESM 形态:
Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'lodash' imported from /app/index.js
两句话诊断完毕:Node 找不到你要求加载的那个模块文件。可能文件不存在、路径不对、或者没安装。
六种原因,按概率排序
1. 没安装(新手最常见)
npm install express # 装了就好
判断方法:ls node_modules/express 是否存在。
2. 路径写错(相对路径忘了 ./)
require('utils'); // ❌ Node 去 node_modules 找 utils 包
require('./utils'); // ✅ 相对路径必须以 ./ 或 ../ 开头
区别一句话:不以 ./ ../ / 开头的路径一律去 node_modules 里找。
3. node_modules 损坏(安装中断/磁盘满)
rm -rf node_modules package-lock.json
npm install
删除重装能解决大部分诡异问题——node_modules 本质是临时产物,重装无损。
4. 大小写不匹配(macOS 能跑、Linux 炸)
macOS 文件系统默认大小写不敏感,require('./Utils') 能找到 utils.js;但 Linux(包括 Docker 容器和 CI 服务器)大小写敏感——本地能跑部署就炸的经典原因。
# 检查文件名实际大小写
ls -la src/utils/ | grep -i util
5. ESM 和 CommonJS 混用
package.json 里加了 "type": "module" 后,.js 文件全部按 ESM 解析:
| 写法 | CommonJS (.js) | ESM ("type":"module") |
|---|---|---|
| require('./x') | ✅ | ❌ ERR_MODULE_NOT_FOUND |
| import x from './x.js' | ❌ | ✅(必须带扩展名) |
ESM 的两个关键差异:import 路径必须含文件扩展名(./utils.js 而非 ./utils),且不能省略 .js 后缀。
6. monorepo / workspace 路径问题
在 monorepo 中引用兄弟包时,确认 package.json 的 workspaces 配置包含了该包,且包名与 name 字段一致。
为什么删了 node_modules 重装能解决 80% 的问题
node_modules 的完整性依赖 npm install 一次成功执行到底。安装中途断网、Ctrl+C、磁盘满都可能留下半安装状态——文件夹存在但 package.json(包内的,描述依赖关系)缺失。重装重建整个目录树,比精确修复省时。
预防
- CI 加
npm ci而非npm install——ci严格按 lock 文件安装,不一致直接报错而非静默修复; - TypeScript 项目加
skipLibCheck之前先跑一次类型检查——排除第三方类型报错的干扰; - monorepo 用 workspace 协议(
"deps": {"@repo/utils": "workspace:*"})代替相对路径。
排查清单
ls node_modules/<包名>— 目录存在?- 检查路径是否以
./开头(相对路径) rm -rf node_modules && npm install— 重装修复- 大小写核对(本地→部署炸 = 大概率这个)
"type": "module"检查 — require vs import 是否匹配
本文由 ToolVault 工具匣 提供。相关工具:Linux 命令速查。相关阅读:npm 换源指南、Node 17+ 报 digital envelope routines 错误排查、npm ERESOLVE 依赖冲突。访问 首页 查看更多开发者工具。
相关工具
相关文章
Permission denied (publickey) 怎么解决?Git 推送失败的 6 种原因与修复
git clone/push 报 Permission denied (publickey) fatal: Could not read from remote repository?覆盖公钥没生成、没加载进 agent、没添加到 GitHub/Gitee、多账号配错密钥、deploy key 权限、remote URL 写错六种根因,附 ssh -v 诊断方法。
npm ERR! ERESOLVE:peer dependency 冲突的四种解决策略
npm install 报 ERESOLVE unable to resolve dependency tree 怎么办?理解 peer dependency 的设计意图,掌握四种解决策略(版本修复 / legacy-peer-deps / overrides / dedupe)及其适用场景与风险。
error:0308010C digital envelope routines::unsupported 怎么解决?Node 17+ 跑老项目的三种修法
Node 17+ 启动 webpack 4 老项目报 error:0308010C:digital envelope routines::unsupported?根因是 OpenSSL 3.0 移除了 MD4 哈希。本文给出 --openssl-legacy-provider 临时方案、升级 webpack 5 根治方案和锁定 Node 16 的取舍。