nomodule是现代浏览器的“跳过指令”,非fallback开关;必须与type="module"成对使用,现代浏览器跳过nomodule脚本,旧浏览器因不识别而执行它。

nomodule 不是 fallback 开关,而是现代浏览器的“跳过指令”
加了 nomodule 的 <script></script> 标签,现代浏览器(Chrome 61+、Firefox 60+、Safari 11+、Edge 16+)根本不会下载它;旧浏览器(如 IE11、Android 4.4 WebView)不认识这个属性,会照常加载并执行——所以它不是“给旧浏览器用的”,而是“让旧浏览器不得不执行它”。单独写 <script nomodule src="legacy.js"></script> 是危险操作:现代用户白屏,旧用户可能也因缺少配套脚本而失效。
必须和 type="module" 成对出现,且顺序无关但建议前置 module
双路径分流只靠浏览器是否识别 type="module" 这一判断点。正确结构只有这一种有效组合:
<script type="module" src="app.mjs"></script><script nomodule src="legacy-bundle.js"></script>
现代浏览器:识别 type="module" → 执行第一行,跳过第二行;旧浏览器:不识别 type="module" → 忽略第一行,把第二行当普通 <script src></script> 执行。注意:nomodule 对 <script type="module"></script> 加在同一个标签上毫无意义,比如 <script type="module" nomodule src="app.js"></script> —— 现代浏览器看到 type="module" 就执行,nomodule 被忽略;旧浏览器不认识 type="module",又忽略 nomodule,结果谁都不加载。
legacy-bundle.js 必须是真正兼容的 ES5 + API 补丁产物
nomodule 只控制加载,不负责语法或 API 兼容。哪怕脚本成功加载,只要里面出现 const、fetch()、Promise、classList 或箭头函数,IE11 就直接报 SyntaxError 或 ReferenceError。构建时需明确指定目标环境:
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
- 用 Babel 配置
targets: { ie: "11" },不能依赖默认 preset - 手动引入
core-js/stable和regenerator-runtime/runtime,确保 Promise、Array.from 等可用 - 避免动态
import(),它在旧构建链中容易残留为未转译语法 - 检查最终 bundle 是否含
class、let、=>、for...of等,可用es-check es5 legacy-bundle.js验证
Safari 10.1 是唯一已知会同时执行两者的例外
Safari 10.1(macOS 10.12.4 / iOS 10.3)存在 bug:它识别 type="module",却错误地也执行带 nomodule 的脚本,导致重复初始化、事件绑定冲突或 DOM 操作错乱。缓解方案是运行时检测 noModule 属性是否存在:
<script nomodule>
if (!('noModule' in document.createElement('script'))) {
document.write('<script src="legacy-bundle.js"></script>');
}
这段代码只在 Safari 10.1 这类“半吊子”浏览器中触发 document.write,其他旧浏览器(IE11 等)仍走原生 nomodule 路径。注意:该方案要求 legacy-bundle.js 必须是纯内联可执行逻辑,不能依赖外部资源或异步加载——因为 document.write 会阻塞并重写文档流。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










