ES Modules 中第三方包导入路径须严格区分环境:浏览器需 importmap 或完整 URL,Node.js 支持裸路径但依赖包的 ESM 兼容性,生产环境推荐构建工具处理别名与路径解析。

第三方包的导入路径写法在 ES Modules 中必须严格区分环境,不能照搬 CommonJS 写法,否则会直接报错(如 Cannot find module 或 Module not found)。核心原则是:浏览器不认裸说明符,Node.js 认但有前提;所有路径必须明确、可解析。
浏览器中必须用 importmap 或完整 URL
原生浏览器 <script type="module"> 不支持 import _ from 'lodash' 这类裸路径。直接写会报错:
-
import { debounce } from 'lodash-es'❌ 浏览器原生不识别 -
import { debounce } from './node_modules/lodash-es/index.js'✅ 可行但不推荐(路径太硬) -
import { debounce } from 'lodash-es'✅ 配合<script type="importmap">映射后可用
示例 importmap:
<script type="importmap">
{
"imports": {
"lodash-es": "./node_modules/lodash-es/index.js",
"date-fns": "./node_modules/date-fns/index.js"
}
}</script>
注意:Safari 支持较晚,生产环境建议用构建工具替代。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
立即学习“Java免费学习笔记(深入)”;
Node.js 中裸路径可直接用,但需确认包是否导出 ESM
Node.js 的 ESM 解析器会自动从 node_modules 查找包,并读取其 package.json 中的 exports、main、module 字段来定位入口。但关键看包本身是否提供 ESM 兼容导出:
-
import axios from 'axios'✅ 支持默认导出(ESM 入口已配置) -
import { upperCase } from 'lodash'❌ 报错:lodash 是 CommonJS 包,只提供 default 导出 -
import { upperCase } from 'lodash-es'✅ 专为 ESM 设计,全部函数命名导出 -
import fs from 'fs'✅ Node 内置模块已支持 ESM 命名与默认混合导出
优先选 ESM 友好包,避免混用 CJS 版本
很多工具包提供双版本,务必查文档确认推荐写法:
-
推荐:
date-fns、lodash-es、zod、valibot—— 天然支持命名导出,可按需导入 -
谨慎:
lodash、moment、uuid(v3/v4)—— 默认是 CommonJS,ESM 导入只能走 default,无法解构 -
验证方法:查看包的
package.json是否含"type": "module"或"exports"字段指向.js文件且无"require"分支
路径别名和构建工具才是生产级解法
纯 ESM 环境下,@/utils 这类 TypeScript paths 别名只是编译时提示,运行时无效。真正生效需依赖构建工具:
- Vite / Webpack:自动解析
resolve.alias和node_modules,支持裸路径 + 别名 - ts-node + tsconfig-paths:仅限开发,需额外插件,不适用于浏览器或纯 Node 生产部署
- 纯 Node(无构建):坚持用
import { fn } from 'pkg-name'或import fn from 'pkg-name/subpath.js',确保路径真实存在

















