Description
Minimal reproduction repo (kind of): https://github.com/ferdaber/css-plugin-ordering-bug
Node: v9.11.1
OS: MacOS v10.12.6
With the latest version v0.4.1, in multiple-entry-points situations, I found that the CSS ordering is not deterministic. I set up a repo that "reproduces" the bug to the best of my ability (before getting stuck in Webpack internals).
The gist of it is that in cases where a chunk is shared between multiple chunk groups, it's not always the case that the first chunk group actually has the CSS modules that we want to sort on, which results in this line returning undefined
for the module index:
https://github.com/webpack-contrib/mini-css-extract-plugin/blob/master/src/index.js#L393
Chunk groups:
entry-a~vendor
: hasa.js
andshared_modules/other.js
entry-b~vendor
: hasb.js
,shared_modules/red.css
andshared_modules/blue.css
In my repo, I set it up so that anything in shared_modules
is split out into a separate chunk, but have the entry points ordered such that the first chunk group contains no CSS modules (entry-a
's dependency tree only contains JS files but touches the shared_modules
chunk group). This leads to the sorting mechanism as mentioned above to return undefined
for a CSS module's index.
The output in this repo still ended up having the correct ordering but I think it was because the chunk.modulesIterable
set had the correct ordering at the time:
Output css/vendor.css:
html {
background: blue;
}
html {
background: red;
}
Expected css/vendor.css:
html {
background: red;
}
html {
background: blue;
}
To my understanding, chunk.modulesIterable
is generated (or added) asynchronously so the ordering is not always guaranteed?
At this point I got stuck trying to get more information to submit to this issue, if a maintainer could offer me some guidance to what a better chunking strategy would be to work around this, or a fix for this, that would be super appreciated - thanks!