es modules 中不能直接用 export 导出未命名对象字面量,但可通过 export default、具名导出(export const)或 export * from 实现等效效果,核心是导出默认值或具名绑定以支持静态分析。

ES Modules 中不能直接用 export 导出一个“未命名的整个对象字面量”,但可以通过几种标准方式实现等效效果:本质是导出一个具名或默认的对象值,让使用者能一次性解构或引用其全部结构。
用 export default 导出一个对象
这是最常用、最直观的方式。导出的是一个默认值(可以是任意表达式,包括对象字面量),使用者可用默认导入接收整个结构:
// utils.js
export default {
add: (a, b) => a + b,
multiply: (a, b) => a * b,
PI: 3.14159
};// main.js import mathUtils from './utils.js'; console.log(mathUtils.add(2, 3)); // 5 console.log(mathUtils.PI); // 3.14159
用具名导出(export const)批量暴露属性
适合希望使用者按需导入、支持静态分析和 tree-shaking 的场景。每个属性单独导出,但可集中定义在一个对象中再解构导出:
// api.js
const API = {
baseUrl: 'https://api.example.com',
endpoints: {
users: '/users',
posts: '/posts'
},
fetchUser: id => fetch(`${baseUrl}${endpoints.users}/${id}`)
};
<p>// 解构后具名导出(推荐写法)
export const { baseUrl, endpoints, fetchUser } = API;</p>// main.js
import { baseUrl, fetchUser } from './api.js';用 export * from 聚合多个模块的导出
当对象结构来自多个子模块时,可在入口文件统一导出全部内容(类似“导出整个命名空间”):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
// helpers/string.js export const capitalize = s => s[0].toUpperCase() + s.slice(1); export const truncate = (s, n) => s.length > n ? s.slice(0, n) + '...' : s; <p>// helpers/number.js export const clamp = (n, min, max) => Math.min(Math.max(n, min), max);</p><p>// helpers/index.js ← 入口聚合文件 export <em> from './string.js'; export </em> from './number.js';</p>
// app.js
import * as helpers from './helpers/index.js';
console.log(helpers.capitalize('hello')); // 'Hello'
console.log(helpers.clamp(-5, 0, 10)); // 0不推荐:动态构造 export 对象(语法错误)
以下写法 ❌ 无效,会报语法错误:
export { foo: 1, bar: 2 }; // SyntaxError: Unexpected token ':'
export { ...someObj }; // 不支持展开语法用于 export 声明ESM 的 export 声明要求导出名称必须是静态字符串标识符,不能是运行时计算的键名或对象字面量。
关键点:ES Modules 强调静态可分析性,所以“导出整个对象结构”的实质是导出一个默认值,或一组具名绑定,而非 JavaScript 运行时的对象快照。选择哪种方式取决于你是否需要 tree-shaking、是否允许默认导入、以及模块组织策略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










