הסבר מקיף בעברית — מה זה, למה זה חשוב, ואיך זה משפיע על האתר שלך
מה קרה פה? Opus בנה את ה-Next.js migration. אחרי שה-build היה מוכן, 4 סוכני בדיקה (Claude Sonnet) בדקו את הקוד בארבעה ממדים שונים — ארכיטקטורה, SEO, ביצועים ואבטחה. Opus קרא את כל הדוחות וסינתז את הממצאים.
Build נקי — אבל לא ready for production. האתר נבנה בהצלחה ועובד, אבל יש בעיות שמחייבות תיקון לפני שפותחים לציבור. חלקן יגרמו לנזק SEO מיידי אם ה-deploy יקרה עכשיו.
שלוש ה"חוסמות deploy" ושלוש באגי ממשק חזותיים — חייב לתקן לפני שמעלים לאוויר.
לכל דף יש תגית HTML שאומרת לגוגל "הדף הראשי שלי הוא כאן". כרגע כל דף — יהיה זה /about, /cybersecurity, /contact — אומר לגוגל "הדף הראשי שלי הוא הדף הבית".
מה גוגל תבין? שכל הדפים הם העתקים של הדף הבית. היא תוציא אותם מהאינדקס ולא תציג אותם בתוצאות חיפוש.
hreflang הוא תגית שמסמנת לגוגל "לדף הזה יש גרסה בעברית וגרסה באנגלית". כרגע כל דף מכריז שהגרסה האנגלית שלו היא /en (הדף הבית) — במקום /en/about, /en/cybersecurity וכו'.
גוגל תבין שכל הגרסאות האנגליות של כל הדפים הן אותו דף אחד. הגרסה האנגלית של האתר תיפגע לחלוטין.
טופס יצירת הקשר שלך שולח מיילים דרך שירות שנקרא web3forms. המפתח שמאמת שה-form שייך לך מוטמע בתוך הקוד שנשלח לכל דפדפן. כל מי שיפתח את DevTools יוכל לראות אותו.
עם המפתח הזה, אפשר לשלוח אינסוף מיילי ספאם לתיבת הדואר שלך, לנצל את ה-quota החודשי שלך, ולהעמיס על כתובת המייל שמקושרת לשירות.
הדפים /infrastructure-cloud, /implementation-consulting ו-/terms מציגים שני Navbars זה מתחת לזה, שני Footers, ואת ה-NeuralCanvas animation פעמיים. האתר נראה שבור.
הסיבה: קומפוננטות מסוימות עוטפות עצמן ב-PageLayout פעם שנייה, למרות ש-layout.tsx כבר מוסיף את ה-PageLayout לכל דף.
ה-CSS מגדיר שהפונט הוא Heebo (הפונט העברי הספציפי שתוכנן לאתר), אבל אין שום מקום בקוד שטוען אותו בפועל. הדפדפן נופל לפונט ברירת המחדל של המערכת: Arial בווינדוס, San Francisco במאק.
לגולשים בנייד ובווינדוס — האתר ייראה גנרי ולא מעוצב.
ה-Voice Agent (הרכיב שמאפשר שיחה קולית עם AI) הוא קובץ ענק שמכיל WebSocket, עיבוד שמע, ותקשורת עם ה-API. הוא נטען בכל דפי השירותים — DR, Cybersecurity, Infrastructure — גם אם הוא לא מוצג שם.
המשמעות: 40KB+ מיותרים לכל ביקור בכל דף שירות (למעט /chatbots שבו הוא באמת צריך).
האתר הישן ייצא לגוגל מידע מובנה (Schema.org) שמסביר לגוגל "זו חברת IT, זה כתובת המשרד, זה מספר הטלפון". זה מה שמאפשר ל-Google לפעמים להציג תוצאות עשירות — שעות פתיחה, דירוגים וכו'. בגרסה החדשה — הפונקציה קיימת אבל לא מופעלת.
הצוות הכין תשתית להגנה מתקדמת מפני הזרקת קוד זדוני (XSS). ה-nonce הוא קוד חד-פעמי שמסמן "הסקריפט הזה מאושר". הבעיה: הכינו את ה-nonce אבל לא שמו אותו על אף סקריפט. התוצאה: הגנה שמוגדרת אבל לא ממש עובדת.
ב-Next.js יש הבדל בין דפים שמוכנים מראש בשרת (מהיר, SEO טוב) לדפים שנבנים בדפדפן (איטי יותר). 13 דפים מסומנים כ"דפדפן בלבד" רק בגלל שיש בהם אנימציות קטנות. המשמעות: גוגל ומשתמשים רואים את הדף מאוחר יותר ממה שצריך.
5 דפים (AIIntegration, LLMExpertise, SIEMSolutions, PrivacyCompliance, Transformation) לא עברו המרה מלאה לעיצוב החדש. הם עדיין משתמשים בצבעי slate (slate-900, slate-950) של ה-Vite הישן, ולא בטוקני העיצוב של ה-design system החדש.
האתר הישן הגדיר 5 headers של אבטחה שמגינים על הדפדפן מפני מגוון התקפות. ב-Vercel חלקם נוצרים אוטומטית, אבל לא כולם. תיקון: 10 דקות, שורות ספורות ב-middleware.ts.
as unknown as מסתיר חוסר תאימות בקודבדף הבית, רכיב ServicePuzzleGrid מקבל נתונים עם קסטינג מאולץ — שיטה לומר לקומפיילר "תאמין לי, זה עובד". זה מסתיר חוסר תאימות אמיתי בין המבנה של הנתונים. אין crash בפועל אבל זה code smell שיקשה תחזוקה.
כל אחד מ-4 סוכני ה-Sonnet כתב דוח מפורט. ניתן לקרוא כל אחד בנפרד:
אופוס יכול לתקן אוטונומית את רוב הבעיות (~1.5 שעות): כפל ה-PageLayout, הפונטים, ה-VoiceAgent, ה-security headers, ועוד. הדברים שדורשים החלטה שלך מפורטים בלשונית הבאה.
אופוס יכול לתקן את רוב הבעיות אוטומטית ובלי שאלות. אבל יש 6 החלטות ארכיטקטוניות שהסמכות לגביהן היא שלך — כי כל אחת היא החלטה על כיוון, לא רק תיקון באג.
next/font/google עם Heebo + Interה-6 החלטות הבאות הן Track B — הדברים שדורשים אותך:
buildPageSchema() כבר קיימת בגרסה החדשה, רק צריך לחבר אותה. איך?אפשר לאשר את הכל בפעם אחת (Track A אוטומטי + התחלה של Track B) או לאשר רק Track A ולתת לך זמן לחשוב על ה-6 החלטות. אין לחץ — Track A לבד כבר ייצר שיפור גדול.
שאלת שלוש שאלות חשובות:
המסמך הזה עונה על שלושתן בעברית מלאה ובהסבר מהבסיס. הוא מניח שאין לך רקע טכני מוקדם, ובונה את ההבנה שכבה אחרי שכבה.
1. אין צורך לבנות את האתר מחדש. הסטאק הנוכחי שלך מודרני ומצוין.
2. SEO לא דורש Node.js או Next.js. יש פתרון פשוט בהרבה שנקרא pre-rendering.
3. תוספת עברית/אנגלית היא 7-9 שעות עבודה ממוקדת על הסטאק הקיים.
4. הוספת pre-rendering היא 2-3 שעות נוספות ופותרת 95% מבעיות ה-SEO.
5. סה"כ ~10-12 שעות עבודה במקום rewrite של 60-80 שעות לסטאק חדש.
לפני שנכנסים ל-SEO, חשוב להבין מה קורה כשמישהו פותח אתר. נחלק את התהליך לשלבים:
זה התהליך הבסיסי. בשנות ה-90 ובתחילת שנות ה-2000, ה-HTML שהשרת היה מחזיר היה מלא ומוכן — עם כל הטקסט, התמונות והקישורים. הדפדפן רק היה צריך "לצייר" אותו.
JavaScript זאת שפת תכנות שרצה בתוך הדפדפן של המשתמש. במקום שהשרת ייצור את כל ה-HTML מראש, אפשר לשלוח HTML חלקי, ולתת ל-JavaScript להשלים את שאר התוכן בזמן ריצה.
זה פתח אפשרויות מטורפות:
אבל זה גם יצר בעיה חדשה — שאליה נגיע בעוד רגע.
| שיטה | איך זה עובד? | דוגמאות |
|---|---|---|
| אתר סטטי קלאסי | השרת מחזיר HTML מלא ומוכן לכל דף | בלוג WordPress פשוט, דפי נחיתה |
| SPA (אפליקציית עמוד יחיד) | השרת מחזיר HTML ריק + JavaScript. ה-JS מצייר הכל | Gmail, Facebook, האתר שלך כרגע |
| SSR (רינדור בצד השרת) | השרת מריץ את ה-JS בעצמו ומחזיר HTML מוכן | אתרים שנבנו עם Next.js, Nuxt |
SEO זה ראשי תיבות של Search Engine Optimization — אופטימיזציה למנועי חיפוש. בעברית פשוטה: הפעולות שאנחנו עושים כדי שהאתר שלנו יופיע גבוה בתוצאות החיפוש של גוגל.
גוגל מפעילה תוכנה שנקראת crawler (זוחל) או spider (עכביש). מה היא עושה?
כשמישהו מחפש "חברת אבטחת מידע בישראל", גוגל לא מחפשת אז את האתרים — היא מחפשת באינדקס שכבר בנתה. ככל שהיא הבינה את האתר שלך טוב יותר, ככה היא תדע מתי להחזיר אותו בתוצאות.
האתר שלך כבר עושה הרבה מהדברים האלה נכון: יש PageSEO component מסודר, schema.org markup, sitemap.xml, robots.txt, ו-Open Graph tags. הבעיה היחידה היא שהמידע הזה ב-JavaScript ולא ב-HTML הראשוני — וזה מה שננסה לתקן.
האתר שלך נבנה ב-React עם Vite. זאת ארכיטקטורת SPA. בואי נראה בפועל מה השרת שלך מחזיר כשמישהו מבקש את הדף הבית:
<!DOCTYPE html>
<html lang="he" dir="rtl">
<head>
<meta charset="UTF-8">
<title>Plan-B Systems</title>
</head>
<body>
<div id="root"></div> ← קופסה ריקה!
<script src="/main.js"></script>
</body>
</html>
שים לב לשתי נקודות קריטיות:
<div id="root"></div> — הקופסה הזאת ריקה לחלוטין. אין שם תוכן.<script src="/main.js"></script> — הקובץ הזה הוא ה-JavaScript של React. רק כשהוא יורד, מתפענח, ורץ — הוא ייצור את כל התוכן של האתר וישים אותו בתוך ה-div הריק.סה"כ: כ-850ms עד שהדף מוכן. למשתמש זה נראה כמו רגע — ב-200ms הוא רואה אנימציה של טעינה, וב-850ms הכל קופץ. זה מהיר מספיק.
הנה הבעיה הענקית: חלק מהרובוטים לא מחכים. הם פותחים את ה-HTML, רואים div ריק, ו... זהו. זה מה שהם רואים. הם לא מבינים שיש עוד תוכן שעומד להגיע.
חשוב להבין שלא כל הרובוטים זהים. בואי נחלק אותם לשלוש קבוצות:
גוגל ו-Bing מסוגלים להריץ JavaScript. כשהרובוט שלהם מגיע לאתר שלך:
גם גוגל לא תמיד מצליחה לרנדר JavaScript בצורה מושלמת. אם האתר שלך איטי, או דורש קריאות API, או מסתמך על cookies, או יש בו אנימציות מורכבות — לפעמים גוגל "מוותרת" באמצע ולא מאנדקסת את כל התוכן.
בנוסף, יש "תור" של דפים לרינדור — לפעמים גוגל רואה את ה-HTML הריק קודם, מאנדקסת אותו ככה, ורק אחרי ימים-שבועות חוזרת לרנדר. זה נקרא Two-pass indexing.
פייסבוק, וואטסאפ, לינקדאין, טוויטר/X, טלגרם, סלאק, דיסקורד — כולם משתמשים ברובוטים שונים שנקראים scrapers. הרובוטים האלה בכוונה לא מריצים JavaScript:
הם פשוט מורידים את ה-HTML הראשוני, מחפשים בו את ה-meta tags, ובונים מהם תצוגה מקדימה.
DuckDuckGo, Yandex (רוסי), Baidu (סיני), Naver (קוריאני) — תמיכה חלקית או לא קיימת ב-JS.
AI crawlers כמו GPTBot של OpenAI, ClaudeBot, PerplexityBot — חלקם מריצים JS, חלקם לא. בעידן שבו אנשים שואלים את ChatGPT ו-Perplexity במקום לחפש בגוגל, זה הופך להיות קריטי יותר ויותר.
זה התרחיש שיגרום לך הכי הרבה כאב, אז בואי נדגים אותו בפועל:
בלי pre-rendering — מה הם רואים:
עם pre-rendering — מה הם רואים:
ההבדל הוא תהומי. בתרחיש הראשון, הלקוח כנראה לא יקליק. בתרחיש השני, יש לך הזדמנות.
וזה לא רק וואטסאפ. אותו דבר קורה ב:
Pre-rendering, בעברית: "רינדור מראש", זאת טכניקה שבה אנחנו מצלמים את הדפים שלנו פעם אחת בזמן ה-build, ושומרים את התוצאה כקבצי HTML מלאים.
נניח שעכשיו אתה מריץ npm run build. מה שקורה היום:
index.html אחד עם div ריקdist/עם pre-rendering, נוסיפים שלב חמישי:
/, /about, /cybersecurity, וכו'index.html ריק אחד, יש לך עכשיו 55 קבצי HTML מלאיםdist/
├── index.html ← דף הבית, מלא בתוכן
├── about/
│ └── index.html ← דף "אודות", מלא
├── ai-automation/
│ ├── index.html ← דף AI ראשי, מלא
│ ├── integrations/
│ │ └── index.html ← תת-דף, מלא
│ └── rag-knowledge-systems/
│ └── index.html ← תת-דף, מלא
├── cybersecurity/
│ ├── index.html
│ ├── siem-soc/index.html
│ └── compliance-privacy/index.html
└── ... (עוד 45 דפים)
כש-WhatsApp או פייסבוק מבקשים את הדף /cybersecurity/siem-soc, השרת מחזיר את הקובץ cybersecurity/siem-soc/index.html, שכולל את כל ה-HTML המלא:
<!DOCTYPE html>
<html lang="he" dir="rtl">
<head>
<title>פתרונות SIEM ו-SOC | Plan-B Systems</title>
<meta name="description" content="פלטפורמות SIEM מתקדמות...">
<meta property="og:title" content="פתרונות SIEM ו-SOC">
<meta property="og:image" content="...">
</head>
<body>
<div id="root">
<header>...</header>
<main>
<h1>פתרונות SIEM ו-SOC לארגונים</h1>
<p>ניטור אבטחה 24/7...</p>
<!-- כל התוכן של הדף, מוכן וכתוב כאן -->
</main>
<footer>...</footer>
</div>
<script src="/main.js"></script>
</body>
</html>
גם הם מרוויחים. הדפדפן שלהם:
בלי הידרציה, ה-React היה מוחק את כל ה-HTML שצוייר מראש ובונה אותו מחדש — מה שהיה הופך את ה-pre-rendering לחסר משמעות. אבל React מבין מתי יש HTML קיים שתואם, ופשוט "נדבק" אליו.
ב-build time (פעם אחת):
בזמן ריצה (כל ביקור):
זה החלק הכי חשוב להבין, כי הוא חוסך לך עבודה של חודש. בואי נשווה את שלוש הגישות שכולן פותרות את בעיית ה-SEO:
| גישה | איך זה עובד | איפה ה-HTML נוצר | מתי? |
|---|---|---|---|
| SPA רגיל (היום) | JS רץ בדפדפן ובונה את הדף | בדפדפן של המשתמש | בכל ביקור |
| SSR (Next.js) | שרת Node.js רץ על React ויוצר HTML | בשרת בענן | בכל ביקור |
| SSG / Pre-rendering | HTML נוצר פעם אחת בזמן ה-build | במחשב המפתח (אצלך) | פעם אחת, ב-build |
Next.js זאת framework מצויינת, אבל היא נבנתה לפתור בעיות שלך אין:
| פיצ'ר של Next.js | מתי הוא רלוונטי | אצלך? |
|---|---|---|
| SSR בכל בקשה | כשהתוכן משתנה לכל משתמש (Twitter, Facebook) | לא |
| API routes | כשצריך backend על אותו codebase | לא |
| ISR (Incremental Static Regeneration) | כשיש המון תוכן שמתעדכן (אתר חדשות) | לא |
| Authentication מובנה | כשיש מערכת משתמשים | לא |
| Image optimization | תמיד שימושי | חלקי — Vite יודע גם |
| i18n routing מובנה | כשיש כמה שפות | כן — תועיל |
אף אחד מאלה לא רלוונטי לאתר שיווקי B2B כמו שלך.
חקרתי את הקוד שלך כדי להעריך עד כמה הוא מתאים ל-pre-rendering. הנה מה שמצאתי:
| מדד | ערך | השפעה על pre-rendering |
|---|---|---|
| סה"כ דפים סטטיים | 23 קבצי .tsx ב-src/pages/ |
מצוין — מספר ידוע מראש |
Slugs דינמיים ב-siteStructure.ts |
32 (קטגוריות + שירותים) | מצוין — כולם הארדקודד, ניתנים לחיזוי |
| סה"כ דפים אחרי build | ~55 דפים | סביר ל-pre-rendering |
| קריאות API לתוכן | אין | מצוין — תוכן סטטי |
useEffect שמביא תוכן |
אין (יש רק לאינטראקציה) | מצוין |
שימוש ב-react-helmet-async |
כן, רכיב PageSEO מסודר |
מצוין — meta tags כבר מוכנים |
| אנימציות framer-motion | הרבה (lazy load, AnimatePresence) | דורש זהירות בזמן ה-prerender |
| Lazy loading של דפים | כן, כולם React.lazy |
דורש המתנה לטעינה |
האתר שלך נבנה כאילו בכוונה כדי להיות מתאים ל-pre-rendering. כל התוכן הוא סטטי, נמצא בקבצי TypeScript, ולא נדרשת קריאת API בזמן ריצה. שני הסיכונים היחידים — אנימציות ו-lazy loading — הם פתירים בקלות.
הנה הרשימה המלאה של הדפים שייווצרו ב-pre-rendering:
/
/ai-automation
/infrastructure-cloud
/cybersecurity
/dr-bcp
/implementation-consulting
/about
/contact
/terms
/privacy
/accessibility
/ai-automation/integrations
/ai-automation/rag-knowledge-systems
/cybersecurity/siem-soc
/cybersecurity/compliance-privacy
/implementation-consulting/digital-transformation
נוצרים אוטומטית מ-siteStructure.ts, לפי הדפוס /:categorySlug/:serviceSlug
/about-review/luxury, /about-review/human, /about-review/notes
/terms-review/future-ready, /terms-review/current-site, /terms-review/notes
(אלה כנראה לא צריכים pre-rendering — הם פנימיים)
סה"כ ל-pre-rendering: ~47 דפים ציבוריים.
יש כמה ספריות שעושות pre-rendering ל-Vite. נסקור אותן מהקלות ביותר לכבדות:
איך זה עובד: מתקין plugin אחד ב-vite.config.ts, נותן רשימת routes, ובכל פעם שאתה רץ build — ה-plugin מפעיל Puppeteer ויוצר HTML לכל route.
יתרונות: פשוט, מתחבר לסטאק הקיים, אפס שינוי בקוד.
חסרונות: פחות מתוחזק, לפעמים בעיות עם dependencies חדשים.
מתאים אם: רוצים פתרון מהיר, פשוט, וקל לתחזוקה.
איך זה עובד: רץ אחרי ה-build הרגיל. סקריפט npm נפרד שלוקח את התיקייה dist/ ויוצר ממנה גרסה pre-rendered.
יתרונות: בוגר, יציב, הרבה תיעוד, עובד עם כל framework.
חסרונות: פותח לא מתוחזק כבר כמה שנים, לא תומך ב-Tailwind v4 בצורה מושלמת בלי tweaks.
מתאים אם: רוצים פתרון אמין שכבר עבד באלפי פרויקטים.
איך זה עובד: מסגרת מלאה על Vite שמאפשרת SSG, SSR, או mix. דורשת קצת ארגון מחדש של הקוד (לכל route יש קובץ +Page.tsx במקום מבנה react-router רגיל).
יתרונות: חזק מאוד, מאפשר לעבור בעתיד ל-SSR אמיתי בלי rewrite, מתוחזק פעיל, מודרני.
חסרונות: דורש שינוי מבנה הראוטים, עקומת למידה.
מתאים אם: רוצים פתרון "נצחי" שלא יצטרך להיזרק בעתיד.
איך זה עובד: כותבים סקריפט פשוט ב-Node.js שמשתמש ב-Puppeteer/Playwright, ניגש לכל route ב-localhost, שומר את ה-HTML לקובץ.
יתרונות: שליטה מלאה, אפס תלות בספריות צד שלישי.
חסרונות: צריך לתחזק בעצמך, מקרי קצה (anchor links, redirects, 404s).
מתאים אם: יש לכם ניסיון ב-Puppeteer.
התחל עם אופציה 1 (vite-plugin-prerender-spa). אם מתעוררות בעיות, נעבור ל-אופציה 4 (סקריפט מותאם). לא הייתי הולך על Vike בשלב הזה — עקומת הלמידה לא משתלמת רק בשביל pre-rendering.
שום פתרון הוא לא קסם. הנה מה שצריך לדעת מראש:
הבעיה: כש-Puppeteer "מצלם" את הדף, האנימציות עלולות להיות באמצע. אז ה-HTML שנשמר עלול להראות אלמנטים שקופים, או באמצע התקרבות, או לא מוצגים בכלל.
הפתרון:
animationComplete flag)שעות עבודה: ~30-60 דקות.
הבעיה: יש לך React.lazy על כל הדפים. זה אומר שהקוד שלהם נטען רק אחרי שה-React מתחיל. ב-pre-render, צריך לוודא שכל ה-lazy chunks ירדו ויטענו לפני הצילום.
הפתרון: Puppeteer יכול לחכות ל-networkidle או ל-selector ספציפי. רוב הכלים עושים את זה אוטומטית.
שעות עבודה: ~15-30 דקות הגדרה.
הבעיה: במקום build של ~30 שניות, ייקח ~3-5 דקות (כי הדפדפן הווירטואלי צריך לבקר ב-47 דפים, כל אחד נטען 1-3 שניות).
הפתרון: זה לא באמת בעיה — build רץ פעם בכמה ימים, וגם CI/CD מסוגלים לזה.
הבעיה: אם בעתיד תוסיף דפים שמותאמים אישית (Dashboard למשתמש מחובר, מחירים לפי מטבע מקומי) — pre-rendering לא יעבוד עליהם.
הפתרון: פשוט לא לעשות pre-render לדפים האלה — להשאיר אותם כ-SPA. פשרה הגיונית.
הבעיה: אם מתקן typo בקובץ siteStructure.ts, צריך לעשות build חדש. גוגל לא תראה את התיקון מיד.
הפתרון: זה כבר המצב היום אצלך. אין הבדל.
הבעיה: אם הקוד שלך קורא מ-localStorage או cookies בזמן רינדור (למשל, "הציג שפה לפי העדפה שמורה") — ב-pre-render אין כאלה!
הפתרון: לעטוף קריאות localStorage ב-typeof window !== 'undefined' ולהציג ברירת מחדל.
שעות עבודה: ~30 דקות לסקירה ותיקון.
| סיכון | חומרה | עלות תיקון |
|---|---|---|
| אנימציות תקועות | בינונית | 30-60 דק' |
| Lazy loading | נמוכה | 15-30 דק' |
| זמן build | זניחה | 0 |
| דפים מותאמים | לא רלוונטי | 0 |
| שינויי תוכן | לא רלוונטי | 0 |
| cookies/localStorage | בינונית | 30 דק' |
זאת הייתה השאלה המקורית שלך. בואי נראה איך i18n (תמיכה בכמה שפות) ו-pre-rendering עובדים יחד.
זאת הספרייה הנפוצה ביותר ב-React לתרגומים. מה שהיא עושה:
<h1>ברוכים הבאים</h1>), קוראים למפתח (<h1>{t('home.welcome')}</h1>)he.json ו-en.json — בכל אחד את אותם מפתחות עם תרגוםלפני:
function Hero() {
return (
<section>
<h1>פתרונות AI ואבטחת מידע</h1>
<p>מובילים את הטרנספורמציה הדיגיטלית</p>
</section>
);
}
אחרי:
import { useTranslation } from 'react-i18next';
function Hero() {
const { t } = useTranslation();
return (
<section>
<h1>{t('home.hero.title')}</h1>
<p>{t('home.hero.subtitle')}</p>
</section>
);
}
קובץ he.json:
{
"home": {
"hero": {
"title": "פתרונות AI ואבטחת מידע",
"subtitle": "מובילים את הטרנספורמציה הדיגיטלית"
}
}
}
קובץ en.json:
{
"home": {
"hero": {
"title": "AI Solutions and Cybersecurity",
"subtitle": "Leading digital transformation"
}
}
}
planbdev.net/ ← עברית (ברירת מחדל)
planbdev.net/about ← עברית
planbdev.net/en/ ← אנגלית
planbdev.net/en/about ← אנגלית
יתרונות: כל שפה זה URL נפרד, גוגל רואה שני אתרים עצמאיים, אפשר לשתף קישור באנגלית בלי שיקפוץ לעברית.
planbdev.net/?lang=he
planbdev.net/?lang=en
חסרונות: גוגל רואה רק URL אחד, פחות טוב ל-SEO. לא מומלץ.
אם תבחר ב-Pattern א' (URL prefix), ה-pre-rendering יצטרך לרנדר גם את הגרסה העברית וגם את האנגלית של כל דף:
dist/
├── index.html ← עברית
├── about/index.html ← עברית
├── en/
│ ├── index.html ← English
│ └── about/index.html ← English
└── ... (סה"כ ~94 קבצים: 47 עברית + 47 אנגלית)
הכלי שתבחר (vite-plugin-prerender-spa או אחר) יקבל פשוט רשימה של 94 routes במקום 47, ויעבור על כולם.
<link rel="alternate" hreflang="en" href="..."> בכל דף, כדי שגוגל יבין שהדפים קשוריםhtml[lang]dir="rtl" בעברית, dir="ltr" באנגליתleft-4 ו-right-4, להשתמש ב-start-4 ו-end-4 (התומכות ב-RTL/LTR אוטומטית)ArrowLeft בעברית הופך להיות ArrowRight כי כיוון הקריאה הפוךלהלן תכנית מסודרת, לפי סדר ביצוע מומלץ:
react-i18next + i18next-browser-languagedetectori18n.ts עם config/en/*vite-plugin-prerender-spavite.config.ts עם רשימת routessiteStructure.ts (כל הקטגוריות + שירותים, כפול 2 לשפות)sitemap.xml לכלול גם דפים באנגליתבמקום ~60-80 שעות של rewrite ל-Next.js. תקבל את אותה איכות SEO, יותר גמישות, ובמחיר הוסטינג סטטי במקום שרת.
xhtml:link שמקשרות בין הגרסאות.האתר שלך מתאים מצוין ל-pre-rendering, לא צריך לבנות אותו מחדש בטכנולוגיה אחרת, ולא צריך Next.js או Node.js בשביל SEO מעולה. תכנית: קודם i18n (7-9 שעות), אחרי זה pre-rendering (2-3 שעות), ויש לך אתר שמופיע יפה בכל מקום (גוגל, וואטסאפ, לינקדאין, AI crawlers) — בלי לשנות סטאק ובלי תוספת בעלויות הוסטינג.
/en/ (מומלץ) או /?lang=envite-plugin-prerender-spa (מומלץ) או אחר