const fs = require('node:fs') const path = require('node:path') const projectRoot = path.resolve(__dirname, '..') const h5Root = path.join(projectRoot, 'dist', 'build', 'h5') const faviconSource = path.join(projectRoot, 'public', 'favicon.svg') const faviconTarget = path.join(h5Root, 'favicon.svg') if (!fs.existsSync(h5Root)) { throw new Error(`H5 build output not found: ${h5Root}`) } const copyDirectory = (source, target) => { fs.mkdirSync(target, { recursive: true }) for (const entry of fs.readdirSync(source, { withFileTypes: true })) { const sourcePath = path.join(source, entry.name) const targetPath = path.join(target, entry.name) if (entry.isDirectory()) { copyDirectory(sourcePath, targetPath) continue } if (entry.isFile()) { fs.copyFileSync(sourcePath, targetPath) } } } const copyStaticSubtree = (subtree) => { const sourceDir = path.join(projectRoot, 'static', subtree) const targetDir = path.join(h5Root, 'static', subtree) if (!fs.existsSync(sourceDir)) { throw new Error(`Static assets not found: ${sourceDir}`) } fs.rmSync(targetDir, { recursive: true, force: true }) copyDirectory(sourceDir, targetDir) console.log(`Copied ${subtree} assets to ${path.relative(projectRoot, targetDir)}`) } const copyPublicStaticSubtree = (subtree) => { const sourceDir = path.join(projectRoot, 'public', 'static', subtree) const targetDir = path.join(h5Root, 'static', subtree) if (!fs.existsSync(sourceDir)) { throw new Error(`Public static assets not found: ${sourceDir}`) } fs.rmSync(targetDir, { recursive: true, force: true }) copyDirectory(sourceDir, targetDir) console.log(`Copied public static ${subtree} assets to ${path.relative(projectRoot, targetDir)}`) } const copyStaticFile = (fileName) => { const sourceFile = path.join(projectRoot, 'static', fileName) const targetFile = path.join(h5Root, 'static', fileName) if (!fs.existsSync(sourceFile)) { throw new Error(`Static file not found: ${sourceFile}`) } fs.mkdirSync(path.dirname(targetFile), { recursive: true }) fs.copyFileSync(sourceFile, targetFile) console.log(`Copied ${fileName} to ${path.relative(projectRoot, targetFile)}`) } copyStaticSubtree('nav-assets') copyStaticSubtree('guide-data') copyStaticSubtree('icons') // 讲解业务单元封面由 H5 运行时按 /static/explain/... 动态加载。 copyStaticSubtree('explain') copyStaticSubtree('sgs-map-sdk') copyStaticSubtree('three') copyStaticFile('exhibit-placeholder.jpg') copyStaticFile('hall-placeholder.jpg') copyPublicStaticSubtree('Fonts') if (fs.existsSync(faviconSource)) { fs.copyFileSync(faviconSource, faviconTarget) }