最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
在Safari 10.1中nomodule是否被正确忽略
时间:2026-06-28 09:42:03 编辑:袖梨 来源:一聚教程网
Safari 10.1 完全不支持 nomodule 属性,将其视为无意义自定义属性,既不识别也不据此跳过脚本;type="module" 标签被直接忽略,而 nomodule 脚本按普通 script 执行,导致降级行为不可控,需服务端 UA 判断或探测脚本兜底。
nomodule 在 Safari 10.1 中不被忽略
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 会同时加载两个脚本
根本原因在于 Safari 10.1 对 HTML 解析器的实现:它把 nomodule 当作一个无意义的自定义属性,不参与脚本加载逻辑判断;而对 type="module" 则直接忽略整个标签(不加载、不报错、不 fallback)。所以实际行为是:
-
<script type="module">:被 Safari 10.1 忽略(不加载也不执行) -
<script nomodule>:被当作普通<script>执行(因为没type,默认为text/javascript) - 结果:只有
nomodule脚本运行,看似“降级成功”——但这是巧合,不是规范行为
兼容 Safari 10.1 的真实做法
不能依赖 nomodule 做降级开关。必须用显式特性检测 + 动态插入来兜底:
- 用
document.createElement('script').supports不行(Safari 10.1 不支持) - 改用
Function.toString检测模块语法支持?太重且不可靠 - 最稳妥的是:**服务端 UA 判断**,对
Safari/603.1(即 Safari 10.1)响应不含type="module"的页面 - 或客户端用
try/catch加载一个极小的模块探测脚本,再决定是否插入fallback.js - 注意:Safari 10.1 支持
async但不支持defer对模块的影响,别混用
现在还要不要管 Safari 10.1
截至 2026 年,Safari 10.1 已彻底退出主流支持周期(macOS Sierra 10.12 停更多年),但若你仍需支持企业内网中未升级的旧 macOS 设备,就不能只靠 nomodule——它在 Safari 10.1 下不是“被忽略”,而是“被无视”,行为不可控。真正的兼容性边界在 Safari 11(2017 年 9 月发布),它修复了 nomodule 支持,也正式启用 type="module"。