From fd5e7c01bae67f7dfc3e631aa87a8d08429b819a Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 27 Jan 2021 02:07:17 -0500 Subject: [PATCH] refactor: adjust optimizeDeps options BREAKING CHANGE: `optimizeDeps` options have been adjusted. - Dependencies are now automatically scanned from source code. There is no longer the need to specify deep imports. - `optimizeDeps.include` and `optimizeDeps.exclude` now expect type `string[]`. - `optimizeDpes.link` and `optimizeDeps.auto` are removed. --- packages/vite/src/node/optimizer/index.ts | 23 +++++++++++++++---- packages/vite/src/node/optimizer/scan.ts | 27 ++++++----------------- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/packages/vite/src/node/optimizer/index.ts b/packages/vite/src/node/optimizer/index.ts index 4b1f854986844a..da99de26d5c846 100644 --- a/packages/vite/src/node/optimizer/index.ts +++ b/packages/vite/src/node/optimizer/index.ts @@ -21,11 +21,11 @@ export interface DepOptimizationOptions { /** * Force optimize listed dependencies (supports deep paths). */ - include?: string | RegExp | (string | RegExp)[] + include?: string[] /** * Do not optimize these dependencies. */ - exclude?: string | RegExp | (string | RegExp)[] + exclude?: string[] } export interface DepOptimizationMetadata { @@ -81,9 +81,24 @@ export async function optimizeDeps( fs.mkdirSync(cacheDir, { recursive: true }) } - const { qualified, external } = await scanImports(config) + const qualified = await scanImports(config) const qualifiedIds = Object.keys(qualified) + const include = config.optimizeDeps?.include + if (include) { + const resolve = config.createResolver({ asSrc: false }) + for (const id of include) { + if (!qualified[id]) { + const entry = await resolve(id) + if (entry) { + qualified[id] = entry + } else { + throw new Error(`Failed to resolve force included dependency: ${id}`) + } + } + } + } + if (!qualifiedIds.length) { writeFile(dataPath, JSON.stringify(data, null, 2)) log(`No listed dependency requires optimization. Skipping.\n\n\n`) @@ -108,7 +123,7 @@ export async function optimizeDeps( entryPoints: Object.values(qualified).map((p) => path.resolve(p)), bundle: true, format: 'esm', - external, + external: config.optimizeDeps?.exclude, logLevel: 'error', splitting: true, sourcemap: true, diff --git a/packages/vite/src/node/optimizer/scan.ts b/packages/vite/src/node/optimizer/scan.ts index eee43b5b9253fc..9a3024b3f2368f 100644 --- a/packages/vite/src/node/optimizer/scan.ts +++ b/packages/vite/src/node/optimizer/scan.ts @@ -6,7 +6,6 @@ import { build, Loader, Plugin } from 'esbuild' import { knownAssetTypes } from '../constants' import { createDebugger, emptyDir, isDataUrl, isExternalUrl } from '../utils' import { browserExternalId } from '../plugins/resolve' -import { createFilter } from '@rollup/pluginutils' import { isCSSRequest } from '../plugins/css' import chalk from 'chalk' import { @@ -18,7 +17,7 @@ const debug = createDebugger('vite:scan') export async function scanImports( config: ResolvedConfig -): Promise<{ qualified: Record; external: string[] }> { +): Promise> { const s = Date.now() const htmlEntries = await glob('**/index.html', { cwd: config.root, @@ -32,9 +31,8 @@ export async function scanImports( const tempDir = path.join(config.optimizeCacheDir!, 'scan') const depImports: Record = {} - const excluded = new Set() const missing = new Set() - const plugin = esbuildScanPlugin(config, depImports, excluded, missing) + const plugin = esbuildScanPlugin(config, depImports, missing) await Promise.all( htmlEntries.map((entry) => @@ -63,10 +61,7 @@ export async function scanImports( ) } - return { - qualified: depImports, - external: [...excluded] - } + return depImports } const scriptModuleRE = /(]*type\s*=\s*(?:"module"|'module')[^>]*>)(.*?)<\/script>/gims @@ -77,7 +72,6 @@ const langRE = /\blang\s*=\s*(?:"([^"]+)"|'([^']+)'|([^\s'">]+))/im function esbuildScanPlugin( config: ResolvedConfig, depImports: Record, - excluded: Set, missing: Set ): Plugin { let container: PluginContainer @@ -96,13 +90,8 @@ function esbuildScanPlugin( return res } - const include = - config.optimizeDeps?.include && - createFilter(config.optimizeDeps.include, null, { resolve: false }) - - const exclude = - config.optimizeDeps?.exclude && - createFilter(config.optimizeDeps.exclude, null, { resolve: false }) + const include = config.optimizeDeps?.include + const exclude = config.optimizeDeps?.exclude return { name: 'vite:dep-scan', @@ -139,11 +128,9 @@ function esbuildScanPlugin( return { path: id, external: true } } // dep or force included, externalize and stop crawling - if (resolved.includes('node_modules') || (include && include(id))) { - if (!(exclude && exclude(id))) { + if (resolved.includes('node_modules') || include?.includes(id)) { + if (!exclude?.includes(id)) { depImports[id] = resolved - } else { - excluded.add(id) } return { path: id,