Skip to content

Commit

Permalink
refactor: adjust optimizeDeps options
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
yyx990803 committed Jan 27, 2021
1 parent ebe71c4 commit fd5e7c0
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 24 deletions.
23 changes: 19 additions & 4 deletions packages/vite/src/node/optimizer/index.ts
Expand Up @@ -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 {
Expand Down Expand Up @@ -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`)
Expand All @@ -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,
Expand Down
27 changes: 7 additions & 20 deletions packages/vite/src/node/optimizer/scan.ts
Expand Up @@ -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 {
Expand All @@ -18,7 +17,7 @@ const debug = createDebugger('vite:scan')

export async function scanImports(
config: ResolvedConfig
): Promise<{ qualified: Record<string, string>; external: string[] }> {
): Promise<Record<string, string>> {
const s = Date.now()
const htmlEntries = await glob('**/index.html', {
cwd: config.root,
Expand All @@ -32,9 +31,8 @@ export async function scanImports(

const tempDir = path.join(config.optimizeCacheDir!, 'scan')
const depImports: Record<string, string> = {}
const excluded = new Set<string>()
const missing = new Set<string>()
const plugin = esbuildScanPlugin(config, depImports, excluded, missing)
const plugin = esbuildScanPlugin(config, depImports, missing)

await Promise.all(
htmlEntries.map((entry) =>
Expand Down Expand Up @@ -63,10 +61,7 @@ export async function scanImports(
)
}

return {
qualified: depImports,
external: [...excluded]
}
return depImports
}

const scriptModuleRE = /(<script\b[^>]*type\s*=\s*(?:"module"|'module')[^>]*>)(.*?)<\/script>/gims
Expand All @@ -77,7 +72,6 @@ const langRE = /\blang\s*=\s*(?:"([^"]+)"|'([^']+)'|([^\s'">]+))/im
function esbuildScanPlugin(
config: ResolvedConfig,
depImports: Record<string, string>,
excluded: Set<string>,
missing: Set<string>
): Plugin {
let container: PluginContainer
Expand All @@ -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',
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit fd5e7c0

Please sign in to comment.