nomodule脚本在现代浏览器中完全不加载;chrome 61+、firefox 60+、safari 11+、edge 16+会直接跳过带该属性的script标签,不发请求、不解析、不执行;必须与type="module"成对使用才能实现有效分流,单独使用将导致新旧浏览器均白屏。

nomodule 脚本在现代浏览器里根本不会加载
现代浏览器(Chrome 61+、Firefox 60+、Safari 11+、Edge 16+)看到 nomodule 属性,会直接跳过对应 <script></script> 标签:不发网络请求、不解析、不执行、不计入内存占用。所谓“损耗”并不存在——它连字节都不会下载。
常见错误现象:
- 你在 Chrome DevTools 的 Network 面板里搜
legacy-bundle.js,它压根不出现 - 页面逻辑失效,但控制台无报错,也看不到 JS 执行痕迹
单独写 <script nomodule src="legacy.js"></script> 会导致双端白屏
这不是“损耗”,而是彻底失效:现代浏览器跳过,旧浏览器(如 IE11)又可能因缺少配套 type="module" 而完全不加载任何 JS。
真实表现:
- Chrome/Firefox/Safari 用户:零 JS 执行,页面交互全挂
- IE11 用户:静默忽略整行标签(既不报错,也不执行),同样白屏
- Android 4.4 WebView 等环境行为不一致,无法依赖
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实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











