From 3c2ab0bf8a1e711d1066414de9a7ba13a8ffd16b Mon Sep 17 00:00:00 2001 From: Gaubee Date: Wed, 21 Jan 2026 17:06:33 +0800 Subject: [PATCH] fix(miniapps): propagate wujieConfig to ecosystem.json for remote miniapps --- scripts/vite-plugin-miniapps.ts | 23 ++++++++++++----- scripts/vite-plugin-remote-miniapps.ts | 2 +- vite.config.ts | 35 ++++++++++++++------------ 3 files changed, 37 insertions(+), 23 deletions(-) diff --git a/scripts/vite-plugin-miniapps.ts b/scripts/vite-plugin-miniapps.ts index d95a39bbd..fc7f4e887 100644 --- a/scripts/vite-plugin-miniapps.ts +++ b/scripts/vite-plugin-miniapps.ts @@ -11,7 +11,7 @@ import { resolve, join } from 'node:path'; import { readdirSync, existsSync, readFileSync, writeFileSync, mkdirSync, cpSync } from 'node:fs'; import detectPort from 'detect-port'; import https from 'node:https'; -import { getRemoteMiniappsForEcosystem } from './vite-plugin-remote-miniapps'; +import { getRemoteMiniappsForEcosystem, type RemoteMiniappConfig } from './vite-plugin-remote-miniapps'; import type { WujieRuntimeConfig } from '../src/services/ecosystem/types'; // ==================== Types ==================== @@ -75,12 +75,13 @@ interface MiniappServer { interface MiniappsPluginOptions { miniappsDir?: string; apps?: Record; + remoteMiniapps?: RemoteMiniappConfig[]; } // ==================== Plugin ==================== export function miniappsPlugin(options: MiniappsPluginOptions = {}): Plugin { - const { miniappsDir = 'miniapps', apps = {} } = options; + const { miniappsDir = 'miniapps', apps = {}, remoteMiniapps = [] } = options; let root: string; let isBuild = false; @@ -98,7 +99,7 @@ export function miniappsPlugin(options: MiniappsPluginOptions = {}): Plugin { if (isBuild && options.dir) { await buildAllMiniapps(root, miniappsDir, options.dir); - const ecosystem = generateEcosystemDataForBuild(root, miniappsDir, apps); + const ecosystem = generateEcosystemDataForBuild(root, miniappsDir, apps, remoteMiniapps); const miniappsOutputDir = resolve(options.dir, 'miniapps'); mkdirSync(miniappsOutputDir, { recursive: true }); const outputPath = resolve(miniappsOutputDir, 'ecosystem.json'); @@ -283,6 +284,7 @@ function generateEcosystemDataForBuild( root: string, miniappsDir: string, apps: Record, + remoteConfigs: RemoteMiniappConfig[], ): EcosystemJson { const miniappsPath = resolve(root, miniappsDir); const manifests = scanMiniapps(miniappsPath); @@ -305,7 +307,7 @@ function generateEcosystemDataForBuild( }; }); - const remoteApps = scanRemoteMiniappsForBuild(miniappsPath); + const remoteApps = scanRemoteMiniappsForBuild(miniappsPath, remoteConfigs); return { name: 'Bio 官方生态', @@ -316,10 +318,16 @@ function generateEcosystemDataForBuild( }; } -function scanRemoteMiniappsForBuild(miniappsPath: string): Array { +function scanRemoteMiniappsForBuild( + miniappsPath: string, + remoteConfigs: RemoteMiniappConfig[], +): Array { if (!existsSync(miniappsPath)) return []; - const remoteApps: Array = []; + const configByDirName = new Map(remoteConfigs.map((c) => [c.dirName, c])); + const remoteApps: Array< + MiniappManifest & { url: string; runtime?: MiniappRuntime; wujieConfig?: WujieRuntimeConfig } + > = []; const entries = readdirSync(miniappsPath, { withFileTypes: true }); for (const entry of entries) { @@ -334,12 +342,15 @@ function scanRemoteMiniappsForBuild(miniappsPath: string): Array (s.startsWith('http') ? s : new URL(s, baseUrl).href)) ?? [], + runtime: config?.build?.runtime ?? 'wujie', + wujieConfig: config?.build?.wujieConfig, }); } catch { console.warn(`[miniapps] ${entry.name}: invalid remote manifest.json, skipping`); diff --git a/scripts/vite-plugin-remote-miniapps.ts b/scripts/vite-plugin-remote-miniapps.ts index 995b1624a..2215201f3 100644 --- a/scripts/vite-plugin-remote-miniapps.ts +++ b/scripts/vite-plugin-remote-miniapps.ts @@ -38,7 +38,7 @@ interface MiniappBuildConfig { injectBaseTag?: boolean | string; } -interface RemoteMiniappConfig { +export interface RemoteMiniappConfig { metadataUrl: string; dirName: string; server?: MiniappServerConfig; diff --git a/vite.config.ts b/vite.config.ts index 83e15e2f7..d38b6df5a 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -7,9 +7,24 @@ import { networkInterfaces } from 'node:os'; import { resolve } from 'node:path'; import { mockDevToolsPlugin } from './scripts/vite-plugin-mock-devtools'; import { miniappsPlugin } from './scripts/vite-plugin-miniapps'; -import { remoteMiniappsPlugin } from './scripts/vite-plugin-remote-miniapps'; +import { remoteMiniappsPlugin, type RemoteMiniappConfig } from './scripts/vite-plugin-remote-miniapps'; import { buildCheckPlugin } from './scripts/vite-plugin-build-check'; +const remoteMiniappsConfig: RemoteMiniappConfig[] = [ + { + metadataUrl: 'https://iweb.xin/rwahub.bfmeta.com.miniapp/metadata.json', + dirName: 'rwa-hub', + server: { + runtime: 'wujie', + wujieConfig: { rewriteAbsolutePaths: true }, + }, + build: { + runtime: 'wujie', + wujieConfig: { rewriteAbsolutePaths: true }, + }, + }, +]; + function getPreferredLanIPv4(): string | undefined { const ifaces = networkInterfaces(); const ips: string[] = []; @@ -93,27 +108,14 @@ export default defineConfig(({ mode }) => { mockDevToolsPlugin(), // 远程 miniapps (必须在 miniappsPlugin 之前,以便注册到全局状态) remoteMiniappsPlugin({ - miniapps: [ - { - metadataUrl: 'https://iweb.xin/rwahub.bfmeta.com.miniapp/metadata.json', - dirName: 'rwa-hub', - server: { - runtime: 'wujie', - wujieConfig: { rewriteAbsolutePaths: true }, - }, - build: { - runtime: 'wujie', - wujieConfig: { rewriteAbsolutePaths: true }, - }, - }, - ], + miniapps: remoteMiniappsConfig, timeout: 60000, retries: 3, }), miniappsPlugin({ apps: { 'xin.dweb.teleport': { - server: 'iframe', + server: 'wujie', build: 'wujie', }, 'xin.dweb.biobridge': { @@ -121,6 +123,7 @@ export default defineConfig(({ mode }) => { build: 'wujie', }, }, + remoteMiniapps: remoteMiniappsConfig, }), buildCheckPlugin(), ],