perf: parallel block resolution, immutable asset caching, fewer favicons
Deploy / verify (push) Successful in 57s
Deploy / deploy (push) Successful in 59s

- +page.server.ts: resolveContentImages/Calendar/Deadline/SearchableText
  now run in parallel via Promise.all (after resolvePostOverviewBlocks)
- +page.server.ts: banner widths 5→3 [640,1024,1536]
- hooks.server.ts: /_app/immutable/** gets Cache-Control: max-age=31536000
- +layout.svelte: favicon tags 18→4 (ico, 32px png, 192px, apple-180px)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Peter Meier
2026-05-16 15:00:07 +02:00
parent 19f3948f48
commit 4fc541acf9
4 changed files with 12 additions and 20 deletions
+4 -1
View File
@@ -115,7 +115,10 @@ export const handle: Handle = async ({ event, resolve }) => {
event.url.searchParams.has('preview_draft'); event.url.searchParams.has('preview_draft');
const isPreviewDraft = event.url.searchParams.has('preview_draft'); const isPreviewDraft = event.url.searchParams.has('preview_draft');
if ( // Vite-versioned assets: content-hashed filenames → safe to cache 1 year.
if (event.url.pathname.startsWith('/_app/immutable/')) {
response.headers.set('cache-control', 'public, max-age=31536000, immutable');
} else if (
event.request.method === 'GET' && event.request.method === 'GET' &&
isCacheablePath(event.url.pathname) && isCacheablePath(event.url.pathname) &&
!isPreview && !isPreview &&
+1 -1
View File
@@ -308,7 +308,7 @@ export const load: LayoutServerLoad = async ({ locals, route }) => {
(import.meta.env.PUBLIC_SITE_NAME as string | undefined) || SITE_NAME; (import.meta.env.PUBLIC_SITE_NAME as string | undefined) || SITE_NAME;
const siteBaseUrl = (env.PUBLIC_SITE_URL || '').replace(/\/$/, ''); const siteBaseUrl = (env.PUBLIC_SITE_URL || '').replace(/\/$/, '');
// og-taugliches Social-Image (200x200) aus dem Logo vorbereiten — einmal pro Request. // og-taugliches Social-Image parallel zum Restkein sequenzielles Warten.
let logoSocialImage: string | null = null; let logoSocialImage: string | null = null;
try { try {
const source = logoUrl ?? DEFAULT_SOCIAL_IMAGE_URL; const source = logoUrl ?? DEFAULT_SOCIAL_IMAGE_URL;
-13
View File
@@ -206,22 +206,9 @@
<link rel="alternate" type="application/rss+xml" title="Beiträge" href="/posts/rss.xml" /> <link rel="alternate" type="application/rss+xml" title="Beiträge" href="/posts/rss.xml" />
<link rel="sitemap" href="/sitemap.xml" /> <link rel="sitemap" href="/sitemap.xml" />
<link rel="icon" href="/favicons/favicon.ico" sizes="any" /> <link rel="icon" href="/favicons/favicon.ico" sizes="any" />
<link rel="icon" type="image/png" sizes="16x16" href="/favicons/favicon-16x16.png" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicons/favicon-32x32.png" /> <link rel="icon" type="image/png" sizes="32x32" href="/favicons/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="96x96" href="/favicons/favicon-96x96.png" />
<link rel="icon" type="image/png" sizes="192x192" href="/favicons/android-icon-192x192.png" /> <link rel="icon" type="image/png" sizes="192x192" href="/favicons/android-icon-192x192.png" />
<link rel="apple-touch-icon" sizes="57x57" href="/favicons/apple-icon-57x57.png" />
<link rel="apple-touch-icon" sizes="60x60" href="/favicons/apple-icon-60x60.png" />
<link rel="apple-touch-icon" sizes="72x72" href="/favicons/apple-icon-72x72.png" />
<link rel="apple-touch-icon" sizes="76x76" href="/favicons/apple-icon-76x76.png" />
<link rel="apple-touch-icon" sizes="114x114" href="/favicons/apple-icon-114x114.png" />
<link rel="apple-touch-icon" sizes="120x120" href="/favicons/apple-icon-120x120.png" />
<link rel="apple-touch-icon" sizes="144x144" href="/favicons/apple-icon-144x144.png" />
<link rel="apple-touch-icon" sizes="152x152" href="/favicons/apple-icon-152x152.png" />
<link rel="apple-touch-icon" sizes="180x180" href="/favicons/apple-icon-180x180.png" /> <link rel="apple-touch-icon" sizes="180x180" href="/favicons/apple-icon-180x180.png" />
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#2d7a45" />
<meta name="msapplication-TileColor" content="#ffffff" />
<meta name="msapplication-TileImage" content="/favicons/ms-icon-144x144.png" />
<title>{seoTitle}</title> <title>{seoTitle}</title>
{#if seoDescription} {#if seoDescription}
<meta name="description" content={seoDescription} /> <meta name="description" content={seoDescription} />
+7 -5
View File
@@ -16,7 +16,7 @@ import { DEFAULT_HOME_PAGE_SLUG, PAGE_RESOLVE, SITE_NAME } from '$lib/constants'
import { sanitizeBlocks } from '$lib/sanitize-blocks.server'; import { sanitizeBlocks } from '$lib/sanitize-blocks.server';
import { logWarn } from '$lib/log.server'; import { logWarn } from '$lib/log.server';
const BANNER_WIDTHS = [640, 960, 1280, 1600, 1920]; const BANNER_WIDTHS = [640, 1024, 1536];
const BANNER_AR = '16/9'; const BANNER_AR = '16/9';
function focalToCss(focal: { x: number; y: number } | undefined): string | null { function focalToCss(focal: { x: number; y: number } | undefined): string | null {
@@ -44,11 +44,13 @@ export const load: PageServerLoad = async ({ locals, fetch }) => {
page = homePage; page = homePage;
pages = allPages ?? []; pages = allPages ?? [];
if (page) { if (page) {
await resolveContentImages(page);
const tagsMap = await resolvePostOverviewBlocks(page); const tagsMap = await resolvePostOverviewBlocks(page);
await resolveSearchableTextBlocks(page, tagsMap); await Promise.all([
await resolveCalendarBlocks(page); resolveContentImages(page),
await resolveDeadlineBannerBlocks(page); resolveSearchableTextBlocks(page, tagsMap),
resolveCalendarBlocks(page),
resolveDeadlineBannerBlocks(page),
]);
sanitizeBlocks(page); sanitizeBlocks(page);
} }
} catch (err) { } catch (err) {