71 lines
2.5 KiB
Plaintext
71 lines
2.5 KiB
Plaintext
import path from "node:path";
|
|
import { getPrerenderMetadata } from "../../../prerender/metadata.js";
|
|
import { extendManualChunks } from "./util.js";
|
|
function vitePluginPrerender(opts, internals) {
|
|
return {
|
|
name: "astro:rollup-plugin-prerender",
|
|
outputOptions(outputOptions) {
|
|
extendManualChunks(outputOptions, {
|
|
after(id, meta) {
|
|
if (id.includes("astro/dist/runtime")) {
|
|
return "astro";
|
|
}
|
|
const pageInfo = internals.pagesByViteID.get(id);
|
|
let hasSharedModules = false;
|
|
if (pageInfo) {
|
|
if (getPrerenderMetadata(meta.getModuleInfo(id))) {
|
|
const infoMeta = meta.getModuleInfo(id);
|
|
for (const moduleId of infoMeta.importedIds) {
|
|
const moduleMeta = meta.getModuleInfo(moduleId);
|
|
if (
|
|
// a shared modules should be inside the `src/` folder, at least
|
|
moduleMeta.id.startsWith(opts.settings.config.srcDir.pathname) && // and has at least two importers: the current page and something else
|
|
moduleMeta.importers.length > 1
|
|
) {
|
|
for (const importer of moduleMeta.importedIds) {
|
|
if (importer !== id) {
|
|
const importerModuleMeta = meta.getModuleInfo(importer);
|
|
if (importerModuleMeta) {
|
|
if (importerModuleMeta.id.includes("/pages")) {
|
|
if (getPrerenderMetadata(importerModuleMeta) === false) {
|
|
hasSharedModules = true;
|
|
break;
|
|
}
|
|
} else if (importerModuleMeta.id.includes("/middleware")) {
|
|
hasSharedModules = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
opts.allPages;
|
|
pageInfo.hasSharedModules = hasSharedModules;
|
|
pageInfo.route.prerender = true;
|
|
return "prerender";
|
|
}
|
|
pageInfo.route.prerender = false;
|
|
return `pages/${path.basename(pageInfo.component)}`;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
};
|
|
}
|
|
function pluginPrerender(opts, internals) {
|
|
return {
|
|
targets: ["server"],
|
|
hooks: {
|
|
"build:before": () => {
|
|
return {
|
|
vitePlugin: vitePluginPrerender(opts, internals)
|
|
};
|
|
}
|
|
}
|
|
};
|
|
}
|
|
export {
|
|
pluginPrerender
|
|
};
|