UNPKG

vike

Version:

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

115 lines (114 loc) 5.41 kB
export { determineOptimizeDeps }; import { findPageFiles } from '../../shared/findPageFiles.js'; import { assert, assertIsImportPathNpmPackage, createDebugger, getNpmPackageName, isArray, unique, } from '../../utils.js'; import { getVikeConfigInternal, isOverridden } from '../../shared/resolveVikeConfigInternal.js'; import { analyzeClientEntries } from '../pluginBuild/pluginBuildConfig.js'; import { virtualFileIdEntryClientCR, virtualFileIdEntryClientSR, } from '../../../shared/virtualFiles/virtualFileEntry.js'; import { getFilePathResolved } from '../../shared/getFilePath.js'; const debug = createDebugger('vike:optimizeDeps'); async function determineOptimizeDeps(config) { const vikeConfig = await getVikeConfigInternal(); const { _pageConfigs: pageConfigs } = vikeConfig; const { entries, include } = await getPageDeps(config, pageConfigs); { // This actually doesn't work: Vite's dep optimizer doesn't seem to be able to crawl virtual files. // - Should we make it work? E.g. by creating a temporary file at node_modules/.vike/virtualFiles.js // - Or should we remove it? And make sure getPageDeps() also works for aliased import paths // - If we do, then we need to adjust include/entries (maybe by making include === entries -> will Vite complain?) const entriesVirtualFiles = getVirtualFiles(config, pageConfigs); entries.push(...entriesVirtualFiles); } /* Other Vite plugins may populate optimizeDeps, e.g. Cypress: https://github.com/vikejs/vike/issues/386 assert(config.optimizeDeps.entries === undefined) */ config.optimizeDeps.include = [...include, ...normalizeInclude(config.optimizeDeps.include)]; config.optimizeDeps.entries = [...entries, ...normalizeEntries(config.optimizeDeps.entries)]; if (debug.isActivated) debug('config.optimizeDeps', { 'config.optimizeDeps.entries': config.optimizeDeps.entries, 'config.optimizeDeps.include': config.optimizeDeps.include, }); } async function getPageDeps(config, pageConfigs) { let entries = []; let include = []; const addEntry = (e) => { assert(e); entries.push(e); }; const addInclude = (e) => { assert(e); // Shouldn't be a path alias, as path aliases would need to be added to config.optimizeDeps.entries instead of config.optimizeDeps.include assertIsImportPathNpmPackage(e); include.push(e); }; // V1 design { pageConfigs.forEach((pageConfig) => { Object.entries(pageConfig.configValueSources).forEach(([configName, sources]) => { sources .filter((source) => !isOverridden(source, configName, pageConfig)) .forEach((configValueSource) => { if (!configValueSource.valueIsLoadedWithImport && !configValueSource.valueIsFilePath) return; const { definedAt, configEnv } = configValueSource; if (!configEnv.client) return; if (definedAt.definedBy) return; if (definedAt.importPathAbsolute) { const npmPackageName = getNpmPackageName(definedAt.importPathAbsolute); if (npmPackageName && config.optimizeDeps.exclude?.includes(npmPackageName)) return; } if (definedAt.filePathAbsoluteUserRootDir !== null) { // Vite expects entries to be filesystem absolute paths (surprisingly so). addEntry(definedAt.filePathAbsoluteFilesystem); } else { // Adding definedAtFilePath.filePathAbsoluteFilesystem doesn't work for npm packages, I guess because of Vite's config.server.fs.allow addInclude(definedAt.importPathAbsolute); } }); }); }); } // V0.4 design { const pageFiles = await findPageFiles(config, ['.page', '.page.client'], true); const userRootDir = config.root; pageFiles.forEach((filePathAbsoluteUserRootDir) => { const entry = getFilePathResolved({ filePathAbsoluteUserRootDir, userRootDir }); const { filePathAbsoluteFilesystem } = entry; addEntry(filePathAbsoluteFilesystem); }); } entries = unique(entries); include = unique(include); return { entries, include }; } function getVirtualFiles(config, pageConfigs) { const { hasClientRouting, hasServerRouting, clientEntries } = analyzeClientEntries(pageConfigs, config); const entriesVirtualFiles = Object.values(clientEntries); if (hasClientRouting) entriesVirtualFiles.push(virtualFileIdEntryClientCR); if (hasServerRouting) entriesVirtualFiles.push(virtualFileIdEntryClientSR); return entriesVirtualFiles; } function normalizeEntries(entries) { if (isArray(entries)) return entries; if (typeof entries === 'string') return [entries]; if (entries === undefined) return []; assert(false); } function normalizeInclude(include) { if (isArray(include)) return include; if (include === undefined) return []; assert(false); }