子模块代理统一暴露SDK接口的核心是“分层导出+聚合中转”,即按职责拆分auth、api、storage、logger等子模块并各自导出,主模块index.js通过require加载后聚合为sdk对象导出,支持运行时环境判断与条件挂载,并可配合Rollup等工具输出多格式产物。

用子模块代理统一暴露复杂 SDK 接口,核心是“分层导出 + 聚合中转”,既保持内部模块解耦,又对外提供干净、可控的入口。CommonJS 本身不支持原生的命名空间或子路径导入(如 require('sdk/utils')),但可以通过主模块主动加载并重组子模块来实现逻辑上的代理暴露。
子模块按职责拆分,各自独立导出
先将 SDK 功能按领域拆成多个子模块,每个模块只负责一件事,并通过 module.exports 明确导出其能力:
-
auth.js:导出登录、鉴权、token 管理等方法 -
api.js:封装请求拦截、重试、错误标准化等底层 HTTP 逻辑 -
storage.js:提供加密缓存、持久化读写等能力 -
logger.js:暴露日志采集、上报、分级开关等接口
每个文件都用 module.exports = { ... } 或函数/类形式导出,不依赖外部状态,便于单独测试和复用。
主模块(index.js)集中加载并代理组合
在 SDK 主入口(如 index.js)中,用 require 加载各子模块,再统一挂载到一个对象上导出:
立即学习“Java免费学习笔记(深入)”;
const auth = require('./auth');
const api = require('./api');
const storage = require('./storage');
const logger = require('./logger');
// 可选:按需增强或过滤
const sdk = {
auth,
api,
storage,
logger,
// 补充顶层快捷方法
init(options) {
auth.init(options);
logger.setEnv(options.env);
}
};
module.exports = sdk;
这样调用方只需 const sdk = require('./sdk');,就能通过 sdk.auth.login()、sdk.api.get() 访问全部能力,结构清晰且可预测。
支持运行时条件代理与环境适配
CommonJS 的动态特性允许你在代理层做环境判断,比如开发/生产差异、平台检测、功能开关:
- 根据
process.env.NODE_ENV决定是否挂载调试工具:debug: process.env.NODE_ENV === 'dev' ? require('./debug') : undefined - 按平台动态加载不同实现:
utils: require(`./utils/${platform()}`) - 对敏感方法做包装保护:
destroy: () => { if (isProd()) throw new Error('forbidden'); return realDestroy(); }
这种代理不是静态声明,而是在模块加载时执行的逻辑,天然适合 SDK 的兼容性与灰度控制场景。
配合打包工具生成更友好的产物结构
如果 SDK 需要发布为多格式(如 CommonJS + ESM + UMD),可用 Rollup 或 Webpack 打包。关键点:
- 用
@rollup/plugin-commonjs正确解析子模块的require和exports - 设置
output.exports: 'named',确保导出结构可被 tree-shaking 工具识别 - 对外保留
main(CommonJS)、module(ESM)、unpkg(UMD)字段,让不同环境按需加载
最终使用者无论用 require、import 还是 script 标签,都能拿到一致、稳定的接口形态。


















