nomodule脚本在现代浏览器中完全不加载,仅旧浏览器执行;必须与type="module"成对使用才能分流,如,safari 10.1需额外检测防双执行。

nomodule脚本在现代浏览器里根本不会加载
现代浏览器(Chrome 61+、Firefox 60+、Safari 11+、Edge 16+)看到 nomodule 属性,会直接跳过对应 <script></script> 标签:不发网络请求、不解析、不执行、不计入内存占用。所谓“损耗”并不存在——它连字节都不会下载。
单独写 nomodule 脚本反而导致现代用户白屏
如果只写这一行:<script nomodule src="legacy.js"></script>,现代浏览器跳过它,旧浏览器又可能因缺少配套 type="module" 而完全不加载任何 JS。结果是:
- Chrome/Firefox/Safari 用户:零 JS 执行,页面逻辑失效
- IE11 用户:可能也不执行(IE11 会静默忽略整个带
nomodule的标签) - 没有 fallback,也没有 module,双端白屏
nomodule 和 type="module" 必须成对出现才构成有效分流
真正起作用的是组合行为,不是单个属性。典型写法必须是:
<script type="module" src="app.mjs"></script><script nomodule src="legacy-bundle.js"></script>
这时浏览器行为才明确分叉:
- 现代浏览器:加载并执行
app.mjs,完全跳过legacy-bundle.js - 旧浏览器:忽略第一行(不认识
type="module"),加载并执行第二行 - 两者互不干扰,无冗余请求,无执行冲突
Safari 10.1 是唯一会触发“损耗”的例外
Safari 10.1(macOS 10.12.4 / iOS 10.3)识别 type="module",但错误地也执行 nomodule 脚本。这会导致:
-
app.mjs和legacy-bundle.js同时加载并执行 - UI 初始化两次、事件重复绑定、API 请求翻倍
- 真实性能损耗:额外 JS 解析 + 执行 + 内存占用
缓解方式是运行时检测:if (!('noModule' in document.createElement('script'))) { document.write('<script src="legacy-bundle.js"></script>'); } —— 只让 Safari 10.1 这类“半吊子”浏览器走降级路径。
最容易被忽略的一点:nomodule 不控制语法兼容性。哪怕你成功让 IE11 加载了脚本,只要里面有一行 const x = 1 或 fetch(),它就立刻崩溃。加载不等于能跑。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











