40

WARNING in chunk AccessRights~Groups~Navigator [mini-css-extract-plugin] Conflicting order between:

  • css ../node_modules/css-loader??ref--7-1!../node_modules/postcss-loader/lib!./components/Icon/_circle/Icon_circle.scss
  • css ../node_modules/css-loader??ref--7-1!../node_modules/postcss-loader/lib!./components/Counter/Counter.scss
  • css ../node_modules/css-loader??ref--7-1!../node_modules/postcss-loader/lib!./components/NavigatorToolbar/NavigatorToolbar.scss

what does this mean and how to fix it? Thank you in advance!

"assets-webpack-plugin": "3.9.5",
"autoprefixer": "9.1.0",
"css-loader": "1.0.0",
"file-loader": "1.1.11",
"image-webpack-loader": "4.3.1",
"mini-css-extract-plugin": "0.4.2",
"postcss-advanced-variables": "2.3.3",
"postcss-clearfix": "2.0.1",
"postcss-conditionals": "2.1.0",
"postcss-extend": "1.0.5",
"postcss-functions": "3.0.0",
"postcss-hexrgba": "1.0.1",
"postcss-import": "12.0.0",
"postcss-loader": "2.1.6",
"postcss-media-minmax": "3.0.0",
"postcss-nested": "3.0.0",
"postcss-sassy-mixins": "2.1.0",
"postcss-simple-vars": "4.1.0",
"postcss-size": "2.0.0",
"postcss-urlrewrite": "0.2.2",
"source-map-loader": "0.2.3",
"string-replace-loader": "2.1.1",
"style-loader": "0.22.0",
"url-loader": "1.0.1",
"webpack": "4.16.5",
"webpack-cli": "3.1.0",
"webpack-dev-server": "3.1.5",    
2

6 Answers 6

63

It can easily become an annoying bug! I can see it being reported in every framework -- e.g. in issue #5372 in create-react-app, issue #250 in the mini-css-extract-plugin itself, etc.

I spent 6 hours debugging it (including putting console.log in the source code of mini-css-extract-plugin where it omits the Warning) and here are my findings.

What is this plugin?

The mini-css-extract-plugin of webpack is a CSS-bundler. It is there to gather CSS pieces and put them into .css chunks for you. Just like what the whole Webpack build is doing for .js files.

Why is it happening to me?

You are running into it because all of these conditions apply to you:

  1. You have Vue SFC or CSS-in-JS, that results in your CSS content being in different files (which are called modules).
  2. Your webpack configurations are set to do some sort of code-splitting optimizations, (e.g. via split-chunks-plugin) which puts your modules into chunks for lazy-loading in client-side (e.g. 1000 files, into 10 chunks, that are only downloaded by the user when the user needs them.) So, this plugin goes over how webpack has bundled your modules and tries to create its own CSS bundles out of them.
  3. There is an "Order Conflict" in your imports!

What is "Order Conflict" now?

It's "order" + "conflict." Let's review them.

Part 1) Order

This plugin is trying to run a topological sorting algorithm (this part of the source code) to find out in which order it should put the CSS rules in its output bundles so that it doesn't cause any problem.

The problem is, unlike JavaScript that you clearly export your objects from a file/module (in no order, as they are named), in CSS it will just get appended (like an array of strings) and so the order of the imports can actually matter!

Let's say you have two modules:

// module a.js
<div>hi, I am A!</div>
// ... in CSS section of the same file:
div { color: red; }
// module b.js
<div>hi, I am B!</div>
// ... in CSS section of the same file:
div { color: blue; }

And then you have a page that includes both of them them.

// page S (for Straight)
import a from "a.js"
import b from "b.js"

So far, so good! The CSS output can be

div { color: red; }
div { color: blue; }

which means all the <div>s should have blue font color.

However, if instead of that page S, we had a page had was importing them in reverse order, it would be:

// page R (for Reverse)
import b from "b.js"
import a from "a.js"

and the output would be equal to

div { color: blue; }
div { color: red; }

which means all the <div>s should have red font color.

This is why the order of imports matters.

Part 2) Conflict

Now, what should be the output CSS if you have both page S and page R?

Note that, unlike this silly example of applying a wild rule on all <div> elements, you might actually have some sort of scoped CSS or a CSS naming convention like BEM in place that would prevent such thing to become an issue. But, this plugin doesn't go over actually parsing and understanding the content of the CSS. It just complains that "Hey dude! I don't know whether a should come before b, or b should come before a!"

Solutions

You basically have two solutions, just like any other problem! Either solve it or kill the problem it.

Solution 1: Fix it

The error message is very hard to read and sometimes it doesn't even output the proper details of modules. (for me it's like , , , , , , as for some reason my ChunkGroups don't have a .name property; so zero information.) And it can be extremely messy if you have more than ~20 files.

Anyways, if you have got time this approach is the best you can try.

Notes:

  • You can also import PageS in PageR (or the other way around, whatever) to explicitly tell the plugin to pick this order and stop nagging! It might be easier than going over all the places that include one or another and move the lines up and down.
  • IMPORTANT NOTE 1: IF YOU THINK SORTING YOUR IMPORT LINES ALPHABETICALLY CAN HELP, SEE THIS EXAMPLE and THIS COMMENT (that even a Visual Code plugin cannot help)!
  • IMPORTANT NOTE 2: The Order Conflict is NOT NECESSARILY IN THE SAME FILE. It can be anywhere among the ancestors of the two or more files! So, can be a huge pain to find out.
  • IMPORTANT NOTE 3: IT'S NOT GOING TO BE FUTURE-PROOF! So, even if you move a few import lines up and down, tomorrow it might happen to another developer in your team.

