import path from 'path';
import { type PluginOption, type ResolvedConfig } from 'vite';
import { type ConfigRoute } from '../typings.d';
import fs from 'fs';
import type { MicroAppConfig } from '../microAppRouter';
export default function vitePluginCubeFront() {
const virtualModuleNamePrefix = 'cube';
const virtualModuleIdPrefix = 'virtual:cube-front-';
const resolvedVirtualModuleIdPrefix = '\0' + virtualModuleIdPrefix;
// 虚拟模块名称常量
const appName = 'app';
const microAppsName = 'micro-apps';
const configName = 'config';
/** 配置信息 */
let config: ResolvedConfig & { routes: ConfigRoute[] };
/** 包含路由信息的字符串代码 */
let routesStr: string | undefined;
const viteCubeApp: PluginOption = {
name: `vite:${virtualModuleNamePrefix}-${appName}`,
enforce: 'post',
config: (_config, _m) => {
return {
// resolve: {
// alias: {
// 'cube-front': path.resolve(__dirname, './'),
// },
// },
};
},
configResolved: (_config) => {
// console.log('configResolved--------------------', config)
},
resolveId(id: string) {
if (id === virtualModuleIdPrefix + appName) {
return resolvedVirtualModuleIdPrefix + appName;
}
},
load(id: string) {
if (id === resolvedVirtualModuleIdPrefix + appName) {
return `
export const msg = "from virtual module"
export { default as App } from 'cube-front/core/App.vue'
`;
}
},
transform(code: string, _id: string) {
return code;
},
transformIndexHtml(html: string) {
return html;
},
};
// 新增应用配置插件
const viteCubeAppNames: PluginOption = {
name: `vite:${virtualModuleNamePrefix}-${microAppsName}`,
enforce: 'post',
configResolved: (cfg) => {
config = cfg as ResolvedConfig & { routes: ConfigRoute[] };
},
resolveId(id: string) {
if (id === virtualModuleIdPrefix + microAppsName) {
return resolvedVirtualModuleIdPrefix + microAppsName;
}
},
load(id: string) {
if (id === resolvedVirtualModuleIdPrefix + microAppsName) {
try {
// 读取microAppConfig.json文件
const configPath = path.resolve(config.root, 'configs/microAppConfig.json');
const microAppConfigs = JSON.parse(
fs.readFileSync(configPath, 'utf-8'),
) as Array<MicroAppConfig>;
// 构建应用配置代码
const microAppConfigsStrList = microAppConfigs.map((app) => {
return {
name: app.name,
prefix: app.prefix,
module: `() => import('${app.packageName || app.name}')`,
};
});
let code = `
const microAppConfigs = ${JSON.stringify(microAppConfigsStrList)}
export default microAppConfigs
`;
code = code.replace(/"(\(\)\s+=>\s+import\([^\)]+\))"/g, '$1'); // 去掉属性名的引号
return code;
} catch (error) {
console.error('Failed to load microAppConfig.json', error);
return `
const microAppConfigs = []
export default microAppConfigs
`;
}
}
},
};
// 配置虚拟模块插件
const viteCubeConfig: PluginOption = {
name: `vite:${virtualModuleNamePrefix}-${configName}`,
enforce: 'post',
configResolved: (cfg) => {
config = cfg as ResolvedConfig & { routes: ConfigRoute[] };
},
resolveId(id: string) {
if (id === virtualModuleIdPrefix + configName) {
return resolvedVirtualModuleIdPrefix + configName;
}
},
load(id: string) {
if (id === resolvedVirtualModuleIdPrefix + configName) {
try {
const env = config.mode || 'development';
// 构建配置代码,直接导入配置文件
return `
// 导入基础配置和环境特定配置
import { config as baseConfig } from '${config.root}/configs/config'
import { config as envConfig } from '${config.root}/configs/config.${env}'
// 保持原始的configData结构
export const configData = {
general: baseConfig,
${env}: envConfig
}
export const currentEnv = '${env}'
export default { configData, currentEnv }
`;
} catch (error) {
console.error('Failed to load config', error);
return `
// 当配置加载失败时提供默认配置
export const configData = {};
export const currentEnv = '${config.mode || 'development'}';
export default { configData, currentEnv };
`;
}
}
},
};
return [viteCubeApp, viteCubeAppNames, viteCubeConfig];
}
|