ES Modules不支持运行时动态筛选导出,但可通过显式重导出(如export { a, helper } from './utils.js')、默认+命名混合导出(如export { default as default, PI } from './math.js')或对象解构封装(如const { publicX, publicY } = all; export { publicX, publicY })在定义阶段静态控制暴露接口。

ES Modules 本身不支持“只导出部分接口”这种运行时动态筛选行为,但可以通过 显式重导出(re-export) 或 条件性命名导出 的方式,在模块定义阶段控制对外暴露的接口范围。
用 export { ... } 显式重导出需要的接口
这是最常用、最清晰的方式:在封装模块中,只从依赖模块中挑出真正要暴露的成员,再统一导出。
// utils.js
export const a = 1;
export const b = 2;
export const c = 3;
export function helper() { /* ... */ }
<p>// api.js —— 只导出 a 和 helper,不暴露 b、c
export { a, helper } from './utils.js';
// 或者先导入再导出(便于加别名或简单包装)
// import { a, helper } from './utils.js';
// export { a, helper };
用 export default + 命名导出组合控制粒度
当主功能适合默认导出,同时又想提供少量辅助接口时,可混合使用:
// math.js
export default function add(x, y) { return x + y; }
export const PI = 3.14159;
export function multiply(x, y) { return x * y; }
<p>// safe-math.js —— 只暴露默认函数和 PI,隐藏 multiply
export { default as default, PI } from './math.js';
// 此时 import calc, { PI } from './safe-math.js' 是合法的
// 但 import { multiply } from './safe-math.js' 会报错:multiply is not exported
借助对象解构 + 单一命名导出做轻量封装
适用于需过滤大量内部工具、但又不想逐个列名的情况(注意:不是运行时过滤,仍是编译期静态确定):
立即学习“Java免费学习笔记(深入)”;
// internal.js
export const _privateA = 1;
export const _privateB = 2;
export const publicX = 'x';
export const publicY = 'y';
<p>// index.js
import * as all from './internal.js';
// 只导出明确标记为 public 的成员
const { publicX, publicY } = all;
export { publicX, publicY };
注意事项
- ESM 导出是静态的,无法像 CommonJS 那样用 if 判断动态决定导出哪些变量
- 试图通过 export * from '...' 会把源模块所有命名导出全部透出,失去控制力,应避免
- 重导出时若起别名(如 export { a as alpha } from './utils.js'),原名 a 就不再对外可见
- Tree-shaking 工具(如 Webpack、Rollup)依赖静态导出结构,合理精简导出有助于减小打包体积


















