From 9885f6f113667c1e161dee5f30af1e91aeefa62f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=A0=20/=20green?= Date: Thu, 2 Mar 2023 00:52:25 +0900 Subject: [PATCH] feat: don't override `build.target` if terser is 5.16.0+ (#12197) --- packages/vite/src/node/build.ts | 18 ++++++++++++++++-- packages/vite/src/node/config.ts | 6 +++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts index e0d6bd5d08c48e..503d94811391d6 100644 --- a/packages/vite/src/node/build.ts +++ b/packages/vite/src/node/build.ts @@ -34,6 +34,7 @@ import { joinUrlSegments, lookupFile, normalizePath, + requireResolveFromRootWithFallback, } from './utils' import { manifestPlugin } from './plugins/manifest' import type { Logger } from './logger' @@ -298,6 +299,7 @@ export interface ResolvedBuildOptions export function resolveBuildOptions( raw: BuildOptions | undefined, logger: Logger, + root: string, ): ResolvedBuildOptions { const deprecatedPolyfillModulePreload = raw?.polyfillModulePreload if (raw) { @@ -378,8 +380,20 @@ export function resolveBuildOptions( if (resolved.target === 'modules') { resolved.target = ESBUILD_MODULES_TARGET } else if (resolved.target === 'esnext' && resolved.minify === 'terser') { - // esnext + terser: limit to es2021 so it can be minified by terser - resolved.target = 'es2021' + try { + const terserPackageJsonPath = requireResolveFromRootWithFallback( + root, + 'terser/package.json', + ) + const terserPackageJson = JSON.parse( + fs.readFileSync(terserPackageJsonPath, 'utf-8'), + ) + const v = terserPackageJson.version.split('.') + if (v[0] === '5' && v[1] < 16) { + // esnext + terser 5.16<: limit to es2021 so it can be minified by terser + resolved.target = 'es2021' + } + } catch {} } if (!resolved.cssTarget) { diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index 7c5491694b27db..c2f3f6d0cfa6be 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -529,7 +529,11 @@ export async function resolveConfig( : './' : resolveBaseUrl(config.base, isBuild, logger) ?? '/' - const resolvedBuildOptions = resolveBuildOptions(config.build, logger) + const resolvedBuildOptions = resolveBuildOptions( + config.build, + logger, + resolvedRoot, + ) // resolve cache directory const pkgPath = lookupFile(resolvedRoot, [`package.json`], { pathOnly: true })