nomodule属性本身不提供降级逻辑,仅被支持type="module"的浏览器识别并忽略,旧浏览器则因不识别而跳过;必须与type="module"成对使用才能实现现代与旧浏览器的分流加载和执行。

nomodule 属性本身不提供降级逻辑,它只在支持 type="module" 的浏览器中被识别并主动忽略——也就是说,加了它,现代浏览器根本不会下载、解析或执行对应脚本;旧浏览器(如 IE11、Android 4.4 WebView)则因不认识该属性而直接跳过它,照常加载执行。
在 Linux 上通过 Chrome 挂载/VNC 自动发布小红书长笔记。Agent 撰写标题和正文后执行 xhs_publish.sh --publish --submit,触发小红书发布。
nomodule 必须和 type="module" 成对出现才有意义
- 单独写
<script nomodule src="legacy.js"></script>是无效的:现代浏览器跳过,旧浏览器也未必执行(比如 IE11 完全忽略nomodule,但若没其他 fallback,就真的一行 JS 都不跑) - 正确写法必须是两行并存:
<script type="module" src="app.mjs"></script><script nomodule src="legacy-bundle.js"></script>
- 浏览器行为分叉点只在是否识别
type="module":识别 → 执行第一行,跳过第二行;不识别 → 第一行静默丢弃,第二行当作普通text/javascript加载执行
旧浏览器加载 nomodule 脚本时会同步阻塞 HTML 解析
-
nomodule脚本在旧浏览器里等效于<script src="..."></script>,没有async或defer行为 - 这意味着如果
legacy-bundle.js体积大、执行慢,IE11 会卡住整个页面渲染 - 实操建议:
- 把
legacy-bundle.js压缩到最小,剔除未用代码(tree-shaking 对旧格式效果有限,需靠 UglifyJS 或 SWC 配合 preset-env) - 关键初始化逻辑可内联进 HTML,避免额外请求
- 不要指望
nomodule脚本里还能用async:IE11 不支持该属性,写了也无效
- 把
nomodule 不解决语法兼容性问题
- 即使你用
nomodule成功让旧浏览器加载了脚本,如果里面写了const、fetch()、Promise或箭头函数,照样报错崩溃 -
nomodule只管“要不要加载”,不管“能不能运行” - 所以
legacy-bundle.js必须是真正兼容目标旧环境的产物:- 目标 IE11?得用
@babel/preset-env显式配置targets: { ie: "11" } - 不能依赖构建工具默认配置,Babel 默认不降级 Promise、fetch 等全局 API,得配
core-js或手动 polyfill - 检查最终 bundle 是否含
class、let、=>、for...of等,可用acornCLI 快速扫描
- 目标 IE11?得用
真正容易被忽略的一点是:nomodule 的“兼容”只发生在加载阶段,而旧浏览器的执行环境依然脆弱——它不报错不等于能跑通,得实测到具体函数调用那一行。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










