ES Modules 的安全导出需编译期隔离敏感接口:仅显式 export 受控能力,禁用 default 导出,私有变量/函数不声明 export;统一通过 api.ts 入口导出,并用 TS、ESLint 和 CI 工程化拦截越界引用。

ES Modules 本身不提供“过滤导出接口”的运行时机制,所谓“过滤”,本质是**不导出、不暴露**——让敏感接口在编译期就不可见,而非导出后再拦截或隐藏。
只导出真正需要的命名接口
禁用 export default,避免把敏感常量、内部工具函数裹进默认对象里被随意解构。每个导出项必须语义明确、用途清晰。
- ❌ 错误:导出含敏感信息的对象字面量
export default { API_KEY: 'sk_...', _cache: new Map() };
外部可直接import { API_KEY } from './config',等于白设防 - ✅ 正确:仅导出受控能力
export const getApiToken = () => secureStore.get('token');export const isInternalMode = () => process.env.NODE_ENV === 'internal';
敏感变量留在模块作用域内,绝不挂到 exports 上
ESM 中,未被 export 声明的顶层声明(const、let、function)天然隔离。它们不属于模块的公共接口,其他模块 import 后根本无法访问。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
const SECRET_SALT = 'a1b2c3';—— 不写 export,外部连名字都看不到 -
function _encryptInternal(data) { ... }—— 下划线只是约定,真正起作用的是没 export - 注意:不要写
export { SECRET_SALT }或exports.SECRET_SALT = ...(后者是 CommonJS 写法,混用易出错)
用 api.ts 做统一导出入口(导出防火墙)
禁止业务文件直接导入底层模块。所有对外能力必须经由根目录的 api.ts 显式 re-export,并可在此做校验、封装、日志等增强。
立即学习“Java免费学习笔记(深入)”;
- 目录结构示例:
src/auth/
├──internal.ts(含const TOKEN_STORE = new WeakMap(),无任何 export)
├──service.ts(导出login()、logout(),但不导出 TokenStore)
└──api.ts(唯一合法出口:export { login, logout } from './service';) - 外部只能写
import { login } from './auth/api';,不能写import { TOKEN_STORE } from './auth/internal';
配合工具链自动拦截越界导出
靠人工约定容易遗漏,需工程化兜底:
- TS 编译器开启
"noUnusedExports": true,未被api.ts或其他合法入口引用的 export 会报错 - ESLint 启用
import/no-unused-modules,标记未被任何地方 import 的导出项 - CI 流程中扫描 AST,禁止出现
import ... from './auth/internal'这类直引私有模块的代码

















