nomodule是现代浏览器的“跳过指令”,非忽略属性;必须与type="module"成对使用,现代浏览器会完全不发起nomodule脚本请求,旧浏览器则执行它,safari 10.1除外——其既不识别type="module"也不识别nomodule,将后者当普通脚本执行。

nomodule 是现代浏览器的“跳过指令”,不是“忽略属性”
现代浏览器(Chrome 61+、Firefox 60+、Safari 11+、Edge 16+)**不忽略 nomodule 属性,而是主动识别并执行它的语义:跳过该 <script></script> 标签的加载与执行**。它不是被“忽略”的废属性,而是被严格遵循的加载过滤器。
关键点在于:这个行为只在浏览器已决定执行 type="module" 脚本的前提下触发——也就是说,nomodule 的生效前提是浏览器支持 ES 模块,并且页面中存在至少一个 <script type="module"></script> 标签。
- 如果只写
<script nomodule src="legacy.js"></script>,现代浏览器会把它当普通脚本处理(因为没type="module"),nomodule属性被静默丢弃,脚本照常加载 → 这是误用 - 如果写了
<script type="module" src="app.mjs"></script>+<script nomodule src="legacy.js"></script>,现代浏览器会下载并执行app.mjs,同时**完全不发起legacy.js的网络请求**(Network 面板里搜不到) -
nomodule不影响脚本 MIME 类型校验;若legacy.js返回非text/javascript,现代浏览器仍跳过,旧浏览器可能因 MIME 错误失败
为什么你在 Chrome 里看不到 legacy.js 的请求
这不是 bug,是规范强制行为:支持 type="module" 的浏览器在解析 HTML 时,一旦遇到带 nomodule 的 <script></script>,直接跳过整个标签的资源获取流程——不发请求、不解析内容、不注入 DOM、不报错。
验证方式很简单:
- 打开 Chrome DevTools → Network 面板 → 刷新页面 → 搜索
legacy.js→ 它不该出现在列表里 - 对比查看
app.mjs请求是否存在且状态为 200 - 如果
legacy.js出现在 Network 中,说明你漏写了type="module"脚本,或者写了但路径错误/404,导致浏览器 fallback 到普通脚本逻辑
Safari 10.1 是唯一“假装忽略 nomodule”的例外
Safari 10.1(2017 年发布)既不支持 type="module",也**完全不认识 nomodule 属性**——它把后者当成无意义的自定义属性,既不跳过,也不报错,而是把 <script nomodule src="legacy.js"></script> 当作普通 <script></script> 执行。
这导致它和 IE11 表现相反:IE11 静默丢弃整行标签(脚本不执行),Safari 10.1 却执行了 nomodule 脚本,但又不执行 type="module" 脚本(因不支持)。结果就是:降级脚本运行了,模块脚本没运行,看似“成功”,实则不可控。
- 它不会触发双执行(因为
type="module"标签被彻底忽略,没机会加载) - 但如果你内联了模块代码(
<script type="module">...</script>),Safari 10.1 可能尝试解析并报语法错误 - 截至 2026 年,Safari 10.1 已不在主流支持范围内;若必须兼容,需服务端 UA 判断或客户端探测后动态插入脚本
nomodule 脚本在旧浏览器里真能“跑起来”吗
不能假设“进了 IE11 就万事大吉”。nomodule 只管加载,不管执行——它把脚本塞进旧浏览器,但能否跑,全看脚本本身是否真的 ES5 兼容。
- 哪怕只有一行
const x = 1;,IE11 直接抛SyntaxError,整个脚本中断 - 调用
fetch()或Promise.all()?IE11 报ReferenceError: fetch is not defined - 用了
element.classList.add()?IE9 及以下直接静默失败,无提示 - 构建时必须显式配置
targets: { ie: "11" },不能靠 Babel 默认 preset;core-js/stablepolyfill 必须在所有业务代码前执行 - 输出格式只能是
IIFE或UMD,严禁含import/export、dynamic import(),否则旧浏览器解析阶段就崩
最常被忽略的是 polyfill 加载时机和 DOM API 兼容性——语法过了,API 挂了,照样白屏或功能缺失。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











