module + nomodule 是标准渐进式加载方案:现代浏览器执行 type="module" 脚本(支持 ES Modules),跳过 nomodule;旧浏览器忽略 type="module",执行 nomodule 脚本(需为 ES5+ IIFE/UMD 格式并含 polyfill)。

现代浏览器原生支持 <script type="module">,但 IE、安卓 WebView(Chrome < 80)、旧版 Safari 等完全不识别 type="module",直接忽略;而它们遇到 import/export 语法会直接报错崩溃。所以不能只写 ES Modules,必须配合兼容策略。
用 module + nomodule 实现渐进式加载
这是最轻量、标准且无需构建工具就能生效的方式:
- 浏览器若支持
type="module",就加载并执行modern.js(含import/export) - 同时自动跳过带
nomodule的脚本 - 不支持的旧浏览器则完全忽略
type="module",转而加载nomodule脚本
<script type="module" src="modern.js"></script> <script nomodule src="legacy.js"></script>
modern.js 可以是未转译的 ES2020+ 代码;legacy.js 必须是已打包、降级(如转为 ES5)、并注入必要 polyfill(如 Promise、fetch、Array.from)的单文件。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
通过构建工具输出双版本
Vite、Webpack、Rollup 等都能配置生成两套产物:
-
modern.js:target 设为es2018或更高,保留模块语法,不加 polyfill -
legacy.js:target 设为es2015或chrome53,启用@vitejs/plugin-legacy或babel-preset-env,自动注入core-jspolyfill 并打成 IIFE/UMD 格式
例如 Vite 中启用 legacy 插件后,会自动生成 legacy/xxx.legacy.js 并在 HTML 中插入对应 <script nomodule> 标签。
对 CSS 和 API 做配套兼容
ES Modules 兼容只是前端一环,还需同步处理:
- CSS 使用 Autoprefixer 或 esbuild 的
css.target,按目标浏览器加前缀(如-webkit-flex) - JavaScript 运行时 API 缺失需靠 polyfill:
core-js/stable覆盖语言特性,whatwg-fetch补fetch,abortcontroller-polyfill补AbortController - 避免在
modern.js中调用仅存在于legacy.js的全局变量,保持两个入口逻辑隔离
注意构建目标与真实环境匹配
比如安卓 6.0 内置 WebView 基于 Chrome 43,应设 target: ['chrome43', 'ios10'];IE11 则必须包含 'ie 11',并禁用所有 CSS 变量、flex 新属性等。盲目设 es2015 不等于能跑通——语法降级了,API 和 CSS 仍可能失败。

















