From bd86375c1610f8a43599327675b26a4f124e013b Mon Sep 17 00:00:00 2001 From: patak Date: Wed, 26 Apr 2023 10:25:58 +0200 Subject: [PATCH] feat: optimize deps option to turn off auto discovery (#13000) --- packages/vite/src/node/optimizer/index.ts | 8 ++++++ packages/vite/src/node/optimizer/optimizer.ts | 6 ++++- packages/vite/src/node/plugins/preAlias.ts | 4 ++- packages/vite/src/node/plugins/resolve.ts | 1 + .../__tests__/optimize-deps.spec.ts | 17 ++++++++++++ .../dep-no-discovery/index.js | 2 ++ .../dep-no-discovery/package.json | 6 +++++ .../optimize-deps-no-discovery/index.html | 24 +++++++++++++++++ .../optimize-deps-no-discovery/package.json | 16 +++++++++++ .../optimize-deps-no-discovery/vite.config.js | 21 +++++++++++++++ pnpm-lock.yaml | 27 ++++++++++++++----- 11 files changed, 124 insertions(+), 8 deletions(-) create mode 100644 playground/optimize-deps-no-discovery/__tests__/optimize-deps.spec.ts create mode 100644 playground/optimize-deps-no-discovery/dep-no-discovery/index.js create mode 100644 playground/optimize-deps-no-discovery/dep-no-discovery/package.json create mode 100644 playground/optimize-deps-no-discovery/index.html create mode 100644 playground/optimize-deps-no-discovery/package.json create mode 100644 playground/optimize-deps-no-discovery/vite.config.js diff --git a/packages/vite/src/node/optimizer/index.ts b/packages/vite/src/node/optimizer/index.ts index 2ccb4fef4f89d5..a1d88a46e90d8c 100644 --- a/packages/vite/src/node/optimizer/index.ts +++ b/packages/vite/src/node/optimizer/index.ts @@ -125,6 +125,14 @@ export interface DepOptimizationConfig { * @experimental */ disabled?: boolean | 'build' | 'dev' + /** + * Automatic dependency discovery. When `noDiscovery` is true, only dependencies + * listed in `include` will be optimized. The scanner isn't run for cold start + * in this case. CJS-only dependencies must be present in `include` during dev. + * @default false + * @experimental + */ + noDiscovery?: boolean } export type DepOptimizationOptions = DepOptimizationConfig & { diff --git a/packages/vite/src/node/optimizer/optimizer.ts b/packages/vite/src/node/optimizer/optimizer.ts index f82dbe0f3bcf85..1ba95b5ffca274 100644 --- a/packages/vite/src/node/optimizer/optimizer.ts +++ b/packages/vite/src/node/optimizer/optimizer.ts @@ -217,7 +217,11 @@ async function createDepsOptimizer( newDepsDiscovered = true } - if (!isBuild) { + if (config.optimizeDeps.noDiscovery) { + // We don't need to scan for dependencies or wait for the static crawl to end + // Run the first optimization run immediately + runOptimizer() + } else if (!isBuild) { // Important, the scanner is dev only depsOptimizer.scanProcessing = new Promise((resolve) => { // Runs in the background in case blocking high priority tasks diff --git a/packages/vite/src/node/plugins/preAlias.ts b/packages/vite/src/node/plugins/preAlias.ts index 7aa33ef2fdc7c2..1ba06fac265ffb 100644 --- a/packages/vite/src/node/plugins/preAlias.ts +++ b/packages/vite/src/node/plugins/preAlias.ts @@ -49,7 +49,9 @@ export function preAliasPlugin(config: ResolvedConfig): Plugin { if (optimizedId) { return optimizedId // aliased dep already optimized } - + if (depsOptimizer.options.noDiscovery) { + return + } const resolved = await this.resolve(id, importer, { ...options, custom: { ...options.custom, 'vite:pre-alias': true }, diff --git a/packages/vite/src/node/plugins/resolve.ts b/packages/vite/src/node/plugins/resolve.ts index 0d5f4100877dbe..8966d4ac6aa043 100644 --- a/packages/vite/src/node/plugins/resolve.ts +++ b/packages/vite/src/node/plugins/resolve.ts @@ -816,6 +816,7 @@ export function tryNodeResolve( } const skipOptimization = + depsOptimizer?.options.noDiscovery || !isJsType || (importer && isInNodeModules(importer)) || exclude?.includes(pkgId) || diff --git a/playground/optimize-deps-no-discovery/__tests__/optimize-deps.spec.ts b/playground/optimize-deps-no-discovery/__tests__/optimize-deps.spec.ts new file mode 100644 index 00000000000000..12bf4e5b57efaa --- /dev/null +++ b/playground/optimize-deps-no-discovery/__tests__/optimize-deps.spec.ts @@ -0,0 +1,17 @@ +import { expect, test } from 'vitest' +import { isBuild, page, readFile } from '~utils' + +test('optimized dep', async () => { + expect(await page.textContent('.optimized-dep')).toBe('[success]') +}) + +test('vue + vuex', async () => { + expect(await page.textContent('.vue')).toMatch(`[success]`) +}) + +test.runIf(!isBuild)('metadata', async () => { + const meta = await readFile('node_modules/.vite/deps/_metadata.json') + expect(meta).toMatch(`"@vitejs/test-dep-no-discovery"`) + expect(meta).not.toMatch(`"vue"`) + expect(meta).not.toMatch(`"vuex"`) +}) diff --git a/playground/optimize-deps-no-discovery/dep-no-discovery/index.js b/playground/optimize-deps-no-discovery/dep-no-discovery/index.js new file mode 100644 index 00000000000000..8096b3eca30104 --- /dev/null +++ b/playground/optimize-deps-no-discovery/dep-no-discovery/index.js @@ -0,0 +1,2 @@ +// written in cjs, optimization should convert this to esm +module.exports = '[success]' diff --git a/playground/optimize-deps-no-discovery/dep-no-discovery/package.json b/playground/optimize-deps-no-discovery/dep-no-discovery/package.json new file mode 100644 index 00000000000000..00c68ab6f39275 --- /dev/null +++ b/playground/optimize-deps-no-discovery/dep-no-discovery/package.json @@ -0,0 +1,6 @@ +{ + "name": "@vitejs/test-dep-no-discovery", + "private": true, + "version": "1.0.0", + "main": "index.js" +} diff --git a/playground/optimize-deps-no-discovery/index.html b/playground/optimize-deps-no-discovery/index.html new file mode 100644 index 00000000000000..1d0ccb72106bcb --- /dev/null +++ b/playground/optimize-deps-no-discovery/index.html @@ -0,0 +1,24 @@ +

Optimize Deps

+ +

Optimized Dep

+
+ +

Vue & Vuex

+
+ + + + diff --git a/playground/optimize-deps-no-discovery/package.json b/playground/optimize-deps-no-discovery/package.json new file mode 100644 index 00000000000000..3e0754e1cf3944 --- /dev/null +++ b/playground/optimize-deps-no-discovery/package.json @@ -0,0 +1,16 @@ +{ + "name": "@vitejs/test-optimize-deps-no-discovery", + "private": true, + "version": "0.0.0", + "scripts": { + "dev": "vite", + "build": "vite build", + "debug": "node --inspect-brk ../../packages/vite/bin/vite", + "preview": "vite preview" + }, + "dependencies": { + "@vitejs/test-dep-no-discovery": "file:./dep-no-discovery", + "vue": "^3.2.47", + "vuex": "^4.1.0" + } +} diff --git a/playground/optimize-deps-no-discovery/vite.config.js b/playground/optimize-deps-no-discovery/vite.config.js new file mode 100644 index 00000000000000..4179400e2b1080 --- /dev/null +++ b/playground/optimize-deps-no-discovery/vite.config.js @@ -0,0 +1,21 @@ +import { defineConfig } from 'vite' + +// Overriding the NODE_ENV set by vitest +process.env.NODE_ENV = '' + +export default defineConfig({ + optimizeDeps: { + disabled: false, + noDiscovery: true, + include: ['@vitejs/test-dep-no-discovery'], + }, + + build: { + // to make tests faster + minify: false, + // Avoid @rollup/plugin-commonjs + commonjsOptions: { + include: [], + }, + }, +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3d249b82be8f42..3ed07865f47010 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -862,6 +862,20 @@ importers: specifier: ^4.1.0 version: 4.1.0(vue@3.2.47) + playground/optimize-deps-no-discovery: + dependencies: + '@vitejs/test-dep-no-discovery': + specifier: file:./dep-no-discovery + version: file:playground/optimize-deps-no-discovery/dep-no-discovery + vue: + specifier: ^3.2.47 + version: 3.2.47 + vuex: + specifier: ^4.1.0 + version: 4.1.0(vue@3.2.47) + + playground/optimize-deps-no-discovery/dep-no-discovery: {} + playground/optimize-deps/added-in-entries: {} playground/optimize-deps/dep-alias-using-absolute-path: @@ -3948,17 +3962,12 @@ packages: '@vue/compiler-dom': 3.2.47 '@vue/shared': 3.2.47 - /@vue/devtools-api@6.4.4: - resolution: {integrity: sha512-Ku31WzpOV/8cruFaXaEZKF81WkNnvCSlBY4eOGtz5WMSdJvX1v1WWlSMGZeqUwPtQ27ZZz7B62erEMq8JDjcXw==} - dev: false - /@vue/devtools-api@6.4.5: resolution: {integrity: sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==} dev: false /@vue/devtools-api@6.5.0: resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==} - dev: true /@vue/reactivity-transform@3.2.47: resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==} @@ -10076,7 +10085,7 @@ packages: peerDependencies: vue: ^3.2.0 dependencies: - '@vue/devtools-api': 6.4.4 + '@vue/devtools-api': 6.5.0 vue: 3.2.47 dev: false @@ -10395,6 +10404,12 @@ packages: version: 0.0.0 dev: true + file:playground/optimize-deps-no-discovery/dep-no-discovery: + resolution: {directory: playground/optimize-deps-no-discovery/dep-no-discovery, type: directory} + name: '@vitejs/test-dep-no-discovery' + version: 1.0.0 + dev: false + file:playground/optimize-deps/added-in-entries: resolution: {directory: playground/optimize-deps/added-in-entries, type: directory} name: '@vitejs/test-added-in-entries'