import { pluginModuleFederation } from '@module-federation/rsbuild-plugin'; import { defineConfig, loadEnv } from '@rsbuild/core'; import { pluginBabel } from '@rsbuild/plugin-babel'; import { pluginLess } from '@rsbuild/plugin-less'; import { pluginSass } from '@rsbuild/plugin-sass'; import { pluginVue } from '@rsbuild/plugin-vue'; import pkg from './package.json'; import { generateExposesFromRoutes } from './plugins/generateExposesPlugin'; import { zipDistPlugin } from './plugins/zipDistPlugin'; import { routes } from './src/router/routes'; export default defineConfig((env: any) => { const nodeEnv = env?.env || 'development'; const envVars = loadEnv(nodeEnv) as any; const distDir = 'dist'; const isDev = nodeEnv !== 'production'; const { exposes } = generateExposesFromRoutes(routes, { onlyLeafNodes: true, }); // 宿主在加载任何页面之前先加载 bootstrap 以完成登录初始化 exposes['./bootstrap'] = './src/bootstrap.ts'; const backendHost = envVars.parsed?.VITE_API_BASE_HOST || 'http://10.15.0.138:26278'; const plugins: any[] = [ pluginVue({ vueLoaderOptions: { compilerOptions: { expressionPlugins: ['typescript'], }, }, }), pluginLess({ lessLoaderOptions: { lessOptions: { javascriptEnabled: true, }, }, }), pluginSass(), pluginBabel({ include: /\.(?:vue|jsx|tsx)$/, babelLoaderOptions: { plugins: ['@vue/babel-plugin-jsx'], }, }), ]; if (!isDev) { plugins.push( pluginModuleFederation({ name: pkg.name, getPublicPath: `function() { try { if (window.__MF_REMOTE_BASE_URL__ && window.__MF_REMOTE_BASE_URL__["${pkg.name}"]) { return window.__MF_REMOTE_BASE_URL__["${pkg.name}"]; } console.warn("__MF_REMOTE_BASE_URL__ not found, using fallback"); } catch (e) { console.warn("Failed to get publicPath from global variable:", e); } return window.location.origin + "/"; }`, exposes: exposes, dts: false, shared: { vue: { singleton: true, requiredVersion: '^3.5.26' }, 'vue-router': { singleton: true, requiredVersion: '^4.6.4' }, pinia: { singleton: true, eager: true, requiredVersion: '^3.0.4' }, }, }), // routes-info.json 改为构建后由 script/generateRoutesInfo.mjs 生成 // zipDistPlugin is now called separately via npm run zip ); } return { resolve: { alias: { '@': './src', '@widget': './src/widgets', 'vue-video-player': './src/compat/VideoPlayer.vue', 'vue-video-player/src/custom-theme.css': './src/compat/custom-theme.css', }, }, server: { port: 3000, proxy: { '/pdcApi': { target: 'http://r5b9cae6.natappfree.cc', changeOrigin: true, pathRewrite: { '^/pdcApi': '', }, }, }, }, dev: {}, output: { assetPrefix: 'auto', distPath: { root: distDir }, }, plugins, }; });