浏览器esm要求import相对路径必须带.js后缀,因其实现不支持自动扩展名解析:写./utils会请求无后缀路径致404,而./utils.js才能准确命中文件;所有./、../、/开头路径均需含完整扩展名,裸说明符(如'lodash')或缺后缀写法均无效。

浏览器中 ES Module 的 import 语句要求相对路径必须带 .js 后缀,这不是规范强制规定,而是当前所有主流浏览器(Chrome 61+、Firefox 60+、Safari 11.1+)的实际实现限制——它们不支持 Node.js 那样的自动扩展名解析(如尝试 ./utils → ./utils.js → ./utils.json)。
为什么必须写 .js?
浏览器模块加载器只做字面路径匹配,不执行文件系统探测。当你写 import { foo } from './utils',浏览器会真实发起对 /path/to/utils 的请求(无后缀),服务器大概率返回 404;而写 ./utils.js 才能准确命中文件。
- 即使文件实际是
utils.mjs或utils.cjs,浏览器也只认你写的路径字面量,不会自动推断 -
.ts、.jsx等源码文件更不能直接 import——它们不是可执行的 JS,必须先编译 - 这个行为与打包工具(如 Vite、Webpack)无关:它们在开发时会模拟解析逻辑,但最终输出到浏览器的代码仍需符合原生规则
如何正确书写相对路径
所有以 ./、../ 或 / 开头的路径都必须包含完整扩展名。常见写法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
import { helper } from './lib/helper.js'(同级目录下的 JS 文件) -
import api from '../services/api.js'(上一级目录) -
import config from '/src/config.js'(网站根路径,注意开头的/) -
import { default as mod } from 'https://cdn.example.com/mod.js'(完整 URL,也需后缀)
哪些路径写法是无效的
以下写法在浏览器中会直接报错(Failed to resolve module specifier 或 404):
-
import { x } from 'lodash'(裸模块说明符,浏览器不认识) -
import { y } from './utils'(缺.js,404) -
import { z } from 'utils.js'(没加./,被当作裸模块) -
import data from './data.json'(JSON 不是合法 ES 模块,除非服务器配置 MIME 类型并启用导入 JSON 实验性功能,且仍需后缀)
开发时怎么避免手误
借助工具链提前暴露问题:
- 用 VS Code + ESLint 插件(如
eslint-plugin-import),开启extensions规则,自动提示缺失后缀 - 在 Vite 或 Webpack 项目中,启用
resolve.extensions只影响构建时解析,**不改变浏览器运行时行为**;上线前务必检查生成产物中的 import 语句是否已补全后缀 - 本地起一个静态服务(如
npx serve或python -m http.server),直接访问 HTML —— 这比双击打开 file:// 更接近真实环境,能及时发现路径 404
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










