diff --git a/.changeset/nasty-cougars-double.md b/.changeset/nasty-cougars-double.md new file mode 100644 index 000000000000..1f83bf9b1b73 --- /dev/null +++ b/.changeset/nasty-cougars-double.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Add caching to `getCollection()` queries for faster SSG production builds diff --git a/packages/astro/src/content/internal.ts b/packages/astro/src/content/internal.ts index bdc99bbc7414..951a52f6d235 100644 --- a/packages/astro/src/content/internal.ts +++ b/packages/astro/src/content/internal.ts @@ -38,6 +38,7 @@ export function createCollectionToGlobResultMap({ return collectionToGlobResultMap; } +const cacheEntriesByCollection = new Map(); export function createGetCollection({ collectionToEntryMap, collectionToRenderEntryMap, @@ -47,27 +48,35 @@ export function createGetCollection({ }) { return async function getCollection(collection: string, filter?: (entry: any) => unknown) { const lazyImports = Object.values(collectionToEntryMap[collection] ?? {}); - const entries = Promise.all( - lazyImports.map(async (lazyImport) => { - const entry = await lazyImport(); - return { - id: entry.id, - slug: entry.slug, - body: entry.body, - collection: entry.collection, - data: entry.data, - async render() { - return render({ - collection: entry.collection, - id: entry.id, - collectionToRenderEntryMap, - }); - }, - }; - }) - ); + let entries: any[] = []; + // Cache `getCollection()` calls in production only + // prevents stale cache in development + if (import.meta.env.PROD && cacheEntriesByCollection.has(collection)) { + entries = cacheEntriesByCollection.get(collection)!; + } else { + entries = await Promise.all( + lazyImports.map(async (lazyImport) => { + const entry = await lazyImport(); + return { + id: entry.id, + slug: entry.slug, + body: entry.body, + collection: entry.collection, + data: entry.data, + async render() { + return render({ + collection: entry.collection, + id: entry.id, + collectionToRenderEntryMap, + }); + }, + }; + }) + ); + cacheEntriesByCollection.set(collection, entries); + } if (typeof filter === 'function') { - return (await entries).filter(filter); + return entries.filter(filter); } else { return entries; }