动态导入(import())是实现JavaScript代码分割的标准方式,它在运行时按需加载模块,由构建工具自动拆分为独立chunk,适用于路由、组件、工具函数等延迟加载场景,并需配合错误处理与性能权衡。
Java
Script 代码分割(Code Splitting)的核心目标是按需加载,避免一次性加载大量无用代码。动态导入(import())是实现它的标准、轻量且原生支持的方式,能显著减少首屏体积、提升加载速度和用户体验。
与静态 import 不同,import() 是一个返回 Promise 的函数,接收模块路径字符串,支持变量和表达式。Webpack、Vite 等构建工具会自动将其识别为分割点,生成独立的 chunk 文件。
import:在编译时确定依赖,全部打包进主 bundleimport():运行时才决定加载哪个模块,工具自动抽离为单独文件(如 chunk-abc123.js)import(`./locales/${lang}.js`),适合多语言场景不是所有地方都适合加 import(),关键看是否满足“延迟加载”和“条件触发”两个特征。
lazy + Suspense 或 defineAsyncComponent,只加载当前页面模块import('xlsx'),避免初始包被大型依赖拖累动态导入本质是异步操作,应主动处理 loading 和 error 状态,避免白屏或报错中断流程。
try/catch 捕获加载失败(如网络中断、模块不存在)import.meta.webpackHot(仅开发)做 HMR 适配;生产环境无需额外配置/* webpackChunkName: "editor" */)自定义 chunk 名称,便于调试和缓存管理过度拆分可能引发“请求风暴”,尤其在低网速下多个小 chunk 并发加载反而更慢。
import(/* webpackPreload: true */ './utils') 预加载,兼顾速度与体验webpack-bundle-analyzer)查看实际 chunk 分布,验证拆分效果