diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts index 57289cdd649464..f11046c97fec25 100644 --- a/packages/vite/src/node/build.ts +++ b/packages/vite/src/node/build.ts @@ -306,9 +306,7 @@ export function resolveBuildPlugins(config: ResolvedConfig): { post: [ buildImportAnalysisPlugin(config), buildEsbuildPlugin(config), - ...(options.minify === 'terser' - ? [terserPlugin(options.terserOptions)] - : []), + ...(options.minify === 'terser' ? [terserPlugin(config)] : []), ...(options.manifest ? [manifestPlugin(config)] : []), ...(options.ssrManifest ? [ssrManifestPlugin(config)] : []), buildReporterPlugin(config), diff --git a/packages/vite/src/node/plugins/esbuild.ts b/packages/vite/src/node/plugins/esbuild.ts index a968c051ea7209..0ab0f313a1310b 100644 --- a/packages/vite/src/node/plugins/esbuild.ts +++ b/packages/vite/src/node/plugins/esbuild.ts @@ -215,7 +215,13 @@ export const buildEsbuildPlugin = (config: ResolvedConfig): Plugin => { } const target = config.build.target - const minify = config.build.minify === 'esbuild' + const minify = + config.build.minify === 'esbuild' && + // Do not minify ES lib output since that would remove pure annotations + // and break tree-shaking + // https://github.com/vuejs/vue-next/issues/2860#issuecomment-926882793 + !(config.build.lib && opts.format === 'es') + if ((!target || target === 'esnext') && !minify) { return null } diff --git a/packages/vite/src/node/plugins/terser.ts b/packages/vite/src/node/plugins/terser.ts index 359cb3db0b8210..253dc437aeafa3 100644 --- a/packages/vite/src/node/plugins/terser.ts +++ b/packages/vite/src/node/plugins/terser.ts @@ -1,8 +1,9 @@ import { Plugin } from '../plugin' import { Worker } from 'okie' import { Terser } from 'types/terser' +import { ResolvedConfig } from '..' -export function terserPlugin(options: Terser.MinifyOptions): Plugin { +export function terserPlugin(config: ResolvedConfig): Plugin { const worker = new Worker( (basedir: string, code: string, options: Terser.MinifyOptions) => { // when vite is linked, the worker thread won't share the same resolve @@ -20,9 +21,15 @@ export function terserPlugin(options: Terser.MinifyOptions): Plugin { name: 'vite:terser', async renderChunk(code, _chunk, outputOptions) { + // Do not minify ES lib output since that would remove pure annotations + // and break tree-shaking + if (config.build.lib && outputOptions.format === 'es') { + return null + } + const res = await worker.run(__dirname, code, { safari10: true, - ...options, + ...config.build.terserOptions, sourceMap: !!outputOptions.sourcemap, module: outputOptions.format.startsWith('es'), toplevel: outputOptions.format === 'cjs'