joerglohrerde/app/svelte.config.js

49 lines
1.8 KiB
JavaScript
Raw Normal View History

import adapter from '@sveltejs/adapter-static';
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
/** @type {import('@sveltejs/kit').Config} */
const config = {
preprocess: vitePreprocess(),
compilerOptions: {
// Force runes mode for the project, except for libraries. Can be removed in svelte 6.
runes: ({ filename }) => (filename.split(/[/\\]/).includes('node_modules') ? undefined : true)
},
kit: {
adapter: adapter({
pages: 'build',
assets: 'build',
fallback: 'index.html',
precompress: false,
strict: false
}),
alias: {
$lib: 'src/lib'
fix(spa): prerender-build laeuft + meta/json-ld korrekt Drei build-blocker beim ersten prerender-versuch identifiziert und gefixt: 1. svelte.config.js: handleHttpError + handleMissingId fuer den prerender-crawler. Der crawler folgt zur build-zeit allen hrefs/srcs im HTML — sieht dabei - __SITE_URL__-platzhalter in canonical/hreflang (werden im deploy per sed ersetzt, sind keine echten routes) - relative bild-paths in alten posts (z.B. h01-json-import.png) - anchor-links auf headings ohne id-attribute (#ACF-JSON-Export) Alle drei sind keine echten 404s — handlers ignorieren sie. 2. +page.svelte: <script type="application/ld+json">{jsonLd}</script> in <svelte:head> rendert {jsonLd} als literalen string, weil svelte den script-tag-inhalt nicht als expression evaluiert. Zurueck zu {@html ...} mit </script>-escape-hardening, damit titel oder beschreibungen mit </script> den output nicht aufbrechen koennen. 3. app.html behaelt seine homepage-defaults fuer og:title/og:url/ og:description/canonical — der prerender-crawler rendert nur detail-routen (/<slug>/), die homepage bleibt SPA-only und braucht die defaults im app.html-template, weil dort kein svelte:head greift. Detail-routen ueberschreiben per <svelte:head>; last-wins greift bei LinkedIn/Mastodon/Browser. Facebook/Twitter (first-wins) haetten einen homepage-prerender-schritt noetig — folge-aufgabe. Plus snapshot/deno.lock committed — deno empfiehlt lockfile-commit fuer reproduzierbare CI-builds, analog package-lock.json. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 08:50:27 +02:00
},
prerender: {
// Der Crawler folgt zur Build-Zeit href/src-attributen im HTML. Zwei
// faelle, in denen 404er kein echter fehler sind:
//
// 1. canonical/hreflang enthalten den `__SITE_URL__`-platzhalter, der
// erst beim deploy per sed durch die echte SITE_URL ersetzt wird.
// Pfade wie `/<slug>/__SITE_URL__/` sind also pseudo-pfade.
// 2. Bild-references mit relativen pfaden (z.B. `h01-json-import.png`)
// in alten posts, die nicht zu Blossom-URLs migriert wurden — die
// sind im post-body als <img src="..."> und vom crawler verfolgte
// pseudo-routes. Die SPA selbst rendert die <img>-tags zwar, aber
// eine 404-route gibt es dafuer nicht.
handleHttpError: ({ path, message }) => {
if (path.includes('__SITE_URL__')) return;
if (/\.(png|jpe?g|gif|webp|svg|avif)\/?$/i.test(path)) return;
throw new Error(message);
},
// Markdown-headings bekommen ohne slugify-plugin keine id-attribute.
// Anchor-links in alten posts (z.B. [link](#ACF-JSON-Export)) sind
// damit zur build-zeit unauffindbar. Kein render-fehler — die SPA
// scrollt im browser entweder zum element oder garnicht.
handleMissingId: 'ignore'
}
}
};
export default config;