From 4e6c26f6c355ec3aac2a277961c3280f8eaa21b0 Mon Sep 17 00:00:00 2001 From: cyitao <36476221+inkyMountain@users.noreply.github.com> Date: Wed, 15 Jun 2022 13:03:38 +0800 Subject: [PATCH] fix(asset): respect assetFileNames if rollupOptions.output is an array (#8561) Co-authored-by: patak-dev --- packages/vite/src/node/config.ts | 23 +++++++++++++++ packages/vite/src/node/plugins/asset.ts | 19 ++++++++++--- playground/legacy/main.js | 1 + playground/legacy/package.json | 1 + .../legacy/vite.config-multiple-output.js | 28 +++++++++++++++++++ playground/legacy/vite.svg | 1 + 6 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 playground/legacy/vite.config-multiple-output.js create mode 100644 playground/legacy/vite.svg diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index 3b733fc4032f80..24b0e67fc9d390 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -569,6 +569,29 @@ export async function resolveConfig( ) } + // Check if all assetFileNames have the same reference. + // If not, display a warn for user. + const outputOption = config.build?.rollupOptions?.output ?? [] + // Use isArray to narrow its type to array + if (Array.isArray(outputOption)) { + const assetFileNamesList = outputOption.map( + (output) => output.assetFileNames + ) + if (assetFileNamesList.length > 1) { + const firstAssetFileNames = assetFileNamesList[0] + const hasDifferentReference = assetFileNamesList.some( + (assetFileNames) => assetFileNames !== firstAssetFileNames + ) + if (hasDifferentReference) { + resolved.logger.warn( + colors.yellow(` +assetFileNames isn't equal for every build.rollupOptions.output. A single pattern across all outputs is supported by Vite. +`) + ) + } + } + } + return resolved } diff --git a/packages/vite/src/node/plugins/asset.ts b/packages/vite/src/node/plugins/asset.ts index 9e99629c8144e9..2a119808a4eb72 100644 --- a/packages/vite/src/node/plugins/asset.ts +++ b/packages/vite/src/node/plugins/asset.ts @@ -365,11 +365,22 @@ async function fileToBuiltUrl( const { search, hash } = parseUrl(id) const postfix = (search || '') + (hash || '') const output = config.build?.rollupOptions?.output - const assetFileNames = + + const defaultAssetFileNames = path.posix.join( + config.build.assetsDir, + '[name].[hash][extname]' + ) + // Steps to determine which assetFileNames will be actually used. + // First, if output is an object or string, use assetFileNames in it. + // And a default assetFileNames as fallback. + let assetFileNames: Exclude = (output && !Array.isArray(output) ? output.assetFileNames : undefined) ?? - // defaults to '/[name].[hash][extname]' - // slightly different from rollup's one ('assets/[name]-[hash][extname]') - path.posix.join(config.build.assetsDir, '[name].[hash][extname]') + defaultAssetFileNames + if (output && Array.isArray(output)) { + // Second, if output is an array, adopt assetFileNames in the first object. + assetFileNames = output[0].assetFileNames ?? assetFileNames + } + const fileName = assetFileNamesToFileName( assetFileNames, file, diff --git a/playground/legacy/main.js b/playground/legacy/main.js index 157b6c8448e9c3..24959b129f28f2 100644 --- a/playground/legacy/main.js +++ b/playground/legacy/main.js @@ -1,4 +1,5 @@ import './style.css' +import './vite.svg' async function run() { const { fn } = await import('./async.js') diff --git a/playground/legacy/package.json b/playground/legacy/package.json index 7ba9c0e8a47953..53657df1c6b84f 100644 --- a/playground/legacy/package.json +++ b/playground/legacy/package.json @@ -7,6 +7,7 @@ "build": "vite build --debug legacy", "build:custom-filename": "vite --config ./vite.config-custom-filename.js build --debug legacy", "build:dynamic-css": "vite --config ./vite.config-dynamic-css.js build --debug legacy", + "build:multiple-output": "vite --config ./vite.config-multiple-output.js build", "debug": "node --inspect-brk ../../packages/vite/bin/vite", "preview": "vite preview" }, diff --git a/playground/legacy/vite.config-multiple-output.js b/playground/legacy/vite.config-multiple-output.js new file mode 100644 index 00000000000000..6d958bd892d621 --- /dev/null +++ b/playground/legacy/vite.config-multiple-output.js @@ -0,0 +1,28 @@ +import legacy from '@vitejs/plugin-legacy' +import { defineConfig } from 'vite' + +export default defineConfig({ + plugins: [legacy({ modernPolyfills: true })], + build: { + manifest: true, + minify: false, + rollupOptions: { + output: [ + { + assetFileNames() { + return 'assets/subdir/[name].[hash][extname]' + }, + entryFileNames: `assets/subdir/[name].js`, + chunkFileNames: `assets/subdir/[name].js` + }, + { + assetFileNames() { + return 'assets/subdir/[name].[hash][extname]' + }, + entryFileNames: `assets/anotherSubdir/[name].js`, + chunkFileNames: `assets/anotherSubdir/[name].js` + } + ] + } + } +}) diff --git a/playground/legacy/vite.svg b/playground/legacy/vite.svg new file mode 100644 index 00000000000000..e7b8dfb1b2a60b --- /dev/null +++ b/playground/legacy/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file