Skip to content

Commit 78c8ccf

Browse files
Slashgearclaude
andcommitted
perf: pre-generate event pages at build time (SSG)
Add generateStaticParams() to pre-render all past event pages as static HTML, and wrap fetchEvent with React.cache() to deduplicate API calls within the same server render (page + generateMetadata). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 610e2e4 commit 78c8ccf

3 files changed

Lines changed: 12 additions & 5 deletions

File tree

app/evenement/[slug]/page.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
import { EventDetail } from '../../../modules/event/components/EventDetail';
22
import { EventMarkup } from '../../../modules/event/components/EventMarkup';
33
import React from 'react';
4-
import { parserEventIdFromSlug } from '../../../modules/event/eventSlug';
4+
import { parserEventIdFromSlug, slugEventTitle } from '../../../modules/event/eventSlug';
55
import { overrideEvent } from '../../../modules/event/overrideEvent';
66
import { fetchEvent } from '../../../modules/meetup/queries/event.api';
7+
import { fetchPastEvents } from '../../../modules/meetup/queries/past-events.api';
78
import { notFound } from 'next/navigation';
89
import { Metadata } from 'next';
910

1011
export const revalidate = 3600;
1112

13+
export async function generateStaticParams() {
14+
const events = await fetchPastEvents();
15+
return events.map((event) => ({ slug: slugEventTitle(event) }));
16+
}
17+
1218
export default async function EventPage({ params }: { params: Promise<{ slug: string }> }) {
1319
const { slug } = await params;
1420
const eventId = parserEventIdFromSlug(slug);

modules/meetup/queries/event.api.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { cache } from 'react';
12
import { gql } from 'graphql-request';
23
import { Event } from '../../event/types';
34
import { client, LYONJS_MEETUP_ID } from '../api';
@@ -32,12 +33,12 @@ const query = gql`
3233
type Response = {
3334
event: Event;
3435
};
35-
export const fetchEvent = async (id: string): Promise<Event> => {
36+
export const fetchEvent = cache(async (id: string): Promise<Event> => {
3637
const response = await client.request<Response>(query, { id });
3738

3839
if (response?.event.group.id !== `${LYONJS_MEETUP_ID}`) {
3940
throw Error(`event of id is not part of LyonJS`);
4041
}
4142

4243
return response?.event;
43-
};
44+
});

styles/globals.css

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ html {
1111
-webkit-text-size-adjust: 100%;
1212
-moz-tab-size: 4;
1313
tab-size: 4;
14-
font-family: ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',
15-
'Noto Color Emoji';
14+
font-family:
15+
ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
1616
font-feature-settings: normal;
1717
font-variation-settings: normal;
1818
}

0 commit comments

Comments
 (0)