summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Emanuele Stoppa <my.burning@gmail.com> 2023-07-05 12:36:19 +0100
committerGravatar GitHub <noreply@github.com> 2023-07-05 12:36:19 +0100
commitcfd5b2b785ad277b82c380fdf68ead0475ddb42f (patch)
treee389cfe9dd47057872f3c6808b0ecd7b7ad3d11e
parentf820bb3f0be34da60f3674205b2f24e512c48f76 (diff)
downloadastro-cfd5b2b785ad277b82c380fdf68ead0475ddb42f.tar.gz
astro-cfd5b2b785ad277b82c380fdf68ead0475ddb42f.tar.zst
astro-cfd5b2b785ad277b82c380fdf68ead0475ddb42f.zip
refactor: use only manifest to compute information (#7571)
* refactor: use only manifest to compute information * use entry modules * revert entry modules
-rw-r--r--packages/astro/src/core/app/types.ts2
-rw-r--r--packages/astro/src/core/build/generate.ts101
2 files changed, 59 insertions, 44 deletions
diff --git a/packages/astro/src/core/app/types.ts b/packages/astro/src/core/app/types.ts
index 927da06d9..266fa9488 100644
--- a/packages/astro/src/core/app/types.ts
+++ b/packages/astro/src/core/app/types.ts
@@ -37,7 +37,7 @@ export type SSRManifest = {
adapterName: string;
routes: RouteInfo[];
site?: string;
- base?: string;
+ base: string;
compressHTML?: boolean;
assetsPrefix?: string;
markdown: MarkdownRenderingOptions;
diff --git a/packages/astro/src/core/build/generate.ts b/packages/astro/src/core/build/generate.ts
index 145fca9fd..5a91962be 100644
--- a/packages/astro/src/core/build/generate.ts
+++ b/packages/astro/src/core/build/generate.ts
@@ -155,37 +155,36 @@ export async function generatePages(opts: StaticBuildOptions, internals: BuildIn
const manifest: SSRManifest | undefined = ssrEntryPage.manifest;
const ssrEntry = manifest?.pageModule;
if (ssrEntry) {
- await generatePage(opts, internals, pageData, ssrEntry, builtPaths);
+ await generatePage(opts, internals, pageData, ssrEntry, builtPaths, manifest);
} else {
throw new Error(
`Unable to find the manifest for the module ${ssrEntryURLPage.toString()}. This is unexpected and likely a bug in Astro, please report.`
);
}
} else {
- await generatePage(
- opts,
- internals,
- pageData,
- ssrEntryPage as SinglePageBuiltModule,
- builtPaths
- );
+ const ssrEntry = ssrEntryPage as SinglePageBuiltModule;
+ const manifest = generateRuntimeManifest(opts.settings, internals, ssrEntry.renderers);
+ await generatePage(opts, internals, pageData, ssrEntry, builtPaths, manifest);
}
}
}
for (const pageData of eachRedirectPageData(internals)) {
const entry = await getEntryForRedirectRoute(pageData.route, internals, outFolder);
- await generatePage(opts, internals, pageData, entry, builtPaths);
+ const manifest = generateRuntimeManifest(opts.settings, internals, entry.renderers);
+ await generatePage(opts, internals, pageData, entry, builtPaths, manifest);
}
} else {
for (const [pageData, filePath] of eachPageDataFromEntryPoint(internals)) {
const ssrEntryURLPage = createEntryURL(filePath, outFolder);
- const ssrEntryPage: SinglePageBuiltModule = await import(ssrEntryURLPage.toString());
+ const entry: SinglePageBuiltModule = await import(ssrEntryURLPage.toString());
+ const manifest = generateRuntimeManifest(opts.settings, internals, entry.renderers);
- await generatePage(opts, internals, pageData, ssrEntryPage, builtPaths);
+ await generatePage(opts, internals, pageData, entry, builtPaths, manifest);
}
for (const pageData of eachRedirectPageData(internals)) {
const entry = await getEntryForRedirectRoute(pageData.route, internals, outFolder);
- await generatePage(opts, internals, pageData, entry, builtPaths);
+ const manifest = generateRuntimeManifest(opts.settings, internals, entry.renderers);
+ await generatePage(opts, internals, pageData, entry, builtPaths, manifest);
}
}
@@ -228,14 +227,14 @@ async function generatePage(
internals: BuildInternals,
pageData: PageBuildData,
ssrEntry: SinglePageBuiltModule,
- builtPaths: Set<string>
+ builtPaths: Set<string>,
+ manifest: SSRManifest
) {
if (routeIsRedirect(pageData.route) && !opts.settings.config.experimental.redirects) {
throw new Error(`To use redirects first set experimental.redirects to \`true\``);
}
let timeStart = performance.now();
- const renderers = ssrEntry.renderers;
const pageInfo = getPageDataByComponent(internals, pageData.route.component);
@@ -268,7 +267,6 @@ async function generatePage(
scripts,
styles,
mod: pageModule,
- renderers,
};
const icon = pageData.route.type === 'page' ? green('▶') : magenta('λ');
@@ -283,7 +281,7 @@ async function generatePage(
for (let i = 0; i < paths.length; i++) {
const path = paths[i];
- await generatePath(path, opts, generationOptions, onRequest);
+ await generatePath(path, opts, generationOptions, manifest, onRequest);
const timeEnd = performance.now();
const timeChange = getTimeStat(timeStart, timeEnd);
const timeIncrease = `(+${timeChange})`;
@@ -398,7 +396,6 @@ interface GeneratePathOptions {
scripts: { type: 'inline' | 'external'; value: string } | null;
styles: StylesheetAsset[];
mod: ComponentInstance;
- renderers: SSRLoadedRenderer[];
}
function shouldAppendForwardSlash(
@@ -462,10 +459,11 @@ async function generatePath(
pathname: string,
opts: StaticBuildOptions,
gopts: GeneratePathOptions,
+ manifest: SSRManifest,
onRequest?: MiddlewareHandler<unknown>
) {
const { settings, logging, origin, routeCache } = opts;
- const { mod, internals, scripts: hoistedScripts, styles: _styles, pageData, renderers } = gopts;
+ const { mod, internals, scripts: hoistedScripts, styles: _styles, pageData } = gopts;
// This adds the page name to the array so it can be shown as part of stats.
if (pageData.route.type === 'page') {
@@ -478,25 +476,17 @@ async function generatePath(
const links = new Set<never>();
const scripts = createModuleScriptsSet(
hoistedScripts ? [hoistedScripts] : [],
- settings.config.base,
- settings.config.build.assetsPrefix
- );
- const styles = createStylesheetElementSet(
- _styles,
- settings.config.base,
- settings.config.build.assetsPrefix
+ manifest.base,
+ manifest.assetsPrefix
);
+ const styles = createStylesheetElementSet(_styles, manifest.base, manifest.assetsPrefix);
if (settings.scripts.some((script) => script.stage === 'page')) {
const hashedFilePath = internals.entrySpecifierToBundleMap.get(PAGE_SCRIPT_ID);
if (typeof hashedFilePath !== 'string') {
throw new Error(`Cannot find the built path for ${PAGE_SCRIPT_ID}`);
}
- const src = createAssetLink(
- hashedFilePath,
- settings.config.base,
- settings.config.build.assetsPrefix
- );
+ const src = createAssetLink(hashedFilePath, manifest.base, manifest.assetsPrefix);
scripts.add({
props: { type: 'module', src },
children: '',
@@ -521,14 +511,16 @@ async function generatePath(
opts.settings.config.build.format,
pageData.route.type
);
+
const env = createEnvironment({
- adapterName: undefined,
+ adapterName: manifest.adapterName,
logging,
- markdown: settings.config.markdown,
+ markdown: manifest.markdown,
mode: opts.mode,
- renderers,
- clientDirectives: settings.clientDirectives,
+ renderers: manifest.renderers,
+ clientDirectives: manifest.clientDirectives,
async resolve(specifier: string) {
+ // NOTE: next PR, borrow logic from build manifest maybe?
const hashedFilePath = internals.entrySpecifierToBundleMap.get(specifier);
if (typeof hashedFilePath !== 'string') {
// If no "astro:scripts/before-hydration.js" script exists in the build,
@@ -538,16 +530,10 @@ async function generatePath(
}
throw new Error(`Cannot find the built path for ${specifier}`);
}
- return createAssetLink(
- hashedFilePath,
- settings.config.base,
- settings.config.build.assetsPrefix
- );
+ return createAssetLink(hashedFilePath, manifest.base, manifest.assetsPrefix);
},
routeCache,
- site: settings.config.site
- ? new URL(settings.config.base, settings.config.site).toString()
- : settings.config.site,
+ site: manifest.site,
ssr,
streaming: true,
});
@@ -556,7 +542,7 @@ async function generatePath(
origin,
pathname,
request: createRequest({ url, headers: new Headers(), logging, ssr }),
- componentMetadata: internals.componentMetadata,
+ componentMetadata: manifest.componentMetadata,
scripts,
styles,
links,
@@ -656,3 +642,32 @@ async function generatePath(
await fs.promises.mkdir(outFolder, { recursive: true });
await fs.promises.writeFile(outFile, body, encoding ?? 'utf-8');
}
+
+/**
+ * It creates a `SSRManifest` from the `AstroSettings`.
+ *
+ * Renderers needs to be pulled out from the page module emitted during the build.
+ * @param settings
+ * @param renderers
+ */
+export function generateRuntimeManifest(
+ settings: AstroSettings,
+ internals: BuildInternals,
+ renderers: SSRLoadedRenderer[]
+): SSRManifest {
+ return {
+ assets: new Set(),
+ entryModules: {},
+ routes: [],
+ adapterName: '',
+ markdown: settings.config.markdown,
+ clientDirectives: settings.clientDirectives,
+ renderers,
+ base: settings.config.base,
+ assetsPrefix: settings.config.build.assetsPrefix,
+ site: settings.config.site
+ ? new URL(settings.config.base, settings.config.site).toString()
+ : settings.config.site,
+ componentMetadata: internals.componentMetadata,
+ };
+}