UNPKG

vike

Version:

The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.

54 lines (53 loc) 3 kB
import '../../assertEnvServer.js'; export { getPageAssets }; import { retrievePageAssetsProd } from './getPageAssets/retrievePageAssetsProd.js'; import { retrievePageAssetsDev } from './getPageAssets/retrievePageAssetsDev.js'; import { inferMediaType } from './inferMediaType.js'; import { sortPageAssetsForEarlyHintsHeader } from './getPageAssets/sortPageAssetsForEarlyHintsHeader.js'; import { toPosixPath } from '../../../utils/path.js'; import { unique } from '../../../utils/unique.js'; import { getViteRPC } from '../../../utils/getViteRPC.js'; import { assert } from '../../../utils/assert.js'; import { prependBase } from '../../../utils/parseUrl-extras.js'; async function getPageAssets(pageContext, clientDependencies, clientEntries) { const globalContext = pageContext._globalContext; const { _isProduction: isProduction } = globalContext; const isDev = !isProduction; const { assetUrls, clientEntriesSrc } = isDev ? !globalContext._viteDevServer ? await getViteRPC().retrievePageAssetsDevRPC(clientDependencies, clientEntries) : await retrievePageAssetsDev(globalContext._viteDevServer, clientDependencies, clientEntries) : retrievePageAssetsProd(globalContext.assetsManifest, clientDependencies, clientEntries, globalContext.config); let pageAssets = []; unique([...clientEntriesSrc, ...assetUrls]).forEach((src) => { const { mediaType = null, assetType = null } = inferMediaType(src) || {}; if (isDev && assetType === 'style') { // https://github.com/vikejs/vike/issues/449 if (src.endsWith('?inline')) { return; } // https://github.com/vikejs/vike/issues/401 // WARNING: if changing following line, then also update https://github.com/vikejs/vike/blob/fae90a15d88e5e87ca9fcbb54cf2dc8773d2f229/vike/client/shared/removeFoucBuster.ts#L28 src = src + '?direct'; } const isEntry = clientEntriesSrc.includes(src) || // Vite automatically injects CSS, not only in development, but also in production (albeit with a FOUC). Therefore, strictly speaking, CSS aren't entries. We still, however, set `isEntry: true` for CSS, in order to denote page assets that should absolutely be injected in the HTML, regardless of preload strategy (not injecting CSS leads to FOUC). assetType === 'style'; pageAssets.push({ src, assetType, mediaType, isEntry, }); }); pageAssets.forEach(({ src }) => { assert(1 === pageAssets.filter((p) => p.src === src).length); }); pageAssets = pageAssets.map((pageAsset) => { const baseServerAssets = pageContext._baseAssets || pageContext._baseServer; pageAsset.src = prependBase(toPosixPath(pageAsset.src), baseServerAssets); return pageAsset; }); await sortPageAssetsForEarlyHintsHeader(pageAssets, isProduction); return pageAssets; }