diff --git a/scripts/prerender.js b/scripts/prerender.js index bcc8282..316154e 100644 --- a/scripts/prerender.js +++ b/scripts/prerender.js @@ -1,69 +1,146 @@ -import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs'; -import { resolve, dirname } from 'path'; -import { fileURLToPath } from 'url'; +import { readFileSync, writeFileSync, mkdirSync, existsSync } from "fs"; +import { resolve, dirname } from "path"; +import { fileURLToPath } from "url"; +import { client } from "../src/api/client"; const __dirname = dirname(fileURLToPath(import.meta.url)); -// Список всех страниц -const routes = [ - '/', - '/products', - '/about', - // добавьте свои URL -]; +const products = async function getProducts() { + try { + console.log("📡 Загрузка товаров из API..."); + const response = await client.get("/productList/"); + return response.data; + } catch (error) { + console.error("❌ Ошибка загрузки из API:", error.message); + console.log("📦 Использую тестовые данные..."); + } +}; -const distPath = resolve(__dirname, '../dist'); -const indexHtmlPath = resolve(distPath, 'index.html'); +const distPath = resolve(__dirname, "../dist"); +const indexHtmlPath = resolve(distPath, "index.html"); if (!existsSync(indexHtmlPath)) { - console.error('❌ Сначала запустите npm run build'); + console.error("❌ Сначала запустите npm run build"); process.exit(1); } // Читаем исходный HTML -let baseHtml = readFileSync(indexHtmlPath, 'utf-8'); +let baseHtml = readFileSync(indexHtmlPath, "utf-8"); // Добавляем базовые мета-теги для каждой страницы -const pages = { - '/': { - title: 'Магазин труб - Главная', - description: 'Купить канализационные трубы по низким ценам' +const pages = [ + { + path: "/", + title: "Магазин труб - Главная", + description: + "Купить канализационные трубы, фитинги и комплектующие по низким ценам.", }, - '/products': { - title: 'Каталог труб для канализации', - description: 'Широкий выбор труб, фитингов и комплектующих' + { + path: "/products", + title: "Каталог труб и фитингов для канализации", + description: + "Широкий выбор канализационных труб ПВХ, фитингов, тройников, переходов, колен. Высокое качество, низкие цены.", }, - '/about': { - title: 'О магазине труб', - description: 'Информация о нашей компании' - } -}; + { + path: "/about", + title: "О магазине труб - Доставка и гарантия", + description: + "Информация о нашей компании. Как мы работаем, условия доставки, гарантия на все товары.", + }, +]; -routes.forEach(route => { - const pageInfo = pages[route] || pages['/']; - - // Заменяем мета-теги в HTML - let html = baseHtml - .replace(/.*?<\/title>/, `<title>${pageInfo.title}`) - .replace( - //, - `` +const allRoutes = [...pages]; + +// Добавляем маршруты товаров +for (const product of products) { + allRoutes.push({ + path: `/product/${product.id}`, + description: product.description, + title: product.full_name, + }); +} + +let successCount = 0; +let errorCount = 0; + +for (const route of allRoutes) { + try { + // Заменяем мета-теги + let html = baseHtml + .replace( + /.*?<\/title>/, + `<title>${escapeHtml(route.title)}`, + ) + .replace( + //, + ``, + ); + + // Добавляем Open Graph теги (для соцсетей) + html = html.replace( + "", + ` + + + +`, ); - - // Определяем путь для сохранения - let outputPath; - if (route === '/') { - outputPath = indexHtmlPath; - } else { - const routeDir = resolve(distPath, route.substring(1)); - if (!existsSync(routeDir)) { - mkdirSync(routeDir, { recursive: true }); - } - outputPath = resolve(routeDir, 'index.html'); - } - - writeFileSync(outputPath, html); - console.log(`✅ ${route} → ${outputPath}`); -}); -console.log('✨ Done!'); \ No newline at end of file + // Определяем путь для сохранения + let outputPath; + if (route.path === "/") { + outputPath = indexHtmlPath; + } else { + const routeDir = resolve(distPath, route.path.substring(1)); + if (!existsSync(routeDir)) { + mkdirSync(routeDir, { recursive: true }); + } + outputPath = resolve(routeDir, "index.html"); + } + + writeFileSync(outputPath, html); + console.log(`✅ ${route.path} → ${outputPath}`); + successCount++; + } catch (error) { + console.error(`❌ Ошибка при генерации ${route.path}:`, error.message); + errorCount++; + } +} + +const urls = allRoutes.map(route => ({ + url: route.path, + lastmod: new Date().toISOString().split('T')[0], + priority: route.path === '/' ? 1.0 : route.path.startsWith('/product') ? 0.8 : 0.7 + })); + + const sitemapContent = generateSitemap(urls, 'https://pvh.projects.rustprogersteam.ru'); // замените на ваш домен + const sitemapPath = resolve(distPath, 'sitemap.xml'); + writeFileSync(sitemapPath, sitemapContent); + console.log(`\n🗺️ Sitemap создан: ${sitemapPath}`); + + +// ============================================ +// ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ +// ============================================ + +function escapeHtml(text) { + return text + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); +} + +function generateSitemap(urls, baseUrl) { + return ` + +${urls.map(item => ` + ${baseUrl}${item.url} + ${item.lastmod} + ${item.priority} + `).join('\n')} +`; +} + +console.log("✨ Done!");