From 23440e9564fb794d904a905e82eb1a475e22d4be Mon Sep 17 00:00:00 2001 From: patak-dev Date: Tue, 1 Mar 2022 12:00:07 +0100 Subject: [PATCH] feat: support user manualChunks composition --- packages/playground/vue/vite.config.ts | 12 ++++++++- .../vite/src/node/plugins/splitVendorChunk.ts | 27 ++++++++++++++++--- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/packages/playground/vue/vite.config.ts b/packages/playground/vue/vite.config.ts index a9ca552cbccda2..f99a68ce8b6b10 100644 --- a/packages/playground/vue/vite.config.ts +++ b/packages/playground/vue/vite.config.ts @@ -17,7 +17,17 @@ export default defineConfig({ ], build: { // to make tests faster - minify: false + minify: false, + rollupOptions: { + output: { + // Test splitVendorChunkPlugin composition + manualChunks(id) { + if (id.includes('src-import')) { + return 'src-import' + } + } + } + } }, css: { modules: { diff --git a/packages/vite/src/node/plugins/splitVendorChunk.ts b/packages/vite/src/node/plugins/splitVendorChunk.ts index 09246e14e35234..3f7c16067a5f8e 100644 --- a/packages/vite/src/node/plugins/splitVendorChunk.ts +++ b/packages/vite/src/node/plugins/splitVendorChunk.ts @@ -1,6 +1,11 @@ import type { UserConfig } from '../../node' import type { Plugin } from '../plugin' -import type { OutputOptions, GetManualChunk, GetModuleInfo } from 'rollup' +import type { + OutputOptions, + GetManualChunk, + GetManualChunkApi, + GetModuleInfo +} from 'rollup' import { isCSSRequest } from './css' // Use splitVendorChunkPlugin() to get the same manualChunks strategy as Vite 2.7 @@ -91,13 +96,29 @@ export function splitVendorChunkPlugin(): Plugin { if (outputs) { outputs = Array.isArray(outputs) ? outputs : [outputs] for (const output of outputs) { - output.manualChunks = createSplitVendorChunk(output, config) + const viteManualChunks = createSplitVendorChunk(output, config) + if (viteManualChunks) { + if (output.manualChunks) { + if (typeof output.manualChunks === 'function') { + const userManualChunks = output.manualChunks + output.manualChunks = (id: string, api: GetManualChunkApi) => { + return userManualChunks(id, api) ?? viteManualChunks(id, api) + } + } + // else, leave the object form of manualChunks untouched, as + // we can't safely replicate rollup handling. + } else { + output.manualChunks = viteManualChunks + } + } } } else { return { build: { rollupOptions: { - manualChunks: createSplitVendorChunk({}, config) + output: { + manualChunks: createSplitVendorChunk({}, config) + } } } }