From be206e5652be383f8d7def912275005e7c4e14d3 Mon Sep 17 00:00:00 2001 From: bluwy Date: Mon, 23 Oct 2023 14:43:19 +0800 Subject: [PATCH 1/3] feat(resolve)!: remove `resolve.browserField` --- docs/config/shared-options.md | 12 +-------- docs/guide/migration.md | 2 ++ packages/vite/src/node/config.ts | 2 -- packages/vite/src/node/constants.ts | 1 + packages/vite/src/node/plugins/resolve.ts | 25 +++++++++++-------- packages/vite/src/node/ssr/ssrModuleLoader.ts | 1 - playground/resolve/vite.config.js | 2 +- 7 files changed, 19 insertions(+), 26 deletions(-) diff --git a/docs/config/shared-options.md b/docs/config/shared-options.md index e7708d80c517cf..2e825609b96862 100644 --- a/docs/config/shared-options.md +++ b/docs/config/shared-options.md @@ -154,20 +154,10 @@ Export keys ending with "/" is deprecated by Node and may not work well. Please ## resolve.mainFields - **Type:** `string[]` -- **Default:** `['module', 'jsnext:main', 'jsnext']` +- **Default:** `['browser', 'module', 'jsnext:main', 'jsnext']` List of fields in `package.json` to try when resolving a package's entry point. Note this takes lower precedence than conditional exports resolved from the `exports` field: if an entry point is successfully resolved from `exports`, the main field will be ignored. -## resolve.browserField - -- **Type:** `boolean` -- **Default:** `true` -- **Deprecated** - -Whether to enable resolving to `browser` field. - -In future, `resolve.mainFields`'s default value will be `['browser', 'module', 'jsnext:main', 'jsnext']` and this option will be removed. - ## resolve.extensions - **Type:** `string[]` diff --git a/docs/guide/migration.md b/docs/guide/migration.md index 65d8b4e78c6101..586085441e77d2 100644 --- a/docs/guide/migration.md +++ b/docs/guide/migration.md @@ -133,6 +133,8 @@ Also there are other breaking changes which only affect few users. - Renamed `ResolveWorkerOptions` type to `ResolvedWorkerOptions` - [[#5657] fix: return 404 for resources requests outside the base path](https://github.com/vitejs/vite/pull/5657) - In the past, Vite responded to requests outside the base path without `Accept: text/html`, as if they were requested with the base path. Vite no longer does that and responds with 404 instead. +- [[#14732] feat(resolve)!: remove `resolve.browserField`](https://github.com/vitejs/vite/pull/14732) + - `resolve.browserField` has been deprecated since Vite 3 in favour of an updated default of `['browser', 'module', 'jsnext:main', 'jsnext']` for `resolve.mainFields`. ## Migration from v3 diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index 7c2c5c5dff9732..c44c1689e6a52d 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -530,7 +530,6 @@ export async function resolveConfig( const resolveOptions: ResolvedConfig['resolve'] = { mainFields: config.resolve?.mainFields ?? DEFAULT_MAIN_FIELDS, - browserField: config.resolve?.browserField ?? true, conditions: config.resolve?.conditions ?? [], extensions: config.resolve?.extensions ?? DEFAULT_EXTENSIONS, dedupe: config.resolve?.dedupe ?? [], @@ -1060,7 +1059,6 @@ async function bundleConfigFile( preferRelative: false, tryIndex: true, mainFields: [], - browserField: false, conditions: [], overrideConditions: ['node'], dedupe: [], diff --git a/packages/vite/src/node/constants.ts b/packages/vite/src/node/constants.ts index 414d1b6430918f..5d8d0d10ca7839 100644 --- a/packages/vite/src/node/constants.ts +++ b/packages/vite/src/node/constants.ts @@ -9,6 +9,7 @@ const { version } = JSON.parse( export const VERSION = version as string export const DEFAULT_MAIN_FIELDS = [ + 'browser', 'module', 'jsnext:main', // moment still uses this... 'jsnext', diff --git a/packages/vite/src/node/plugins/resolve.ts b/packages/vite/src/node/plugins/resolve.ts index 3abb5d87be2a23..4a047c8a68762e 100644 --- a/packages/vite/src/node/plugins/resolve.ts +++ b/packages/vite/src/node/plugins/resolve.ts @@ -69,14 +69,9 @@ const debug = createDebugger('vite:resolve-details', { export interface ResolveOptions { /** - * @default ['module', 'jsnext:main', 'jsnext'] + * @default ['browser', 'module', 'jsnext:main', 'jsnext'] */ mainFields?: string[] - /** - * @deprecated In future, `mainFields` should be used instead. - * @default true - */ - browserField?: boolean conditions?: string[] /** * @default ['.mjs', '.js', '.mts', '.ts', '.jsx', '.tsx', '.json'] @@ -281,7 +276,7 @@ export function resolvePlugin(resolveOptions: InternalResolveOptions): Plugin { if ( targetWeb && - options.browserField && + options.mainFields.includes('browser') && (res = tryResolveBrowserMapping(fsPath, importer, options, true)) ) { return res @@ -365,7 +360,7 @@ export function resolvePlugin(resolveOptions: InternalResolveOptions): Plugin { if ( targetWeb && - options.browserField && + options.mainFields.includes('browser') && (res = tryResolveBrowserMapping( id, importer, @@ -991,7 +986,7 @@ export function resolvePackageEntry( // fields are present, prioritize those instead. if ( targetWeb && - options.browserField && + options.mainFields.includes('browser') && (!entryPoint || entryPoint.endsWith('.mjs')) ) { // check browser field @@ -1065,7 +1060,11 @@ export function resolvePackageEntry( } else { // resolve object browser field in package.json const { browser: browserField } = data - if (targetWeb && options.browserField && isObject(browserField)) { + if ( + targetWeb && + options.mainFields.includes('browser') && + isObject(browserField) + ) { entry = mapWithBrowserField(entry, browserField) || entry } } @@ -1185,7 +1184,11 @@ function resolveDeepImport( `${path.join(dir, 'package.json')}.`, ) } - } else if (targetWeb && options.browserField && isObject(browserField)) { + } else if ( + targetWeb && + options.mainFields.includes('browser') && + isObject(browserField) + ) { // resolve without postfix (see #7098) const { file, postfix } = splitFileAndPostfix(relativeId) const mapped = mapWithBrowserField(file, browserField) diff --git a/packages/vite/src/node/ssr/ssrModuleLoader.ts b/packages/vite/src/node/ssr/ssrModuleLoader.ts index 65a357b127656f..6ad10fe85d0eb1 100644 --- a/packages/vite/src/node/ssr/ssrModuleLoader.ts +++ b/packages/vite/src/node/ssr/ssrModuleLoader.ts @@ -137,7 +137,6 @@ async function instantiateModule( const resolveOptions: NodeImportResolveOptions = { mainFields: ['main'], - browserField: true, conditions: [], overrideConditions: [...overrideConditions, 'production', 'development'], extensions: ['.js', '.cjs', '.json'], diff --git a/playground/resolve/vite.config.js b/playground/resolve/vite.config.js index b27df23e734eeb..c016401a85ffb2 100644 --- a/playground/resolve/vite.config.js +++ b/playground/resolve/vite.config.js @@ -27,7 +27,7 @@ const generatedContentImports = [ export default defineConfig({ resolve: { extensions: ['.mjs', '.js', '.es', '.ts'], - mainFields: ['custom', 'module'], + mainFields: ['browser', 'custom', 'module'], conditions: ['custom'], }, define: { From f40ef0f1f78a5866d5a9ab5fb671f80c526d37a4 Mon Sep 17 00:00:00 2001 From: bluwy Date: Mon, 23 Oct 2023 14:48:12 +0800 Subject: [PATCH 2/3] docs: update link --- docs/guide/migration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/migration.md b/docs/guide/migration.md index 586085441e77d2..f1755ff8267fc5 100644 --- a/docs/guide/migration.md +++ b/docs/guide/migration.md @@ -133,7 +133,7 @@ Also there are other breaking changes which only affect few users. - Renamed `ResolveWorkerOptions` type to `ResolvedWorkerOptions` - [[#5657] fix: return 404 for resources requests outside the base path](https://github.com/vitejs/vite/pull/5657) - In the past, Vite responded to requests outside the base path without `Accept: text/html`, as if they were requested with the base path. Vite no longer does that and responds with 404 instead. -- [[#14732] feat(resolve)!: remove `resolve.browserField`](https://github.com/vitejs/vite/pull/14732) +- [[#14733] feat(resolve)!: remove `resolve.browserField`](https://github.com/vitejs/vite/pull/14733) - `resolve.browserField` has been deprecated since Vite 3 in favour of an updated default of `['browser', 'module', 'jsnext:main', 'jsnext']` for `resolve.mainFields`. ## Migration from v3 From 1157c06297be98de2a5f3492bda5187dbad018de Mon Sep 17 00:00:00 2001 From: bluwy Date: Mon, 23 Oct 2023 21:54:50 +0800 Subject: [PATCH 3/3] chore: add warning --- packages/vite/src/node/config.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index c44c1689e6a52d..e923e9c348ec10 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -537,6 +537,20 @@ export async function resolveConfig( alias: resolvedAlias, } + if ( + // @ts-expect-error removed field + config.resolve?.browserField === false && + resolveOptions.mainFields.includes('browser') + ) { + logger.warn( + colors.yellow( + `\`resolve.browserField\` is set to false, but the option is removed in favour of ` + + `the 'browser' string in \`resolve.mainFields\`. You may want to update \`resolve.mainFields\` ` + + `to remove the 'browser' string and preserve the previous browser behaviour.`, + ), + ) + } + // load .env files const envDir = config.envDir ? normalizePath(path.resolve(resolvedRoot, config.envDir))