JavaScript模块中可导出async函数(返回Promise),推荐做法;也可导出已执行的Promise(模块缓存,只执行一次);顶层await(ES2022+)支持模块加载时等待异步操作;动态导入import()用于按需加载模块。

在 JavaScript 模块中,export 本身不能直接“导出异步操作的结果”,但可以正常导出一个返回 Promise 的函数(比如 async function),这是完全支持且推荐的做法。
导出 async 函数(最常用)
只需把 async 函数用 export 声明即可。它本质仍是函数,调用后返回 Promise,消费者用 await 或 .then() 处理。
示例(api.js):
export async function fetchUserData(userId) {
const res = await fetch(`/api/users/${userId}`);
if (!res.ok) throw new Error('Failed to fetch user');
return res.json();
}
export async function saveSettings(data) {
await fetch('/api/settings', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
});
return { success: true };
}
导出已执行的 Promise(需谨慎)
如果想导出“已经发起但尚未完成”的异步操作结果(例如初始化时预加载配置),可导出一个 Promise 实例。但要注意:该 Promise 会**被多次 import 共享**(模块缓存机制),后续 import 不会重新执行。
立即学习“Java免费学习笔记(深入)”;
示例(config.js):
// ✅ 正确:导出一个 Promise(只执行一次)
export const appConfig = fetch('/config.json').then(res => res.json());
// ❌ 错误:不能在 export 后直接 await(顶层 await 是模块级语法,非函数)
// export const config = await fetch('/config.json').then(...); // 语法错误(除非用顶层 await)
使用时:
import { appConfig } from './config.js';
appConfig.then(config => console.log(config)); // 或 await appConfig(在支持顶层 await 的模块中)
配合顶层 await(ES2022+,仅模块环境)
若需在模块加载时就等待某个异步操作完成(如初始化全局状态),可用顶层 await。此时整个模块的执行会等待该 Promise 完成。
// init.js
const data = await fetch('/api/init').then(r => r.json());
export const INIT_DATA = data;
// 其他导出也支持
export async function reload() {
const fresh = await fetch('/api/init');
return fresh.json();
}
⚠️ 注意:顶层 await 只在 type="module" 的脚本或 ES 模块中有效,CommonJS 不支持。
动态导出(按需加载,非静态 export)
如果目标是“延迟加载某个模块及其内部异步函数”,应使用 import() 动态导入,而非靠 export 解决:
-
export负责声明“我能提供什么函数” -
import()负责“什么时候去加载那个模块”
例如:
// 在需要时才加载并调用
async function handleUpload() {
const { uploadFile } = await import('./uploader.js'); // uploader.js 中 export async function uploadFile() { ... }
return uploadFile(document.files[0]);
}
核心就一点:async 函数就是普通函数,只是返回 Promise —— export 对它没有任何特殊限制,照常导出、照常调用即可。


















