动态导入(import())是es2020引入的异步模块加载语法,返回promise,不可polyfill,需构建转译(如webpack原生支持)与运行时降级(如script注入)双层兼容方案。

动态导入(import())是 ES2020 引入的异步模块加载语法,返回 Promise,但 IE 和 Safari 10.1 以下、Android Browser 等旧环境完全不支持——它既不是语法糖,也不能靠 polyfill 模拟行为。处理兼容性必须分两层:构建时转译 + 运行时降级回退。
构建阶段:Babel 转译为 require.ensure 或 System.import
仅靠 @babel/preset-env 默认不处理 import(),需显式启用插件:
- 安装
@babel/plugin-dynamic-import-node(服务端或简单场景)或@babel/plugin-syntax-dynamic-import+ 自定义打包逻辑 - Webpack 用户无需额外配置:v2+ 原生支持
import(),会自动拆包并生成兼容的__webpack_require__.e加载逻辑 - Rollup 或 esbuild 需配合插件(如
rollup-plugin-dynamic-import-vars)或禁用该语法,改用静态import+ 条件编译
运行时:检测 + 显式回退到传统加载方案
不能依赖 'import' in window(语法级特性无法运行时检测),必须在构建前就决定是否启用。稳妥做法是:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 对目标含 IE11 的项目,统一禁用
import(),改用require(['module'], callback)(RequireJS)或自封装 script 标签注入 - 若保留部分动态导入,需提前判断环境:通过
browserslist输出生成运行时标识,例如 Webpack DefinePlugin 注入process.env.USE_DYNAMIC_IMPORT = true - 在代码中包裹逻辑:
if (process.env.USE_DYNAMIC_IMPORT) { import('./mod').then(...); } else { loadScript('/js/mod.js').then(() => initMod()); }
替代方案:轻量脚本加载器兜底
当构建工具不支持或需极致兼容(如 IE9),可用几行代码实现简易模块加载:
- 创建
loadModule(src):动态创建script标签,监听onload,触发回调 - 约定模块导出挂载到全局对象(如
window.MyModule),避免污染但可控 - 配合预加载提示或骨架屏,掩盖加载延迟,体验更平滑
注意 async/await 与 Promise 的连带影响
import() 返回 Promise,若目标浏览器不支持 Promise(如 IE11),即使转译了语法,仍会运行时报错。因此必须:
- 确保已注入 Promise polyfill(如
core-js/stable/promise) - 使用
useBuiltIns: "usage"让 Babel 自动注入,而非全局引入整个 core-js - 验证最终 bundle 是否包含
Promise补丁,尤其检查第三方库是否隐式依赖
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










