vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
77 lines (76 loc) • 4.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getPageAssets = getPageAssets;
exports.setResolveClientEntriesDev = setResolveClientEntriesDev;
exports.resolveIncludeAssetsImportedByServer = resolveIncludeAssetsImportedByServer;
const utils_js_1 = require("../utils.js");
const retrieveAssetsDev_js_1 = require("./getPageAssets/retrieveAssetsDev.js");
const retrieveAssetsProd_js_1 = require("./getPageAssets/retrieveAssetsProd.js");
const inferMediaType_js_1 = require("./inferMediaType.js");
const getManifestEntry_js_1 = require("./getPageAssets/getManifestEntry.js");
const sortPageAssetsForEarlyHintsHeader_js_1 = require("./getPageAssets/sortPageAssetsForEarlyHintsHeader.js");
const globalObject = (0, utils_js_1.getGlobalObject)('renderPage/getPageAssets.ts', {
resolveClientEntriesDev: null,
});
async function getPageAssets(pageContext, clientDependencies, clientEntries) {
const globalContext = pageContext._globalContext;
const { _isProduction: isProduction } = globalContext;
const isDev = !isProduction;
let assetUrls;
let clientEntriesSrc;
if (isDev) {
const { _viteDevServer: viteDevServer } = globalContext;
clientEntriesSrc = clientEntries.map((clientEntry) => globalObject.resolveClientEntriesDev(clientEntry, viteDevServer));
assetUrls = await (0, retrieveAssetsDev_js_1.retrieveAssetsDev)(clientDependencies, viteDevServer);
}
else {
const { assetsManifest } = globalContext;
clientEntriesSrc = clientEntries.map((clientEntry) => resolveClientEntriesProd(clientEntry, assetsManifest));
assetUrls = (0, retrieveAssetsProd_js_1.retrieveAssetsProd)(clientDependencies, assetsManifest, resolveIncludeAssetsImportedByServer(pageContext._globalContext.config));
}
let pageAssets = [];
(0, utils_js_1.unique)([...clientEntriesSrc, ...assetUrls]).forEach((src) => {
const { mediaType = null, assetType = null } = (0, inferMediaType_js_1.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 }) => {
(0, utils_js_1.assert)(1 === pageAssets.filter((p) => p.src === src).length);
});
pageAssets = pageAssets.map((pageAsset) => {
const baseServerAssets = pageContext._baseAssets || pageContext._baseServer;
pageAsset.src = (0, utils_js_1.prependBase)((0, utils_js_1.toPosixPath)(pageAsset.src), baseServerAssets);
return pageAsset;
});
await (0, sortPageAssetsForEarlyHintsHeader_js_1.sortPageAssetsForEarlyHintsHeader)(pageAssets, isProduction);
return pageAssets;
}
function resolveClientEntriesProd(clientEntry, assetsManifest) {
const { manifestEntry } = (0, getManifestEntry_js_1.getManifestEntry)(clientEntry, assetsManifest);
(0, utils_js_1.assert)(manifestEntry.isEntry || manifestEntry.isDynamicEntry || clientEntry.endsWith('.css'), { clientEntry });
let { file } = manifestEntry;
(0, utils_js_1.assert)(!file.startsWith('/'));
return '/' + file;
}
function setResolveClientEntriesDev(resolveClientEntriesDev) {
globalObject.resolveClientEntriesDev = resolveClientEntriesDev;
}
function resolveIncludeAssetsImportedByServer(config) {
return config.includeAssetsImportedByServer ?? true;
}