-
Notifications
You must be signed in to change notification settings - Fork 115
Description
This plugin uses a different import order than the browser, which can lead to visual discrepancies when CSS is bundled vs. unbundled. I believe this is a regression and that it was caused by #211. The behavior used to be correct but was broken in that change, and is now incorrect.
Here's an example (note that the file common.css is being imported twice):
$ cat common.css
body { background: white; color: black; }
$ cat a.css
@import "./common.css";
body { background: red; }
$ cat b.css
@import "./common.css";
body { color: red; }
$ cat entry.css
@import "./a.css";
@import "./b.css";
$ cat index.html
<link rel="stylesheet" href="entry.css">
Some example text
When you view index.html in a browser, you should see a white background and red text. However, when bundled with PostCSS, the entire page is red.
Here's the script I used to bundle with PostCSS:
const css = require('fs').readFileSync('entry.css', 'utf8')
require('postcss')().use(require('postcss-import')({
})).process(css, {
from: 'entry.css',
}).then(result => {
console.log(result.css)
})The incorrect behavior can be "fixed" by adding skipDuplicates: false to the postcss-import options, but that's not great because it makes the output bigger unnecessarily. This option is also dangerous because skipDuplicates: false can cause postcss-import to infinite-loop and hang if the import graph has cycles.
The way to fix all of these problems and have postcss-import match what the browser does is to only respect the last duplicate @import statement instead of only respecting the first duplicate @import statement.