So, TL;DR, if you found yourself spending more than two hours on this, try solution #2 below.

Solution 2: Kill it

If it's not actually causing a problem in production and your final output, you can suppress this error via passing an ignoreOrder flag to the options object of the plugin in your Webpack config.

Notes:

It's a good last resort! Good luck. :)

2
  • Sorting imports is nearly impossible (and won't work by the looks of it) in a big project with shared components and code splitting. Is there no avoid this nuisance ? You could try extracting default css and forcing it to load first, but even that isn't going to take you far.
    – Harshana
    Jul 18, 2021 at 13:09
  • @aidin .. so I am confused, is the conflict with css class names? Or does it not even look at that. Second... if everything is ordered then how are we supposed to fix it?
    – Tallboy
    Aug 17, 2021 at 4:12
26

CSS cares for rule order.

Q: What does the warning mean?

A: There are some order conflicts while packaging your CSS modules.

Q: What is the cause?

A: The plugin (mini-css-extract-plugin) tries to generate a CSS file but your codebase has multiple possible orderings for your modules. From the warning you showed, it seems you have used Icon before Counter in one location and Counter before Icon in another location. The plugin needs to generate a single CSS file from these and can't decide which module's CSS should be placed first. CSS cares for rule order so this can lead to issue when CSS changes without reason. So not defining a clear order can lead to fragile builds, that's why it displays a warning here.

Q: How to fix?

A: Sort your imports to create a consistent order. If you cannot sort for some reason, for example, you have libraries in your project beyond your control or when the order of these styles doesn't matter, you can ignore the warning by making changes as suggested in other answers.

3
  • 16
    "Sort your imports to create a consistent order." That's impossible for any project reusing common components. The only solution I see is scoping the CSS with generated hash modules, but on any existing projects, that's another huge risky refactor. May 28, 2019 at 2:41
  • 2
    Also, see this comment on why sorting alphabetically doesn't necessarily solve the problem: github.com/webpack-contrib/mini-css-extract-plugin/issues/…
    – Aidin
    May 17, 2021 at 9:40
  • 1
    Actually, see my full answer below (stackoverflow.com/a/67579319) on why you need to be lucky that "sorting" would fix your solution -- and it can come-back again in the future.
    – Aidin
    May 20, 2021 at 18:20
12

mini-css-extract-plugin version 0.8.0 included a new option ignoreOrder. You can check https://github.com/webpack-contrib/mini-css-extract-plugin#remove-order-warnings

new MiniCssExtractPlugin({
  ignoreOrder: true,
}),
4

Please see issue reported on Github.

 const webpackConfig = {
   stats: {
                  // warn => /Conflicting order between:/gm.test(warn)
     warningsFilter: warn => warn.indexOf('Conflicting order between:') > -1 // if true will ignore
   }
 }

3
  • 1
    Hello. Could you explain more why your solution is sufficient in this case?
    – jsosnowski
    Jan 23, 2019 at 7:28
  • 1
    sorry for getting back to you so late. i tried, you can try it
    – 江 河
    Feb 25, 2019 at 3:13
  • It's a clever solution, but they have actually created a flag of ignoreOrder on the plugin itself to turn the warning off. See my answer (stackoverflow.com/a/67579319) on why is this happening and how to properly silent the warning.
    – Aidin
    May 20, 2021 at 18:22
2

There is now an NPM package named @webkrafters/ordercss which tackles this issue at the root.

Full disclosure: I initially created it to solve this very problem in one of my apps but decided to expand it and share it with everyone.

If this package helps anyone, please share it with others.

Thanks and good luck!

NB: setting MiniCssExtractPlugin ignoreOrder property would suppress the warnings but may not resolve the underlying issues especially for those using modular css. This could result in unpredictability of the rendered view.

4
  • 1
    I read your package's README.md three times (and even the source code at github.com/steveswork/ordercss/blob/master/src/order-imports/…), and couldn't wrap my head around it. I think it's way too complicated for the common usage, which is, "I am getting this error, how can I fix it in 3 quick steps?" Additionally, since we know moving lines up and down doesn't fix this issue, I am wondering if your package is going to replace mini-css-extract-plugin or it does add hints for the webpack bundler? (Adding a "How it works" section could also help.) Thanks again for helping! :)
    – Aidin
    May 18, 2021 at 16:53
  • PS. I read it one more time, and I really think if you could make a "webpack plugin" out of it that could fully replace mini-css-extract-plugin (or internally include that and act as a wrapper on top of it), it would both help much more and become more attractive to developers. Thanks again!
    – Aidin
    May 18, 2021 at 17:00
  • @Aidin, I appreciate your feedback. Your concern was considered at the package design phase. The problem scope was found then to be rather complex for a quick solution May 18, 2021 at 18:23
  • 1
    @Aidin, a webpack plugin, as you suggested, would be a welcomed solution for webpack users. However, the problem scope does not fit the webpack compilation model and that would make for quite an inefficient webpack plugin IMO May 18, 2021 at 18:24
0

In case anyone is using Quasar and is coming to this issue 2 years late, like me, here is how I updated my quasar.config.js file to kill the warnings as @Aidin suggests.

// quasar.config.js

module.exports = configure(function (ctx) {
  //...
  return {
    //...
    chainWebpack(chain) {
      //...
      if (ctx.prod) {
        chain.plugin('mini-css-extract')
          .tap(args => {
            args[0].ignoreOrder = true
            return args
          })
      }
    }
  }
}

Razvan's Github comment was very useful.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.