diff --git a/vite-plugins/sync-manifest-plugins.ts b/vite-plugins/sync-manifest-plugins.ts new file mode 100644 index 0000000..9ba7b0d --- /dev/null +++ b/vite-plugins/sync-manifest-plugins.ts @@ -0,0 +1,64 @@ +import type { Plugin } from 'vite' +import fs from 'fs' +import path from 'path' + +interface ManifestType { + plus?: { + distribute?: { + plugins?: Record + } + } + 'app-plus'?: { + distribute?: { + plugins?: Record + } + } +} + +export default function syncManifestPlugin(): Plugin { + return { + name: 'sync-manifest', + apply: 'build', + enforce: 'post', + writeBundle: { + order: 'post', + handler() { + const srcManifestPath = path.resolve(process.cwd(), './src/manifest.json') + const distAppPath = path.resolve(process.cwd(), './dist/dev/app/manifest.json') + + try { + // 读取源文件 + const srcManifest = JSON.parse(fs.readFileSync(srcManifestPath, 'utf8')) as ManifestType + + // 确保目标目录存在 + const distAppDir = path.dirname(distAppPath) + if (!fs.existsSync(distAppDir)) { + fs.mkdirSync(distAppDir, { recursive: true }) + } + + // 读取目标文件(如果存在) + let distManifest: ManifestType = {} + if (fs.existsSync(distAppPath)) { + distManifest = JSON.parse(fs.readFileSync(distAppPath, 'utf8')) + } + + // 如果源文件存在 plugins + if (srcManifest['app-plus']?.distribute?.plugins) { + // 确保目标文件中有必要的对象结构 + if (!distManifest.plus) distManifest.plus = {} + if (!distManifest.plus.distribute) distManifest.plus.distribute = {} + + // 复制 plugins 内容 + distManifest.plus.distribute.plugins = srcManifest['app-plus'].distribute.plugins + + // 写入更新后的内容 + fs.writeFileSync(distAppPath, JSON.stringify(distManifest, null, 2)) + console.log('✅ Manifest plugins 同步成功') + } + } catch (error) { + console.error('❌ 同步 manifest plugins 失败:', error) + } + }, + }, + } +} diff --git a/vite.config.ts b/vite.config.ts index 4c9d0c2..e41033f 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -25,6 +25,7 @@ import AutoImport from 'unplugin-auto-import/vite' import { defineConfig, loadEnv } from 'vite' import ViteRestart from 'vite-plugin-restart' import openDevTools from './scripts/open-dev-tools' +import syncManifestPlugin from './vite-plugins/sync-manifest-plugins' // https://vitejs.dev/config/ export default defineConfig(({ command, mode }) => { @@ -125,6 +126,7 @@ export default defineConfig(({ command, mode }) => { }), // 只有在 app 平台时才启用 copyNativeRes 插件 // UNI_PLATFORM === 'app' && copyNativeRes(), + syncManifestPlugin(), Components({ extensions: ['vue'], deep: true, // 是否递归扫描子目录,