
Node.js 启用 ES 模块("type": "module")后,所有本地文件导入必须显式指定扩展名(如 .js),否则会因路径解析失败而报 ERR_MODULE_NOT_FOUND。这是与 CommonJS 的关键差异,也是本问题的根本原因。
node.js 启用 es 模块(`"type": "module"`)后,**所有本地文件导入必须显式指定扩展名(如 `.js`)**,否则会因路径解析失败而报 `err_module_not_found`。这是与 commonjs 的关键差异,也是本问题的根本原因。
在 ES 模块环境下,Node.js 不再自动补全 .js 扩展名——即使文件同目录、命名规范、package.json 已声明 "type": "module",也必须在 import 语句中写出完整文件名(含 .js 后缀)。你遇到的错误提示 Did you mean to import ./config.js? 实际上已是 Node.js 的明确指引,而非模糊建议。
✅ 正确写法(两种导出方式均需加 .js):
// server.js
import express from 'express';
import sqlite3 from 'sqlite3';
import fetch from 'node-fetch';
import config from './config.js'; // ← 关键:必须写 .js
// 或(若 config.js 使用命名导出)
// import { config } from './config.js';
// config.js —— 默认导出(推荐,简洁)
const config = {
url: "my url string here",
port: 5000,
callbackURL: "another url here"
};
export default config;
⚠️ 常见误区与注意事项:
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- ❌ import config from './config' → 报错(缺少扩展名)
- ❌ import config from 'config' → 被解析为第三方包,非本地文件
- ❌ import config from 'config.js' → 缺少 ./ 或 ../,会被当作包名查找
- ✅ 路径必须以 ./ 或 ../ 开头,明确表示相对导入
- ✅ .js 后缀不可省略(.mjs 同理;.cjs 不适用于 ES 模块环境)
? 补充说明:
- 此规则适用于所有本地 .js 文件(如 settings.js、utils.js),不因文件名是否为 config 而特殊;config 并非保留字,问题纯属路径解析机制导致。
- 若使用 TypeScript,.ts 文件需经编译为 .js 后运行,且 import 语句仍须指向生成的 .js(或通过 ts-node + --esm 支持,但底层逻辑不变)。
- 确保文件编码为 UTF-8,且无隐藏字符(如 BOM),避免极少数情况下解析异常。
总结:ES 模块的导入是严格基于 URL 规范的,./config.js 是一个有效的模块说明符(module specifier),而 ./config 不是——哪怕文件真实存在。养成显式书写扩展名的习惯,是编写健壮 Node.js ES 模块代码的第一步。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










