front/scripts/postbuild-cleanup-dist.js
zzh 7c08e83f38 fix: 官网静态资源改发布到 /site/assets,修复线上 404
postbuild 不再合并到 dist/assets(与 Vite 产物冲突且 Windows 下 cpSync 失败),改为完整复制 IDE官网 到 dist/site 并注入 base href;nginx 增加 /site/ 静态路由。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-24 19:44:31 +08:00

67 lines
2.1 KiB
JavaScript

import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
const dist = path.join(root, 'dist');
const siteSrc = path.join(root, 'IDE官网');
const legacyLoginDir = path.join(dist, 'login');
const siteDir = path.join(dist, 'site');
/** Avoid fs.cpSync merge into dist/assets (conflicts with Vite + can crash on Windows). */
function copyDirSync(src, dest, options = {}) {
const { skipDirNames = new Set() } = options;
fs.mkdirSync(dest, { recursive: true });
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
if (entry.isDirectory() && skipDirNames.has(entry.name)) continue;
const srcPath = path.join(src, entry.name);
const destPath = path.join(dest, entry.name);
if (entry.isDirectory()) {
copyDirSync(srcPath, destPath, options);
continue;
}
if (entry.isFile()) {
fs.copyFileSync(srcPath, destPath);
}
}
}
function injectSiteBaseHref(html) {
if (html.includes('<base ')) return html;
return html.replace('<head>', '<head>\n <base href="/site/">');
}
if (fs.existsSync(legacyLoginDir)) {
fs.rmSync(legacyLoginDir, { recursive: true, force: true });
console.log('[postbuild] removed dist/login (conflicts with SPA route /login)');
}
function copyOfficialSite() {
if (!fs.existsSync(siteSrc) || !fs.existsSync(dist)) {
return;
}
if (fs.existsSync(siteDir)) {
fs.rmSync(siteDir, { recursive: true, force: true });
}
copyDirSync(siteSrc, siteDir, {
skipDirNames: new Set(['.well-known']),
});
const siteIndex = path.join(siteDir, 'index.html');
if (fs.existsSync(siteIndex)) {
const html = fs.readFileSync(siteIndex, 'utf8');
fs.writeFileSync(siteIndex, injectSiteBaseHref(html), 'utf8');
}
const src9610 = path.join(siteSrc, '9610.html');
if (fs.existsSync(src9610)) {
fs.copyFileSync(src9610, path.join(dist, '9610.html'));
}
console.log('[postbuild] copied official site to dist/site (assets under /site/assets)');
}
copyOfficialSite();