/** * 微信小程序:构建完成后用 pages.json 覆盖写 app.json,并清理已删除组件的残留文件, * 避免主包 app.json 被误合并为「仅有 usingComponents、无 pages」。 * HBuilderX 若走 vue-cli 链时会加载本文件;纯内置编译无此文件时,请执行 npm run mp:fix-app-json */ const path = require('path') const fs = require('fs') const { execFileSync } = require('child_process') const fixScript = path.join(__dirname, 'scripts', 'fix-mp-app-json.cjs') /** 从 manifest.json 解析 versionName(支持文件内注释) */ function readManifestVersionName() { const manifestPath = path.join(__dirname, 'manifest.json') try { const raw = fs.readFileSync(manifestPath, 'utf8') const nameMatch = raw.match(/"versionName"\s*:\s*"([^"]+)"/) if (nameMatch) return nameMatch[1] } catch (e) { console.warn('[vue.config] read manifest version:', e && e.message) } return '1.0.1' } function runFix() { if (!fs.existsSync(fixScript)) return try { execFileSync(process.execPath, [fixScript], { cwd: __dirname, stdio: 'pipe' }) } catch (e) { // 不打断主构建 } } class FixMpWxAppJsonPlugin { apply(compiler) { compiler.hooks.done.tap('FixMpWxAppJson', (stats) => { if (stats && stats.hasErrors && stats.hasErrors()) return runFix() }) } } module.exports = { chainWebpack(config) { try { if (config && typeof config.plugin === 'function') { const manifestVersion = readManifestVersionName() config.plugin('define').tap((definitions) => { const def = definitions[0] || {} def['__APP_MANIFEST_VERSION__'] = JSON.stringify(manifestVersion) definitions[0] = def return definitions }) } } catch (e) { console.warn('[vue.config] define manifest version:', e && e.message) } try { if (!config || typeof config.plugin !== 'function') return const name = 'fix-mp-wx-app-json' if (config.plugins && config.plugins.has && config.plugins.has(name)) return config.plugin(name).use(FixMpWxAppJsonPlugin, []) } catch (e) { console.warn('[fix-mp] vue.config 链式插件未生效(可改用手动执行 npm run mp:fix-app-json)', e && e.message) } }, }