Skip to content

Commit

Permalink
feat: support for prerendering route page
Browse files Browse the repository at this point in the history
  • Loading branch information
JulianCataldo committed Jun 8, 2024
1 parent f1ad2cc commit 72b0079
Show file tree
Hide file tree
Showing 7 changed files with 40 additions and 20 deletions.
12 changes: 7 additions & 5 deletions packages/engine/src/build/static.ts
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ export async function renderRoutes({
serverMode,
});

const htmlString = output ? await streamToString(output) : '';
const htmlString = output ? await streamToString(output) : null;

const existing = renderedRoutes.find(
(rendered) => rendered?.name === name,
Expand All @@ -133,16 +133,18 @@ export async function renderRoutes({
`${c.red(`"${existing.name}" page was defined twice!`)}\n`,
);

renderedRoutes.push({
const savePrerender = routeModule.prerender || null;
const rendered = {
// NOTE:
// Vite's internal build-html plugin only expects *absolute* ids.
// See https://github.com/vitejs/vite/issues/13406#issuecomment-1801659561

absoluteId: join(root, name),

name,
html: htmlString,
savePrerender: route.prerender,
});
savePrerender,
} satisfies RenderedRouteDefinition;
renderedRoutes.push(rendered);
}),
);
}),
Expand Down
4 changes: 3 additions & 1 deletion packages/engine/src/render/route-template.ts
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,9 @@ export async function renderRouteTemplate({
if (
(serverMode === false && routeInfos.routeModule.template) ||
//
(serverMode && routeInfos.routeModule.template && mode !== 'build')
(serverMode &&
routeInfos.routeModule.template &&
(mode !== 'build' || routeInfos.routeModule.prerender === true))
) {
const routeOutput = await Promise.resolve(
routeInfos.routeModule.template?.(context),
Expand Down
4 changes: 2 additions & 2 deletions packages/engine/src/routes/collect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,8 @@ export async function collectRoutes(

hasParams: routeWithPatterns.hasParams,
pageAssets: [],
// NOTE: Not implemented!
prerender: null,
// NOTE: Not implemented here!
// prerender: null,
});
});

Expand Down
2 changes: 1 addition & 1 deletion packages/engine/src/routes/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ export interface Route {
pattern: URLPattern;
hasParams: boolean;
pageAssets: string[];
prerender: boolean | null;
// prerender: boolean | null;
}

// -----------------------------------------------------------------------------
Expand Down
5 changes: 3 additions & 2 deletions packages/engine/src/server/request.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ export function createGracileMiddleware({
// Typing workaround
if (!req.url) throw Error('Incorrect url');
if (!req.method) throw Error('Incorrect method');
const nodeRequest = { ...req, url: req.url, method: req.method };

logger.info(`[${c.yellow(req.method)}] ${c.yellow(req.url)}`, {
timestamp: true,
Expand All @@ -71,7 +70,9 @@ export function createGracileMiddleware({
return next();

const requestPonyfilled = (await Promise.resolve(
adapter.handleNodeRequest(nodeRequest),
adapter.handleNodeRequest(
req as IncomingMessage & { url: string; method: string },
),
)) as unknown as Request;

async function renderPageFn(
Expand Down
17 changes: 11 additions & 6 deletions packages/engine/src/vite/plugins/build-routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,11 @@ export const buildRoutes = async ({
serverMode,
root,
});
const inputList = renderedRoutes.map((input) => input.name);

const inputList = renderedRoutes
.filter((i) => i.html)
.map((input) => input.name);

return {
routes,
renderedRoutes,
Expand Down Expand Up @@ -64,7 +68,8 @@ export const buildRoutes = async ({
resolveId(id) {
if (id.endsWith('.html')) {
const input = renderedRoutes.find((i) => i.name === id);
return input ? input.absoluteId : null;

if (input) return input.absoluteId;
}
return null;
},
Expand Down Expand Up @@ -111,13 +116,13 @@ export const buildRoutes = async ({
const route = renderedRoutes.find((r) => {
return r.name === fileKey;
});
if (route) {
route.handlerAssets = collectedAssets;
}
if (route) route.handlerAssets = collectedAssets;

if (route?.savePrerender !== true)
if (route?.savePrerender !== true) {
// eslint-disable-next-line no-param-reassign, @typescript-eslint/no-dynamic-delete
delete bundle[fileKey];
if (route?.html) route.html = null;
}
}
}
},
Expand Down
16 changes: 13 additions & 3 deletions packages/engine/src/vite/plugins/virtual-routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,16 @@ export function virtualRoutes({
const virtualModuleId = 'gracile:routes';
const resolvedVirtualModuleId = `\0${virtualModuleId}`;

// TODO: Remove handler when prerendering route
const routesWithoutPrerender = [...routes];
const renderedRoutesWithoutPrerender = renderedRoutes;
// const routesWithoutPrerender = [...routes].filter(
// ([, r]) => r.prerender !== true,
// );
// const renderedRoutesWithoutPrerender = renderedRoutes.filter(
// (r) => r.savePrerender !== true,
// );

return [
{
name: 'gracile-server-routes',
Expand All @@ -29,11 +39,11 @@ export function virtualRoutes({
load(id) {
if (id === resolvedVirtualModuleId) {
return `
const routes = new Map(${JSON.stringify([...routes], null, 2)})
const routes = new Map(${JSON.stringify(routesWithoutPrerender, null, 2)})
const routeImports = new Map(
[
${[...routes]
${routesWithoutPrerender
.map(
([pattern, route]) =>
`['${pattern}', () => import('/${route.filePath}')],`,
Expand All @@ -44,7 +54,7 @@ const routeImports = new Map(
const routeAssets = new Map(${JSON.stringify(
[
...renderedRoutes.map((r) => [
...renderedRoutesWithoutPrerender.map((r) => [
`/${r.name.replace(/index\.html$/, '')}`,
r.handlerAssets,
]),
Expand Down

0 comments on commit 72b0079

Please sign in to comment.