@@ -138,7 +138,7 @@ class MiniCssExtractPlugin {
138
138
const renderedModules = Array . from ( chunk . modulesIterable ) . filter ( module => module . type === NS ) ;
139
139
if ( renderedModules . length > 0 ) {
140
140
result . push ( {
141
- render : ( ) => this . renderContentAsset ( renderedModules , compilation . runtimeTemplate . requestShortener ) ,
141
+ render : ( ) => this . renderContentAsset ( chunk , renderedModules , compilation . runtimeTemplate . requestShortener ) ,
142
142
filenameTemplate : this . options . filename ,
143
143
pathOptions : {
144
144
chunk,
@@ -153,7 +153,7 @@ class MiniCssExtractPlugin {
153
153
const renderedModules = Array . from ( chunk . modulesIterable ) . filter ( module => module . type === NS ) ;
154
154
if ( renderedModules . length > 0 ) {
155
155
result . push ( {
156
- render : ( ) => this . renderContentAsset ( renderedModules , compilation . runtimeTemplate . requestShortener ) ,
156
+ render : ( ) => this . renderContentAsset ( chunk , renderedModules , compilation . runtimeTemplate . requestShortener ) ,
157
157
filenameTemplate : this . options . chunkFilename ,
158
158
pathOptions : {
159
159
chunk,
@@ -339,8 +339,42 @@ class MiniCssExtractPlugin {
339
339
return obj ;
340
340
}
341
341
342
- renderContentAsset ( modules , requestShortener ) {
343
- modules . sort ( ( a , b ) => a . index2 - b . index2 ) ;
342
+ getCssModulesRecursiveHelper ( module ) {
343
+ return module . dependencies
344
+ . filter ( dependency => dependency . module )
345
+ . map ( ( dependency ) => {
346
+ if ( dependency . module instanceof CssModule ) {
347
+ return dependency . module ;
348
+ } else if ( dependency . module . dependencies ) {
349
+ return this . getCssModulesRecursiveHelper ( dependency . module ) ;
350
+ }
351
+ return [ ] ;
352
+ } )
353
+ . reduce ( ( flattenedModules , dependency ) => {
354
+ if ( Array . isArray ( dependency ) ) {
355
+ dependency . forEach ( ( dep ) => { if ( dep ) flattenedModules . push ( dep ) ; } ) ;
356
+ } else if ( dependency ) {
357
+ flattenedModules . push ( dependency ) ;
358
+ }
359
+ return flattenedModules ;
360
+ } , [ ] ) ;
361
+ }
362
+
363
+ getCssModulesOrderMap ( chunk ) {
364
+ const [ shallowestModule ] = Array . from ( chunk . modulesIterable ) . sort ( ( a , b ) => a . depth - b . depth ) ;
365
+
366
+ return this . getCssModulesRecursiveHelper ( shallowestModule )
367
+ . reduce ( ( indexMap , module , i ) => {
368
+ // Only keep the first occurrence
369
+ if ( module . id in indexMap ) return indexMap ;
370
+ return Object . assign ( indexMap , { [ module . id ] : i } ) ;
371
+ } , { } ) ;
372
+ }
373
+
374
+ renderContentAsset ( chunk , modules , requestShortener ) {
375
+ const idToIndexMap = this . getCssModulesOrderMap ( chunk ) ;
376
+ modules . sort ( ( a , b ) => idToIndexMap [ a . id ] - idToIndexMap [ b . id ] ) ;
377
+
344
378
const source = new ConcatSource ( ) ;
345
379
const externalsSource = new ConcatSource ( ) ;
346
380
for ( const m of modules ) {
0 commit comments