Firefox 60 是首个原生支持 type="module" 的稳定版,但仅支持基础 ESM(import/export、nomodule),不支持顶层 await(FF89+)、动态 import()(FF67+)、裸导入,且 file:// 协议下因 CORS 和 MIME 校验完全禁用模块加载。

不是完全不支持,但 Firefox 60 是首个原生支持 type="module" 的稳定版 —— 此前版本(如 59 及更早)根本无法解析 import/export 语法,即使加了 type="module" 也会直接报错或静默失败。
Firefox 59 及更早:连 type="module" 都不认识
这些版本把 <script type="module"> 当作未知类型的 script,按规范会忽略执行(也不会报错),但更关键的是:import 和 export 语句本身是语法错误 —— 解析器遇到就抛 SyntaxError: import declarations may only appear at top level 或类似错误。你没法绕过,因为语法层就不认。
- 不支持
type="module"属性,也不支持模块语法 -
nomodule在 Firefox 60 之前也无效(该属性直到 Firefox 60 才随模块支持一并加入) - 即使通过构建工具(如 Rollup、Webpack)打包成 IIFE,只要源码含
export,在开发时用原生模块调试就走不通
Firefox 60:支持 type="module",但有硬性限制
这是分水岭版本,但要注意它只实现了 ESM 的基础能力,很多现代特性还没跟上:
- 支持
import/export、type="module"、nomodule回退机制 - 不支持顶层
await(直到 Firefox 89) - 不支持动态
import()(直到 Firefox 67) - 仍不支持裸导入(
import {foo} from 'lodash'),必须写完整路径(./lodash.js或绝对 URL) - 对
.mjs后缀无强制要求,但服务器需返回Content-Type: application/javascript,否则会因 MIME 类型不匹配而拒绝加载
file:// 协议下 Firefox 60 仍不可用
即使版本达标,本地双击 HTML 文件打开(file:// 协议)时,Firefox 60 会因 CORS 策略和 MIME 类型校验失败而拒绝加载模块脚本 —— 报错类似:TypeError: Module specifier is not valid 或 NetworkError when attempting to fetch resource。
- 必须用本地服务器(如
npx serve、python3 -m http.server)启动页面 - Firefox 对 file:// 下的模块限制比 Chrome 更严格,且不提供降级提示
- 这个限制至今(2026 年)仍未解除,所有现代 Firefox 版本在 file:// 下都禁用模块加载
真正麻烦的不是“哪个版本开始支持”,而是「支持到什么程度」和「在什么上下文里能跑通」—— 比如你确认用户用的是 Firefox 65,却忘了动态 import() 还没实现,或者在测试时直接双击 HTML,就会卡在第一步。这些细节不验证就上线,很容易在真实环境里突然白屏。

















