import()是esmodule的动态导入函数,运行时按需加载模块并返回promise,支持变量路径、条件加载与代码分割,适用于路由懒加载、权限控制等场景,区别于静态import的编译时解析与字符串字面量限制。

ESModule 的 import() 是一个函数式语法,用于在运行时动态导入模块,返回 Promise,支持按需加载、条件加载和代码分割。
动态导入的基本用法
import() 不是声明语句,而是表达式,必须在函数作用域中调用(不能在顶层模块作用域直接执行,除非在顶层 await 环境中)。
- 它接受一个模块路径字符串(支持变量拼接、模板字符串),返回
Promise - 导入结果默认导出为
default属性,具名导出需解构或通过属性访问 - 常见写法:
const module = await import('./utils.js')或import('./math.js').then(m => console.log(m.add))
配合条件逻辑与路由按需加载
适合在用户操作、权限判断或路由切换时加载对应模块,避免初始包过大。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 例如:点击按钮才加载图表库
echarts:async function loadChart() {<br> const { default: echarts } = await import('echarts');<br> echarts.init(document.getElementById('chart'));<br>} - React/Vue 中常用于
React.lazy()或defineAsyncComponent底层实现 - 可结合
try/catch处理加载失败(如网络错误、模块不存在)
与静态 import 的关键区别
理解差异有助于合理选择导入方式:
- 静态 import:编译时确定,打包工具能分析依赖、做 tree-shaking 和合并 chunk;必须在模块顶层,路径必须是字符串字面量
- 动态 import():运行时解析,支持变量路径;不参与静态分析,但可被 Webpack/Vite 自动拆包成独立 chunk;适用于延迟加载、多语言资源、插件系统等场景
- 注意:
import('./' + lang + '.json')合法,但import(basePath + '/config.js')可能导致构建工具无法预知所有可能路径,需配合webpackPrefetch或magic comments
实用技巧与注意事项
提升动态导入的可控性与体验:
- 使用
/* webpackChunkName: "chunk-name" */注释(Webpack)或/* viteIgnore */(Vite)控制生成的 chunk 文件名 - 多个
import()可并行触发:Promise.all([import('./a'), import('./b')]) - 避免在循环中无节制调用,防止并发过多;必要时加节流或队列控制
- 服务端渲染(SSR)中需判断运行环境,Node.js 里
import()支持但路径需兼容 CommonJS 或 ESM 模式
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










