Description
- Operating System: macOS BigSur 11.1
- Node Version:
12.18.2
- NPM Version:
7.5.2
- webpack Version:
5.22.0
- mini-css-extract-plugin Version:
1.3.7
Expected Behavior
contentHash
to be stable and deterministic
Actual Behavior
Building same project without making changes between build will "randomly" result in different contentHash
sometimes
Code
I don't have minimal reproduction, but I did bit of a code dive so hopefully following explanation could replace reproduction setup.
In
mini-css-extract-plugin/src/index.js
Lines 532 to 556 in 6009bd2
webpack@5
chunkGraph
is used. chunkGraph.getChunkModulesIterableBySourceType(chunk, MODULE_TYPE);
return SortedSet
of modules, however they are actually not sorted. Per https://github.com/webpack/webpack/blob/911ec1aa67011e25aa1449610f5b0b557edd5459/test/SortableSet.unittest.js it seems SortedSet
means that it exposes .sort()
method to get the Set sorted.
Later on m.updateHash(hash, { chunkGraph });
is called in order of modules in the SortedSet
(which actually isn't sorted, and order of modules actually seem that can change between builds). Finally this result in contentHash
that is generated not to be stable/deterministic.
For part about getChunkModulesIterableBySourceType
returning unsorted modules I find minor mention in https://github.com/webpack/webpack/projects/6 :
Should getChunkModulesIterableBySourceType be sorted in general?
And following code for that method ( https://github.com/webpack/webpack/blob/05768d9029b9024d9a8d5f1aa56e649d9b963f57/lib/ChunkGraph.js#L538-L549 for entry), we can see that SortedSet
is used (in modulesBySourceType
implementation), but .sort()
or .sortWith()
is not called on it resulting in preserving order of module creation (?) which itself is probably not deterministic due to lot of async execution.
How Do We Reproduce?
As mentioned above - I don't have minimal reproduction for this problem, but I hope my research and description explain the issue well?