From f2dab02db8ab00d48ea2c5bc1c08113e96872a64 Mon Sep 17 00:00:00 2001 From: Hebilicious Date: Fri, 4 Aug 2023 18:47:06 +0700 Subject: [PATCH 1/3] perf: preprend routes and trim _prerenderRoutes --- src/prerender.ts | 20 +++++++++++++------- src/utils/index.ts | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/prerender.ts b/src/prerender.ts index 8f2435626b..c9fe6e2151 100644 --- a/src/prerender.ts +++ b/src/prerender.ts @@ -7,7 +7,7 @@ import { defu } from "defu"; import { createNitro } from "./nitro"; import { build } from "./build"; import type { Nitro, NitroRouteRules, PrerenderGenerateRoute } from "./types"; -import { writeFile } from "./utils"; +import { RouteSet, writeFile } from "./utils"; import { compressPublicAssets } from "./compress"; const allowedExtensions = new Set(["", ".json"]); @@ -23,8 +23,7 @@ export async function prerender(nitro: Nitro) { } // Initial list of routes to prerender - const routes = new Set(nitro.options.prerender.routes); - + const routes = RouteSet(nitro.options.prerender.routes); // Extend with static prerender route rules const prerenderRulePaths = Object.entries(nitro.options.routeRules) .filter(([path, options]) => options.prerender && !path.includes("*")) @@ -39,7 +38,7 @@ export async function prerender(nitro: Nitro) { } // Allow extending prereneder routes - await nitro.hooks.callHook("prerender:routes", routes); + await nitro.hooks.callHook("prerender:routes", routes.getSet()); // Skip if no prerender routes specified if (routes.size === 0) { @@ -201,7 +200,10 @@ export async function prerender(nitro: Nitro) { const filePath = join(nitro.options.output.publicDir, _route.fileName); await writeFile(filePath, Buffer.from(_route.data)); - nitro._prerenderedRoutes.push(_route); + nitro._prerenderedRoutes.push({ + route: _route.route, + fileName: _route.fileName, + }); // Crawl route links if (!_route.error && isImplicitHTML) { @@ -213,7 +215,11 @@ export async function prerender(nitro: Nitro) { ); for (const _link of extractedLinks) { if (canPrerender(_link)) { - routes.add(_link); + if (_link.endsWith("_payload.json")) { + routes.prepend(_link); + } else { + routes.add(_link); + } } } } @@ -240,7 +246,7 @@ export async function prerender(nitro: Nitro) { nitro.logger.log(formatPrerenderRoute(_route)); } - await runParallel(routes, processRoute, { + await runParallel(routes.getSet(), processRoute, { concurrency: nitro.options.prerender.concurrency, interval: nitro.options.prerender.interval, }); diff --git a/src/utils/index.ts b/src/utils/index.ts index 279bb4559d..6bd7ef1bf0 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -229,3 +229,17 @@ export function provideFallbackValues(obj: Record) { } } } + +export function RouteSet(routes: string[]) { + let set = new Set(routes); + return { + size: set.size, + add: (s: string) => set.add(s), + prepend: (s: string) => { + set = new Set([s, ...set.values()]); + return set; + }, + values: set.values, + getSet: () => set, + }; +} From 64e517aec0d0e187cc619e3334a36a5f635d8958 Mon Sep 17 00:00:00 2001 From: Hebilicious Date: Sat, 5 Aug 2023 01:01:13 +0700 Subject: [PATCH 2/3] feat: remove route prepending --- src/prerender.ts | 14 +++++--------- src/utils/index.ts | 14 -------------- 2 files changed, 5 insertions(+), 23 deletions(-) diff --git a/src/prerender.ts b/src/prerender.ts index c9fe6e2151..434e7dbc00 100644 --- a/src/prerender.ts +++ b/src/prerender.ts @@ -7,7 +7,7 @@ import { defu } from "defu"; import { createNitro } from "./nitro"; import { build } from "./build"; import type { Nitro, NitroRouteRules, PrerenderGenerateRoute } from "./types"; -import { RouteSet, writeFile } from "./utils"; +import { writeFile } from "./utils"; import { compressPublicAssets } from "./compress"; const allowedExtensions = new Set(["", ".json"]); @@ -23,7 +23,7 @@ export async function prerender(nitro: Nitro) { } // Initial list of routes to prerender - const routes = RouteSet(nitro.options.prerender.routes); + const routes = new Set(nitro.options.prerender.routes); // Extend with static prerender route rules const prerenderRulePaths = Object.entries(nitro.options.routeRules) .filter(([path, options]) => options.prerender && !path.includes("*")) @@ -38,7 +38,7 @@ export async function prerender(nitro: Nitro) { } // Allow extending prereneder routes - await nitro.hooks.callHook("prerender:routes", routes.getSet()); + await nitro.hooks.callHook("prerender:routes", routes); // Skip if no prerender routes specified if (routes.size === 0) { @@ -215,11 +215,7 @@ export async function prerender(nitro: Nitro) { ); for (const _link of extractedLinks) { if (canPrerender(_link)) { - if (_link.endsWith("_payload.json")) { - routes.prepend(_link); - } else { - routes.add(_link); - } + routes.add(_link); } } } @@ -246,7 +242,7 @@ export async function prerender(nitro: Nitro) { nitro.logger.log(formatPrerenderRoute(_route)); } - await runParallel(routes.getSet(), processRoute, { + await runParallel(routes, processRoute, { concurrency: nitro.options.prerender.concurrency, interval: nitro.options.prerender.interval, }); diff --git a/src/utils/index.ts b/src/utils/index.ts index 6bd7ef1bf0..279bb4559d 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -229,17 +229,3 @@ export function provideFallbackValues(obj: Record) { } } } - -export function RouteSet(routes: string[]) { - let set = new Set(routes); - return { - size: set.size, - add: (s: string) => set.add(s), - prepend: (s: string) => { - set = new Set([s, ...set.values()]); - return set; - }, - values: set.values, - getSet: () => set, - }; -} From abd59cf572dd33f1627650f557a4865dda3c3638 Mon Sep 17 00:00:00 2001 From: Hebilicious Date: Sat, 5 Aug 2023 01:02:03 +0700 Subject: [PATCH 3/3] chore: add back whitespace --- src/prerender.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/prerender.ts b/src/prerender.ts index 434e7dbc00..3aa92c9d5c 100644 --- a/src/prerender.ts +++ b/src/prerender.ts @@ -24,6 +24,7 @@ export async function prerender(nitro: Nitro) { // Initial list of routes to prerender const routes = new Set(nitro.options.prerender.routes); + // Extend with static prerender route rules const prerenderRulePaths = Object.entries(nitro.options.routeRules) .filter(([path, options]) => options.prerender && !path.includes("*"))