Refactor SSR strategy. Redirect before bundling any page component. Additional bugfixes for dev environment

This commit is contained in:
2026-04-12 16:20:16 +01:00
parent 84d490b189
commit f0aae8a8fa
27 changed files with 210 additions and 87 deletions
+1 -1
View File
@@ -8,5 +8,5 @@ type Params = {
skip_server_res?: boolean;
is_hydration?: boolean;
};
export default function grabPageComponent(params: Params): Promise<GrabPageComponentRes>;
export default function grabPageComponent(params: Params): Promise<GrabPageComponentRes | Response>;
export {};
+9 -4
View File
@@ -5,6 +5,7 @@ import { log } from "../../../utils/log";
import grabPageModules from "./grab-page-modules";
import grabPageCombinedServerRes from "./grab-page-combined-server-res";
import fullRebuild from "../full-rebuild";
import serverPostBuildFn from "../server-post-build-fn";
class NotFoundError extends Error {
status = 404;
constructor(message) {
@@ -41,7 +42,6 @@ export default async function grabPageComponent(params) {
}
const bundledMap = global.BUNDLER_CTX_MAP[file_path];
if (!bundledMap?.path) {
console.log(global.BUNDLER_CTX_MAP);
const errMsg = `No Bundled File Path for this request path!`;
log.error(errMsg);
throw new Error(errMsg);
@@ -62,7 +62,7 @@ export default async function grabPageComponent(params) {
});
return { serverRes };
}
const { component, module, serverRes, root_module } = await grabPageModules({
const page_modules = await grabPageModules({
file_path,
debug,
query: match?.query,
@@ -70,7 +70,10 @@ export default async function grabPageComponent(params) {
url,
skip_server_res,
});
global.IS_404_PAGE = false;
if (page_modules instanceof Response) {
return page_modules;
}
const { component, module, serverRes, root_module } = page_modules;
return {
component,
serverRes,
@@ -94,8 +97,10 @@ export default async function grabPageComponent(params) {
...params,
retry: true,
});
if (component_retried.success) {
if (component_retried instanceof Response ||
component_retried.success) {
global.REBUILD_RETRIES = 0;
await serverPostBuildFn();
return component_retried;
}
}
@@ -5,5 +5,5 @@ type Params = {
is404?: boolean;
url?: URL;
};
export default function grabPageErrorComponent({ error, routeParams, is404, url, }: Params): Promise<GrabPageComponentRes>;
export default function grabPageErrorComponent({ error, routeParams, is404, url, }: Params): Promise<GrabPageComponentRes | Response>;
export {};
@@ -31,12 +31,16 @@ export default async function grabPageErrorComponent({ error, routeParams, is404
}
const file_path = match.filePath;
const bundledMap = global.BUNDLER_CTX_MAP?.[file_path];
const { component, module, serverRes, root_module } = await grabPageModules({
const page_component = await grabPageModules({
file_path: file_path,
query: match?.query,
routeParams,
url,
});
if (page_component instanceof Response) {
return page_component;
}
const { component, module, serverRes, root_module } = page_component;
return {
component,
routeParams,
+7 -5
View File
@@ -1,4 +1,5 @@
import type { BunextPageModule, BunxRouteParams } from "../../../types";
import type { BunextPageModule, BunextPageModuleServerReturn, BunxRouteParams } from "../../../types";
import type { FC } from "react";
type Params = {
file_path: string;
debug?: boolean;
@@ -7,10 +8,11 @@ type Params = {
routeParams?: BunxRouteParams;
skip_server_res?: boolean;
};
export default function grabPageModules({ file_path, debug, url, query, routeParams, skip_server_res, }: Params): Promise<{
component: import("react").FC;
serverRes: import("../../../types").BunextPageModuleServerReturn | undefined;
type Return = {
component: FC;
serverRes: BunextPageModuleServerReturn | undefined;
module: BunextPageModule;
root_module: BunextPageModule | undefined;
}>;
};
export default function grabPageModules({ file_path, debug, url, query, routeParams, skip_server_res, }: Params): Promise<Return | Response>;
export {};
+13 -8
View File
@@ -5,14 +5,6 @@ import grabRootFilePath from "./grab-root-file-path";
import grabPageCombinedServerRes from "./grab-page-combined-server-res";
export default async function grabPageModules({ file_path, debug, url, query, routeParams, skip_server_res, }) {
const now = Date.now();
const { root_file_path } = grabRootFilePath();
const root_module = root_file_path
? await import(`${root_file_path}?t=${now}`)
: undefined;
const module = await import(`${file_path}?t=${now}`);
if (debug) {
log.info(`module:`, module);
}
const { serverRes } = skip_server_res
? {}
: await grabPageCombinedServerRes({
@@ -22,6 +14,19 @@ export default async function grabPageModules({ file_path, debug, url, query, ro
routeParams,
url,
});
if (serverRes?.redirect?.destination) {
return Response.redirect(serverRes.redirect.destination, serverRes.redirect.permanent
? 301
: serverRes.redirect.status_code || 302);
}
const { root_file_path } = grabRootFilePath();
const root_module = root_file_path
? await import(`${root_file_path}?t=${now}`)
: undefined;
const module = await import(`${file_path}?t=${now}`);
if (debug) {
log.info(`module:`, module);
}
const { component } = (await grabPageBundledReactComponent({
file_path,
})) || {};
+6
View File
@@ -23,6 +23,9 @@ export default async function handleWebPages({ req, }) {
const componentRes = await grabPageComponent({
req,
});
if (componentRes instanceof Response) {
return componentRes;
}
return await generateWebPageResponseFromComponentReturn({
...componentRes,
});
@@ -32,6 +35,9 @@ export default async function handleWebPages({ req, }) {
const componentRes = await grabPageErrorComponent({
error,
});
if (componentRes instanceof Response) {
return componentRes;
}
return await generateWebPageResponseFromComponentReturn(componentRes);
}
}