VSCode中“找不到模块”多因路径、解析模式或缓存问题,需确认项目根目录含package.json和node_modules、检查"type": "module"字段、区分CommonJS/ESM规则、重启VSCode并配置jsconfig.json/tsconfig.json。

能直接在 VSCode 终端执行 node app.js 并正确加载 require('express') 或 import { createServer } from 'http',说明依赖已就位;90% 的“找不到模块”错误,其实不是包没装,而是路径、解析模式或 VSCode 缓存没对齐。
确认 node_modules 真正在当前项目根目录下
VSCode 的 JS/TS 语言服务和 Node.js 运行时都从当前打开的文件夹(即工作区根)开始查找 node_modules。如果只是打开了某个子文件(比如 src/index.js),但没打开整个含 package.json 的文件夹,require 就会失败。
- 检查左侧资源管理器顶部路径——必须显示为项目根目录(含
package.json和node_modules文件夹) - 运行
npm list express(把express换成你要用的包名),若输出empty或报ENOENT,说明该包没装进当前项目 - Windows 用户特别注意:路径含中文或空格(如
D:\我的项目\)会导致node_modules内部符号链接损坏,建议先挪到C:\dev\myapp这类纯英文无空格路径再重装
区分 CommonJS 和 ES Module 加载规则
Node.js 对 require() 和 import 的解析逻辑完全不同,VSCode 会提前预警,但根本问题出在运行时配置上。
- 检查
package.json是否有"type": "module"字段:有则所有.js文件按 ES Module 解析,此时require()会直接报错,且import必须带扩展名(如import { foo } from './utils.js') - 没有
"type": "module"时,import语句会触发SyntaxError: Cannot use import statement outside a module,这不是 VSCode 的错,是 Node.js 拒绝执行 - 临时绕过:把文件后缀改成
.mjs,Node.js 遇到该后缀自动启用 ES Module 模式,无需改package.json
终端里 node app.js 报错但 npm start 能跑?查 package.json 的 type 和 scripts
npm start 实际执行的是 package.json 中 "scripts": { "start": "node index.js" } 这类命令,它可能隐式加了参数(比如 --experimental-specifier-resolution=node),而你手动敲的 node app.js 没带。
- 如果项目是 ES Module,手动运行请显式加参数:
node --experimental-specifier-resolution=node app.js - Windows 下还可能因编码问题报乱码,加
-r utf-8:node -r utf-8 app.js - 别依赖
code-runner插件一键运行——它默认不传这些参数,也不读package.json的type字段,容易在交互式脚本(如用readline)中卡死
装完依赖 VSCode 里仍标红?重启比刷新更有效
VSCode 的 TypeScript 语言服务缓存模块路径和类型定义,它不会在你 npm install 后自动重载。标红不是代码错,是编辑器还没“看到”新装的包。
- 关掉所有 VSCode 窗口(macOS 在 Dock 右键选「退出」,Windows 在任务管理器确认
Code.exe已结束),再双击图标重启 - 确保项目根目录下有
jsconfig.json(JS 项目)或tsconfig.json(TS 项目);最简配置可只写{ "compilerOptions": { "moduleResolution": "node" } } - 如果是 TypeScript 项目且用了
@types/xxx,记得一起装:npm install -D @types/express,否则方法签名和自动补全不会出现
最容易被忽略的是:VSCode 不解析 node_modules 内容,它只按 Node.js 的模块解析规则做静态推导。哪怕你 npm install 成功、终端也能跑通,只要 package.json 的 type 字段和文件后缀/导入语法不匹配,或者编辑器没重载缓存,标红和报错就会持续存在。


















