vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
58 lines (57 loc) • 2.88 kB
JavaScript
export { analyzePageClientSide };
export { analyzePageClientSideInit };
import { analyzeExports } from './analyzePageClientSide/analyzeExports.js';
import { determineClientEntry } from './analyzePageClientSide/determineClientEntry.js';
import { getPageFilesClientSide } from './getAllPageIdFiles.js';
import { getPageFilesServerSide } from './getAllPageIdFiles.js';
import { assert } from '../utils.js';
import { getExportNames } from './analyzePageClientSide/getExportNames.js';
// TODO/v1-release: remove analyzePageClientSide(), use analyzeClientSide() instead
function analyzePageClientSide(pageFilesAll, pageId) {
let pageFilesClientSide = getPageFilesClientSide(pageFilesAll, pageId);
const pageFilesServerSide = getPageFilesServerSide(pageFilesAll, pageId);
const { isHtmlOnly, isClientRouting } = analyzeExports({ pageFilesClientSide, pageFilesServerSide, pageId });
if (isHtmlOnly) {
// HTML-only pages don't need any client-side `render()` hook. For apps that have both HTML-only and SSR/SPA pages, we skip the `.page.client.js` file that defines `render()` for HTML-only pages.
pageFilesClientSide = pageFilesClientSide.filter((p) => p.isEnv('CLIENT_ONLY') && !getExportNames(p).includes('render'));
pageFilesClientSide = removeOverriddenPageFiles(pageFilesClientSide);
}
const { clientEntries, clientDependencies } = determineClientEntry({
pageFilesClientSide,
pageFilesServerSide,
isHtmlOnly,
isClientRouting,
});
return { isHtmlOnly, isClientRouting, clientEntries, clientDependencies, pageFilesClientSide, pageFilesServerSide };
}
// TODO:v1-release: remove
async function analyzePageClientSideInit(pageFilesAll, pageId, { sharedPageFilesAlreadyLoaded }) {
const pageFilesClientSide = getPageFilesClientSide(pageFilesAll, pageId);
await Promise.all(pageFilesClientSide.map(async (p) => {
assert(p.isEnv('CLIENT_ONLY') || p.isEnv('CLIENT_AND_SERVER'));
if (sharedPageFilesAlreadyLoaded && p.isEnv('CLIENT_AND_SERVER')) {
return;
}
await p.loadExportNames?.();
/*
if (pageFile.exportNames) {
return pageFile.exportNames.includes(clientRouting)
}
if (pageFile.fileExports) {
return Object.keys(pageFile.fileExports).includes(clientRouting)
}
*/
}));
}
// [WIP] Just an experiment needed by https://vike.dev/banner
// - Not sure I want to make something like a public API: the CSS of `_default.page.server.js` are still loaded -> weird DX.
function removeOverriddenPageFiles(pageFilesClientSide) {
const pageFilesClientSide_ = [];
for (const p of pageFilesClientSide) {
pageFilesClientSide_.push(p);
if (getExportNames(p).includes('overrideDefaultPages')) {
break;
}
}
return pageFilesClientSide_;
}