Safari 10.1 完全不支持 nomodule 属性,将其视为无意义自定义属性,既不识别也不据此跳过脚本;type="module" 标签被直接忽略,而 nomodule 脚本按普通 script 执行,导致降级行为不可控,需服务端 UA 判断或探测脚本兜底。
Safari 10.1(2017 年发布)**完全不支持 nomodule 属性**,它既不会识别该属性,也不会据此跳过对应 <script> 标签。这意味着:现代写法如 <script type="module" src="app.mjs"></script><script nomodule src="fallback.js"></script> 在 Safari 10.1 下会同时加载并执行两个脚本——app.mjs 因不支持 type="module" 被静默丢弃,而 fallback.js 却会被执行;但问题在于,Safari 10.1 同时也会尝试解析 app.mjs 的内容(如果它是内联的),或在某些配置下触发 MIME 类型错误。
根本原因在于 Safari 10.1 对 HTML 解析器的实现:它把 nomodule 当作一个无意义的自定义属性,不参与脚本加载逻辑判断;而对 type="module" 则直接忽略整个标签(不加载、不报错、不 fallback)。所以实际行为是:
<script type="module">:被 Safari 10.1 忽略(不加载也不执行)<script nomodule>:被当作普通 <script> 执行(因为没 type,默认为 text/javascript)nomodule 脚本运行,看似“降级成功”——但这是巧合,不是规范行为不能依赖 nomodule 做降级开关。必须用显式特性检测 + 动态插入来兜底:
document.createElement('script').supports 不行(Safari 10.1 不支持)Function.toString 检测模块语法支持?太重且不可靠Safari/603.1(即 Safari 10.1)响应不含 type="module" 的页面try/catch 加载一个极小的模块探测脚本,再决定是否插入 fallback.js
async 但不支持 defer 对模块的影响,别混用截至 2026 年,Safari 10.1 已彻底退出主流支持周期(macOS Sierra 10.12 停更多年),但若你仍需支持企业内网中未升级的旧 macOS 设备,就不能只靠 nomodule——它在 Safari 10.1 下不是“被忽略”,而是“被无视”,行为不可控。真正的兼容性边界在 Safari 11(2017 年 9 月发布),它修复了 nomodule 支持,也正式启用 type="module"。