From 10a7e7b8e53e2c7635e65805069ec7c6ca703de4 Mon Sep 17 00:00:00 2001 From: avivkeller Date: Sat, 18 Oct 2025 14:45:52 -0400 Subject: [PATCH 1/3] feat(cache): `use cache` more often --- apps/site/components/EOL/EOLReleaseTable/index.tsx | 2 +- apps/site/components/withSupporters.tsx | 7 ++++--- apps/site/next-data/generators/supportersData.mjs | 2 +- apps/site/next-data/providers/releaseData.ts | 4 +--- apps/site/next-data/providers/releaseVersions.ts | 8 ++------ apps/site/next-data/providers/supportersData.mjs | 9 --------- apps/site/next-data/providers/supportersData.ts | 5 +++++ apps/site/next-data/providers/vulnerabilities.ts | 8 ++------ apps/site/next.dynamic.constants.mjs | 2 +- 9 files changed, 17 insertions(+), 30 deletions(-) delete mode 100644 apps/site/next-data/providers/supportersData.mjs create mode 100644 apps/site/next-data/providers/supportersData.ts diff --git a/apps/site/components/EOL/EOLReleaseTable/index.tsx b/apps/site/components/EOL/EOLReleaseTable/index.tsx index 36ee147bf5f7c..d1e15f6dc37de 100644 --- a/apps/site/components/EOL/EOLReleaseTable/index.tsx +++ b/apps/site/components/EOL/EOLReleaseTable/index.tsx @@ -9,7 +9,7 @@ import EOLReleaseTableBody from './TableBody'; const EOLReleaseTable: FC = async () => { const releaseData = await provideReleaseData(); - const vulnerabilities = provideVulnerabilities(); + const vulnerabilities = await provideVulnerabilities(); const eolReleases = releaseData.filter( release => release.status === EOL_VERSION_IDENTIFIER diff --git a/apps/site/components/withSupporters.tsx b/apps/site/components/withSupporters.tsx index 2227e653d6385..7f931f7076072 100644 --- a/apps/site/components/withSupporters.tsx +++ b/apps/site/components/withSupporters.tsx @@ -2,12 +2,13 @@ import type { FC, PropsWithChildren } from 'react'; +import provideSupporters from '#site/next-data/providers/supportersData'; + import SupportersList from './Common/Supporters'; -import provideSupporters from '#site/next-data/providers/supportersData'; -const WithSupporters: FC = () => { - const supporters = provideSupporters(); +const WithSupporters: FC = async () => { + const supporters = await provideSupporters(); return (
diff --git a/apps/site/next-data/generators/supportersData.mjs b/apps/site/next-data/generators/supportersData.mjs index fd788a7c14074..1c1c19f15b77b 100644 --- a/apps/site/next-data/generators/supportersData.mjs +++ b/apps/site/next-data/generators/supportersData.mjs @@ -25,4 +25,4 @@ async function fetchOpenCollectiveData() { return members; } -export { fetchOpenCollectiveData }; +export default fetchOpenCollectiveData; diff --git a/apps/site/next-data/providers/releaseData.ts b/apps/site/next-data/providers/releaseData.ts index 1ccae9de036dd..c063dd8fd5ea5 100644 --- a/apps/site/next-data/providers/releaseData.ts +++ b/apps/site/next-data/providers/releaseData.ts @@ -1,7 +1,5 @@ 'use cache'; -import generateReleaseData from '#site/next-data/generators/releaseData.mjs'; - -const provideReleaseData = async () => generateReleaseData(); +import provideReleaseData from '#site/next-data/generators/releaseData.mjs'; export default provideReleaseData; diff --git a/apps/site/next-data/providers/releaseVersions.ts b/apps/site/next-data/providers/releaseVersions.ts index f7ac4d86d010d..d9aa33346dc41 100644 --- a/apps/site/next-data/providers/releaseVersions.ts +++ b/apps/site/next-data/providers/releaseVersions.ts @@ -1,9 +1,5 @@ -import { cache } from 'react'; +'use cache'; -import generateAllVersionsData from '#site/next-data/generators/releaseVersions.mjs'; - -const releaseVersions = await generateAllVersionsData(); - -const provideReleaseVersions = cache(() => releaseVersions); +import provideReleaseVersions from '#site/next-data/generators/releaseVersions.mjs'; export default provideReleaseVersions; diff --git a/apps/site/next-data/providers/supportersData.mjs b/apps/site/next-data/providers/supportersData.mjs deleted file mode 100644 index a5479b43f03e3..0000000000000 --- a/apps/site/next-data/providers/supportersData.mjs +++ /dev/null @@ -1,9 +0,0 @@ -import { cache } from 'react'; - -import { fetchOpenCollectiveData } from '#site/next-data/generators/supportersData.mjs'; - -const openCollectiveSupporters = await fetchOpenCollectiveData(); - -const provideSupporters = cache(() => openCollectiveSupporters); - -export default provideSupporters; diff --git a/apps/site/next-data/providers/supportersData.ts b/apps/site/next-data/providers/supportersData.ts new file mode 100644 index 0000000000000..e6e34a6877590 --- /dev/null +++ b/apps/site/next-data/providers/supportersData.ts @@ -0,0 +1,5 @@ +'use cache'; + +import provideSupporters from '#site/next-data/generators/supportersData.mjs'; + +export default provideSupporters; diff --git a/apps/site/next-data/providers/vulnerabilities.ts b/apps/site/next-data/providers/vulnerabilities.ts index cfc3cce008ba0..e360781eebd10 100644 --- a/apps/site/next-data/providers/vulnerabilities.ts +++ b/apps/site/next-data/providers/vulnerabilities.ts @@ -1,9 +1,5 @@ -import { cache } from 'react'; +'use cache'; -import generateVulnerabilities from '#site/next-data/generators/vulnerabilities.mjs'; - -const vulnerabilities = await generateVulnerabilities(); - -const provideVulnerabilities = cache(() => vulnerabilities); +import provideVulnerabilities from '#site/next-data/generators/vulnerabilities.mjs'; export default provideVulnerabilities; diff --git a/apps/site/next.dynamic.constants.mjs b/apps/site/next.dynamic.constants.mjs index 68860ee2e2a0f..9bfb778935761 100644 --- a/apps/site/next.dynamic.constants.mjs +++ b/apps/site/next.dynamic.constants.mjs @@ -38,7 +38,7 @@ export const BLOG_DYNAMIC_ROUTES = [ export const ARCHIVE_DYNAMIC_ROUTES = [ // Creates dynamic routes for downloads archive pages for each version // (e.g., /download/archive/v18.20.8, /download/archive/v20.19.2) - ...provideReleaseVersions(), + ...(await provideReleaseVersions()), ]; /** From 24921514cad8d752715776fd5cfd6db00665e382 Mon Sep 17 00:00:00 2001 From: avivkeller Date: Sat, 18 Oct 2025 14:50:19 -0400 Subject: [PATCH 2/3] fixup! --- apps/site/components/withSupporters.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/site/components/withSupporters.tsx b/apps/site/components/withSupporters.tsx index 7f931f7076072..6ce69110ab217 100644 --- a/apps/site/components/withSupporters.tsx +++ b/apps/site/components/withSupporters.tsx @@ -6,7 +6,6 @@ import provideSupporters from '#site/next-data/providers/supportersData'; import SupportersList from './Common/Supporters'; - const WithSupporters: FC = async () => { const supporters = await provideSupporters(); From 4d824c415c565168d8086108747380f836cac36f Mon Sep 17 00:00:00 2001 From: avivkeller Date: Sat, 18 Oct 2025 16:26:03 -0400 Subject: [PATCH 3/3] fixup! --- .../[locale]/download/archive/[version]/page.tsx | 10 +++++++--- apps/site/next.dynamic.constants.mjs | 14 -------------- 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/apps/site/app/[locale]/download/archive/[version]/page.tsx b/apps/site/app/[locale]/download/archive/[version]/page.tsx index 2fa7b6040c0cd..b82a736c14d81 100644 --- a/apps/site/app/[locale]/download/archive/[version]/page.tsx +++ b/apps/site/app/[locale]/download/archive/[version]/page.tsx @@ -2,8 +2,8 @@ import { notFound, redirect } from 'next/navigation'; import type { FC } from 'react'; import provideReleaseData from '#site/next-data/providers/releaseData'; +import provideReleaseVersions from '#site/next-data/providers/releaseVersions'; import { ENABLE_STATIC_EXPORT } from '#site/next.constants.mjs'; -import { ARCHIVE_DYNAMIC_ROUTES } from '#site/next.dynamic.constants.mjs'; import * as basePage from '#site/next.dynamic.page.mjs'; import { defaultLocale } from '#site/next.locales.mjs'; import type { DynamicParams } from '#site/types'; @@ -29,7 +29,9 @@ export const generateStaticParams = async () => { return []; } - return ARCHIVE_DYNAMIC_ROUTES.map(version => ({ + const versions = await provideReleaseVersions(); + + return versions.map(version => ({ locale: defaultLocale.code, version, })); @@ -53,8 +55,10 @@ const getPage: FC = async props => { redirect(`/${locale}/download/archive/${release?.versionWithPrefix}`); } + const versions = await provideReleaseVersions(); + // Verifies if the current route is a dynamic route - const isDynamicRoute = ARCHIVE_DYNAMIC_ROUTES.some(r => r.includes(pathname)); + const isDynamicRoute = versions.some(r => r.includes(pathname)); // Gets the Markdown content and context for Download Archive pages const [content, context] = await basePage.getMarkdownContext({ diff --git a/apps/site/next.dynamic.constants.mjs b/apps/site/next.dynamic.constants.mjs index 9bfb778935761..ce9f3128e0077 100644 --- a/apps/site/next.dynamic.constants.mjs +++ b/apps/site/next.dynamic.constants.mjs @@ -1,7 +1,6 @@ 'use strict'; import { provideBlogPosts } from '#site/next-data/providers/blogData'; -import provideReleaseVersions from '#site/next-data/providers/releaseVersions'; import { blogData } from '#site/next.json.mjs'; import { BASE_PATH, BASE_URL } from './next.constants.mjs'; @@ -28,19 +27,6 @@ export const BLOG_DYNAMIC_ROUTES = [ .flat(), ]; -/** - * This constant is used to create static routes on-the-fly that do not have a file-system - * counterpart route. This is useful for providing routes with matching Layout Names - * but that do not have Markdown content and a matching file for the route - * - * @type {Array} A Map of pathname and Layout Name - */ -export const ARCHIVE_DYNAMIC_ROUTES = [ - // Creates dynamic routes for downloads archive pages for each version - // (e.g., /download/archive/v18.20.8, /download/archive/v20.19.2) - ...(await provideReleaseVersions()), -]; - /** * This is the default Next.js Page Metadata for all pages *