/** * MultiBundleConfig - 多 Bundle 配置系统 * 提供统一的配置接口,支持代码配置方式 */ import { BundleManifest } from './ModuleRegistry'; import { Platform } from 'react-native'; /** * 开发服务器配置 */ export interface DevServerConfig { host: string; port: number; protocol?: 'http' | 'https'; } /** * Manifest 提供者类型 * 支持函数(异步获取)或 URL 字符串 */ export type ManifestProvider = (() => Promise) | string; /** * ModuleLoader 接口 */ export interface ModuleLoader { loadBusinessBundle(moduleId: string, bundlePath: string): Promise<{ success: boolean; errorMessage?: string }>; } /** * 多 Bundle 配置接口 */ export interface MultiBundleConfig { /** * 模块路径规则(glob 模式) * 用于 Metro 配置中识别模块 bundle * 例如: ['src/modules/**'] */ modulePaths?: string[]; /** * 共享依赖路径列表(glob 模式) * 这些路径下的代码会被打包到主 bundle,模块 bundle 可以共享使用 * 例如: ['src/multi-bundle/**', 'src/navigation/**'] */ sharedDependencies?: string[]; /** * Manifest 提供者 * - 函数:自定义获取逻辑 * - 字符串:manifest URL(开发环境从 HTTP 服务器获取) */ manifestProvider?: ManifestProvider; /** * 自定义 ModuleLoader(可选) * 如果不提供,将使用默认的 ModuleLoader(开发环境用 Mock,生产环境用 Native) */ moduleLoader?: ModuleLoader; /** * 预加载模块列表 * 应用启动时自动预加载这些模块 */ preloadModules?: string[]; /** * 开发服务器配置 * 用于开发环境从 HTTP 服务器获取 manifest 和 bundle */ devServer?: DevServerConfig; /** * 错误处理回调 */ onError?: (error: Error) => void; } /** * 默认配置 */ const DEFAULT_CONFIG: Required> & { moduleLoader?: ModuleLoader; manifestProvider?: ManifestProvider; onError?: (error: Error) => void; } = { modulePaths: ['src/modules/**'], sharedDependencies: ['src/multi-bundle/**', 'src/navigation/**'], preloadModules: [], devServer: { host: Platform.OS === 'android' ? '10.0.2.2' : 'localhost', port: 8081, protocol: 'http', }, }; /** * 合并配置 * 将用户配置与默认配置合并 */ export function mergeConfig( userConfig: MultiBundleConfig ): Required> & { moduleLoader?: ModuleLoader; manifestProvider?: ManifestProvider; onError?: (error: Error) => void; } { return { modulePaths: userConfig.modulePaths ?? DEFAULT_CONFIG.modulePaths, sharedDependencies: userConfig.sharedDependencies ?? DEFAULT_CONFIG.sharedDependencies, preloadModules: userConfig.preloadModules ?? DEFAULT_CONFIG.preloadModules, devServer: { ...DEFAULT_CONFIG.devServer, ...userConfig.devServer, }, moduleLoader: userConfig.moduleLoader, manifestProvider: userConfig.manifestProvider, onError: userConfig.onError, }; } /** * 全局配置实例(用于 Metro 配置等场景) */ let globalConfig: ReturnType | null = null; /** * 设置全局配置 */ export function setGlobalConfig(config: ReturnType) { globalConfig = config; } /** * 获取全局配置 */ export function getGlobalConfig(): ReturnType | null { return globalConfig; }