一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

在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"

热门栏目