import() 是返回 promise 的动态导入函数,支持运行时按需加载模块,实现懒加载与代码分割;需用 await/.then 处理,参数为字符串路径,支持变量拼接但不支持完全动态表达式,配合构建工具自动分割 chunk 并可加魔法注释优化。

JavaScript 中的 import() 是一个函数式动态导入语法,它返回一个 Promise,用于在运行时按需加载模块,实现真正的代码分割和懒加载。
基本用法:用 import() 替代静态 import
静态 import 在模块解析阶段就加载全部依赖,而 import() 允许你在条件判断、事件响应或路由切换等时机才加载模块:
- 它不是声明语句,而是异步函数调用,必须用
await或.then()处理返回的 Promise - 参数是字符串(模块路径),支持变量拼接(但不能是完全动态的表达式,如含用户输入)
- 模块路径需为相对或绝对 URL,或符合模块解析规则的包名(如
"lodash")
示例:
async function loadChart() {
const { default: Chart } = await import('chart.js');
new Chart(ctx, { /* 配置 */ });
}结合条件与交互实现按需加载
常见场景包括点击按钮加载组件、页面滚动到某区域再加载、或根据用户权限加载不同模块:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 按钮触发:绑定 click 事件后调用
import(),避免首屏加载无关逻辑 - 条件加载:比如仅在支持 WebAssembly 的浏览器中加载 wasm 模块
- 错误处理:务必用
try/catch或.catch()捕获加载失败(如网络中断、404)
示例:
document.getElementById('load-pdf').addEventListener('click', async () => {
try {
const { default: PDFJS } = await import('pdfjs-dist/build/pdf.mjs');
PDFJS.GlobalWorkerOptions.workerSrc = 'pdfjs-dist/build/pdf.worker.mjs';
// 使用 PDFJS 渲染
} catch (err) {
console.error('PDF 加载失败:', err);
}
});配合打包工具(如 Webpack/Vite)自动代码分割
现代构建工具会将 import() 调用识别为分割点,把目标模块单独打包成 chunk 文件:
- Webpack 中会生成类似
123.a4b5c678.js的独立文件,按需请求 - Vite 默认启用,且支持
import.meta.glob()批量导入,适合路由或图标集合 - 可配合魔法注释(如
/* webpackChunkName: "chart" */)自定义 chunk 名称,便于调试和缓存控制
示例(带注释):
const module = await import( /* webpackChunkName: "user-panel" */ /* webpackPrefetch: true */ './panels/UserPanel.js' );
注意事项与限制
import() 强大但有边界,使用时需注意:
- 不支持完全动态路径(如
import(userInput)),否则构建工具无法静态分析,会报错或回退到全量加载 - 模块只执行一次,多次
import()同一路径会复用已加载的模块实例(Promise 缓存) - 暂不支持直接解构命名导出(如
import({ foo } from './x')),必须先取default或整体对象再解构 - 服务端环境(Node.js)需启用
--experimental-import-meta-resolve或使用兼容方案
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










