Переглянути джерело

fix(prerender): ensure app mounts and waits for router ready before snapshot

unknown 8 годин тому
батько
коміт
e37988832f
3 змінених файлів з 18 додано та 7 видалено
  1. 6 1
      src/App.vue
  2. 9 4
      src/main.ts
  3. 3 2
      vite.config.ts

+ 6 - 1
src/App.vue

@@ -22,7 +22,12 @@ const CookieBanner = defineAsyncComponent(() => import("@/components/CookieBanne
 
 const { t, locale } = useI18n();
 const authStore = useAuthStore();
-authStore.init();
+
+// Skip auth initialization and unnecessary pings during prerendering
+const isPrerendering = (window as any).__PRERENDER_INJECTED !== undefined;
+if (!isPrerendering) {
+  authStore.init();
+}
 
 // Global SEO Defaults
 useHead({

+ 9 - 4
src/main.ts

@@ -21,7 +21,12 @@ app.use(MotionPlugin);
 app.use(router);
 app.use(i18n);
 
-app.mount("#root");
-
-// Dispatch event for prerendering
-document.dispatchEvent(new Event("render-event"));
+// Wait for router to be ready before mounting and rendering
+router.isReady().then(() => {
+  app.mount("#root");
+  
+  // Dispatch event for prerendering
+  setTimeout(() => {
+    document.dispatchEvent(new Event("render-event"));
+  }, 100);
+});

+ 3 - 2
vite.config.ts

@@ -22,13 +22,14 @@ export default defineConfig(({ mode }) => {
         '/en/contact', '/me/contact', '/ru/contact', '/ua/contact'
       ],
       renderer: new prerender.PuppeteerRenderer({
-        renderAfterTime: 5000,
+        renderAfterDocumentEvent: 'render-event',
         injectProperty: '__PRERENDER_INJECTED',
+        renderAfterTime: 2000, // Safety delay after event
         headless: true,
         args: [
           '--no-sandbox', 
           '--disable-setuid-sandbox',
-          '--disable-dev-shm-usage', // Useful for resource-constrained environments
+          '--disable-dev-shm-usage',
           '--single-process'
         ]
       })