应用级自组织模块系统
对标原生 ESM,作为业务层模块系统替代脆弱的相对路径引用。一行代码纯粹点火,生命周期编排与业务全域在 Mesh 模块内自闭环运转。
无需装饰器与 reflect-metadata,避开传统 DI 容器的痛点。50 个模块 7.6µs 装配完成,连 Serverless 冷启动也几乎无感。
真实工业场景:模块 A (remoteConfig) 启动时需基于秘钥异步发起网络请求拉取配置数据包,对外暴露纯同步函数 isEnabled(feature);模块 B (orderService) 在自身初始化装配期,必须同步调用模块 A 的函数决定是否启用特性(模块 B 强物理依赖模块 A 的初始化先决条件)。
// Spring: 依托 JVM 物理多线程模型,在启动阶段阻塞主线程等待异步数据包拉取就绪
@Configuration
public class AppConfig {
@Bean
public RemoteConfig remoteConfig() {
RemoteConfig config = new RemoteConfig();
config.initFromRemote(secretKey); // 启动阶段阻塞线程等待远程配置完成
return config;
}
@Bean
public OrderService orderService(RemoteConfig remoteConfig) {
// 模块 B 在初始化装配期同步调用模块 A 的函数
boolean enableDiscount = remoteConfig.isEnabled("vip_discount");
return new OrderService(enableDiscount);
}
}// 痛点:TS Class 构造器无法 await!若用 onModuleInit 会因时序竞态读取到未初始化空值;
// 苦心经营的 @Injectable() 类体系在此刻土崩瓦解,被迫退化为冗长脆弱的 useFactory 字典:
@Module({
providers: [
{
provide: "REMOTE_CONFIG",
useFactory: async () => {
const config = await fetchRemoteConfig(process.env.SECRET_KEY);
return { isEnabled: (feature: string) => config[feature] ?? false };
},
},
{
provide: "ORDER_SERVICE",
useFactory: (config: RemoteConfig) => {
// 模块 B 必须手写工厂胶水代码,并手动在 inject 数组中维持脆弱的字符串映射
const enableDiscount = config.isEnabled("vip_discount");
return new OrderService(enableDiscount);
},
inject: ["REMOTE_CONFIG"],
},
],
})
export class AppModule {}// 模块 A (src/modules/remoteConfig/index.ts):原生 async 函数初始化,返回纯同步闭包方法
export const main = async () => {
const config = await fetchRemoteConfig(process.env.SECRET_KEY);
return {
isEnabled(feature: string) {
return config[feature] ?? false;
}, // 内部数据已就绪,纯同步!
};
};
// 模块 B (src/modules/orderService/index.ts):声明依赖短名称,装配期直接同步消费
export const dependencies = ["remoteConfig"];
export const main = (container: ModularContainer) => {
const { remoteConfig } = container;
// 拓扑引擎自动保证:唤醒 orderService 时,remoteConfig 的 async 初始化必定已 100% 解决!
const enableDiscount = remoteConfig.isEnabled("vip_discount");
return {
createOrder(item: string) {
return { item, price: enableDiscount ? 80 : 100 };
},
};
};