From 3682f30a2019ceec398eb907a94a750413c66974 Mon Sep 17 00:00:00 2001 From: sun0day Date: Mon, 20 Mar 2023 13:21:37 +0800 Subject: [PATCH] fix: make file name deterministic in parallel emits (fix #4909) (#4912) * fix: make file name deterministic in parallel emits (fix #4909) * refactor: use > determine emit file name * test: emit file in a random order --- src/utils/FileEmitter.ts | 25 +++++++++++++------ .../emit-file/deduplicate-assets/_config.js | 5 +++- ...ring-473287f8.txt => string1-473287f8.txt} | 0 ...ring-473287f8.txt => string1-473287f8.txt} | 0 ...ring-473287f8.txt => string1-473287f8.txt} | 0 ...ring-473287f8.txt => string1-473287f8.txt} | 0 6 files changed, 21 insertions(+), 9 deletions(-) rename test/chunking-form/samples/emit-file/deduplicate-assets/_expected/amd/assets/{string-473287f8.txt => string1-473287f8.txt} (100%) rename test/chunking-form/samples/emit-file/deduplicate-assets/_expected/cjs/assets/{string-473287f8.txt => string1-473287f8.txt} (100%) rename test/chunking-form/samples/emit-file/deduplicate-assets/_expected/es/assets/{string-473287f8.txt => string1-473287f8.txt} (100%) rename test/chunking-form/samples/emit-file/deduplicate-assets/_expected/system/assets/{string-473287f8.txt => string1-473287f8.txt} (100%) diff --git a/src/utils/FileEmitter.ts b/src/utils/FileEmitter.ts index cb950b72c8c..5b7ceab90be 100644 --- a/src/utils/FileEmitter.ts +++ b/src/utils/FileEmitter.ts @@ -365,14 +365,23 @@ export class FileEmitter { if (!fileName) { const sourceHash = getSourceHash(source); fileName = fileNamesBySource.get(sourceHash); - if (!fileName) { - fileName = generateAssetFileName( - consumedFile.name, - source, - sourceHash, - outputOptions, - bundle - ); + const newFileName = generateAssetFileName( + consumedFile.name, + source, + sourceHash, + outputOptions, + bundle + ); + // make sure file name deterministic in parallel emits, always use the shorter and smaller file name + if ( + !fileName || + fileName.length > newFileName.length || + (fileName.length === newFileName.length && fileName > newFileName) + ) { + if (fileName) { + delete bundle[fileName]; + } + fileName = newFileName; fileNamesBySource.set(sourceHash, fileName); } } diff --git a/test/chunking-form/samples/emit-file/deduplicate-assets/_config.js b/test/chunking-form/samples/emit-file/deduplicate-assets/_config.js index 41d3beb4ca0..7fdfc9c6913 100644 --- a/test/chunking-form/samples/emit-file/deduplicate-assets/_config.js +++ b/test/chunking-form/samples/emit-file/deduplicate-assets/_config.js @@ -4,13 +4,16 @@ module.exports = { input: ['main.js'], plugins: { buildStart() { - this.emitFile({ type: 'asset', name: 'string.txt', source: 'string' }); + // emit 'string' source in a random order this.emitFile({ type: 'asset', name: 'stringSameSource.txt', source: 'string' }); + this.emitFile({ type: 'asset', name: 'string2.txt', source: 'string' }); + this.emitFile({ type: 'asset', name: 'string1.txt', source: 'string' }); this.emitFile({ type: 'asset', name: 'sameStringAsBuffer.txt', source: Buffer.from('string') // Test cross Buffer/string deduplication }); + // Different string source this.emitFile({ type: 'asset', name: 'otherString.txt', source: 'otherString' }); diff --git a/test/chunking-form/samples/emit-file/deduplicate-assets/_expected/amd/assets/string-473287f8.txt b/test/chunking-form/samples/emit-file/deduplicate-assets/_expected/amd/assets/string1-473287f8.txt similarity index 100% rename from test/chunking-form/samples/emit-file/deduplicate-assets/_expected/amd/assets/string-473287f8.txt rename to test/chunking-form/samples/emit-file/deduplicate-assets/_expected/amd/assets/string1-473287f8.txt diff --git a/test/chunking-form/samples/emit-file/deduplicate-assets/_expected/cjs/assets/string-473287f8.txt b/test/chunking-form/samples/emit-file/deduplicate-assets/_expected/cjs/assets/string1-473287f8.txt similarity index 100% rename from test/chunking-form/samples/emit-file/deduplicate-assets/_expected/cjs/assets/string-473287f8.txt rename to test/chunking-form/samples/emit-file/deduplicate-assets/_expected/cjs/assets/string1-473287f8.txt diff --git a/test/chunking-form/samples/emit-file/deduplicate-assets/_expected/es/assets/string-473287f8.txt b/test/chunking-form/samples/emit-file/deduplicate-assets/_expected/es/assets/string1-473287f8.txt similarity index 100% rename from test/chunking-form/samples/emit-file/deduplicate-assets/_expected/es/assets/string-473287f8.txt rename to test/chunking-form/samples/emit-file/deduplicate-assets/_expected/es/assets/string1-473287f8.txt diff --git a/test/chunking-form/samples/emit-file/deduplicate-assets/_expected/system/assets/string-473287f8.txt b/test/chunking-form/samples/emit-file/deduplicate-assets/_expected/system/assets/string1-473287f8.txt similarity index 100% rename from test/chunking-form/samples/emit-file/deduplicate-assets/_expected/system/assets/string-473287f8.txt rename to test/chunking-form/samples/emit-file/deduplicate-assets/_expected/system/assets/string1-473287f8.txt