使用ES Modules与jsconfig.json配置路径时触发Error [ERR_MODULE_NOT_FOUND]问题求助
你遇到的核心问题是:jsconfig.json的paths配置仅服务于VS Code的IntelliSense智能提示,Node.js的ES模块加载器根本不会读取这个文件,所以运行时必然会出现模块找不到的错误。你之前尝试的Subpath Imports是Node原生支持的方案,但需要和jsconfig.json配合才能同时满足运行和智能提示的需求。
下面是具体的解决步骤:
1. 配置package.json中的Subpath Imports
在package.json中添加imports字段,让Node.js能够解析别名对应的实际文件路径:
{ "type": "module", "imports": { "@controllers/*": "./node/controllers/*.js" }, // 保留你原有的其他配置 }
这里的映射是字符串替换逻辑:当你导入@controllers/foo时,Node会自动替换为./node/controllers/foo.js,完美适配ES模块必须指定文件后缀的要求。
2. 调整jsconfig.json匹配Subpath规则
修改jsconfig.json的配置,让VS Code的智能提示能正确关联到实际文件,和Subpath Imports规则保持一致:
{ "compilerOptions": { "target": "es6", "module": "ESNext", // 改为ESNext更好适配ES模块语法 "baseUrl": "./", "paths": { "@controllers/*": ["node/controllers/*"] } }, "exclude": ["node_modules"] }
把module字段改为ESNext,是为了让VS Code的提示逻辑和Node的ES模块解析逻辑对齐,避免出现提示偏差。
3. 编写正确的导入语句
现在你可以在server.js中这样导入模块,既满足Node运行时解析,又能获得完整的VS Code智能提示:
import { foo } from '@controllers/foo'
补充:为什么之前的Subpath Imports导致智能提示失效?
大概率是你当时没有在jsconfig.json中配置对应的paths规则,VS Code无法识别别名对应的实际文件路径。现在通过同步Subpath和jsconfig的映射规则,就能同时解决运行报错和智能提示失效两个问题。
如果需要更复杂的别名规则(比如跨多级目录的批量映射),也可以使用第三方加载器(如esm-loader-alias),但需要额外安装依赖并在启动Node时指定加载器,不如原生Subpath方案简洁。
内容的提问来源于stack exchange,提问作者Álvaro

