javascript es modules 路径必须严格遵循解析规则:相对路径须带 ./ 或 ../ 前缀,node.js 要求显式扩展名,浏览器支持以 / 开头的根相对路径,包名路径需 importmap 映射或构建工具处理。

在 JavaScript ES Modules 中,路径写法不是“习惯问题”,而是解析规则强制要求的。浏览器和 Node.js 对路径的处理逻辑不同,写错就会报错,比如 import 失败或 ERR_MODULE_RESOLUTION_EXCEPTION。
相对路径必须带 ./ 或 ../ 前缀
这是最常出错的一点:不能省略点号。
-
import { foo } from 'utils.js'❌ 浏览器直接报错——它会被当作包名路径(bare specifier),而原生不支持 -
import { foo } from './utils.js'✅ 正确,明确表示“同目录下的文件” -
import { bar } from '../config/index.mjs'✅ 向上一级再进 config 文件夹 - Node.js ESM 同样要求扩展名,
./utils会失败,必须写./utils.js或./utils.mjs
绝对路径只在浏览器中有效,且以 / 开头
这个“绝对”是相对于网站根目录(origin + path root),不是文件系统根目录。
-
import { main } from '/src/lib/main.js'✅ 在https://example.com/app/页面中,实际请求的是https://example.com/src/lib/main.js - 这种写法在 Node.js 中完全不支持,会触发模块解析异常
- 注意:HTML 中的
<script type="module" src="/app.js"></script>也遵循同样规则
别把包名路径当成绝对路径
import _ from 'lodash' 这类写法在浏览器里原生不可用。
- 它属于 Node.js 特有的包名解析机制,依赖
node_modules和模块解析算法 - 浏览器中若想使用,必须配合
<script type="importmap"></script>显式映射,例如:
<script type="importmap"><br> { "imports": { "lodash": "https://cdn.skypack.dev/lodash@4.17.21" } }<br> </script> - 但 importmap 在 Safari 和部分旧版 Chrome 中支持有限,生产环境建议搭配构建工具(如 Vite、Rollup)处理
Node.js 中没有“站点根目录”概念
Node 的 ESM 解析只认三类路径:
- 相对路径(
./、../)——基于当前文件位置 - 包名路径(无前缀)——向上查找
node_modules - 数据 URL 或完整 HTTP URL(如
import mod from 'https://esm.sh/react') -
/src/index.js这种写法在 Node 里非法,不会按文件系统根去读,而是直接报错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











