// build.js const fs = require('fs'); const path = require('path'); const data = require('./data.js'); const template = fs.readFileSync(path.join(__dirname, 'template.html'), 'utf-8'); // 清理并创建 dist 目录 const distDir = path.join(__dirname, 'dist'); if (fs.existsSync(distDir)) { fs.rmSync(distDir, { recursive: true, force: true }); } fs.mkdirSync(distDir); // 创建子目录 const projectSubDir = path.join(distDir, data.siteConfig.basePath.replace(/^\//, '')); if (!fs.existsSync(projectSubDir)) { fs.mkdirSync(projectSubDir, { recursive: true }); } // 拷贝 assets 目录 const assetsDir = path.join(__dirname, 'assets'); const targetAssetsDir = path.join(projectSubDir, 'assets'); if (fs.existsSync(assetsDir)) { if (!fs.existsSync(targetAssetsDir)) fs.mkdirSync(targetAssetsDir, { recursive: true }); fs.cpSync(assetsDir, targetAssetsDir, { recursive: true }); console.log('✅ Assets 已同步'); } data.languages.forEach(lang => { const content = data.content[lang]; let html = template; const fullBasePath = data.siteConfig.basePath; const fullDomain = data.siteConfig.domain; html = html.replace(/{{langCode}}/g, lang); html = html.replace(/{{title}}/g, content.title); html = html.replace(/{{metaDesc}}/g, content.metaDesc); // SEO Dynamic Tags const canonicalUrl = `${fullDomain}${fullBasePath}/${lang}/index.html`; html = html.replace(/{{canonicalUrl}}/g, canonicalUrl); // Generate hreflang tags const hreflangTags = data.languages.map(l => { return ``; }).join('\n '); // Add x-default (usually English) const xDefault = ``; html = html.replace(/{{hreflangTags}}/g, hreflangTags + '\n ' + xDefault); // Use a default OG image or generate one (placeholder for now) html = html.replace(/{{ogImage}}/g, `${fullDomain}${fullBasePath}/assets/og-shared.jpg`); // 语言链接 - 动态生成 (保持相对路径,兼容性更好) const langLinksHtml = data.languages.map(l => { const lContent = data.content[l]; if (l === lang) return `${lContent.langName}`; return `${lContent.langName}`; }).join(''); html = html.replace(/{{languageLinks}}/g, langLinksHtml); // 表头 const headersHtml = content.headers.map(h => `
We help you find the best options in travel, tech, and life.
Compare 16 host cities across USA, Canada, and Mexico. Decide where to watch based on match count, budget, and local logistics. Multi-language support included.
Picking the right AI model or tool for your specific workflow.
Data-driven destination comparison for digital nomads.
© 2026 PickBetterAI.com | All Rights Reserved