Autoprefixing

It can be challenging to remember which vendor prefixes you have to use for specific CSS rules to support a large variety of users. Autoprefixing solves this problem. It can be enabled through PostCSS and the autoprefixer plugin. autoprefixer uses Can I Use service to figure out which rules should be prefixed and its behavior can be tuned further.

Setting Up Autoprefixing

Achieving autoprefixing takes a small addition to the current setup. Install postcss-loader and autoprefixer first:

npm install postcss-loader autoprefixer --save-dev

Add a fragment enabling autoprefixing:

webpack.parts.js

exports.autoprefix = () => ({
  loader: "postcss-loader",
  options: {
    plugins: () => [require("autoprefixer")()],
  },
});

To connect the loader with CSS extraction, hook it up as follows:

webpack.config.js

const productionConfig = merge([
  parts.extractCSS({
leanpub-start-delete
    use: "css-loader",
leanpub-end-delete
leanpub-start-insert
    use: ["css-loader", parts.autoprefix()],
leanpub-end-insert
  }),
  ...
]);

To confirm that the setup works, we have to add something to autoprefix. Adjust the CSS:

src/main.css

...

leanpub-start-insert
.pure-button {
  -webkit-border-radius: 1em;
  border-radius: 1em;
}
leanpub-end-insert

If you know what browsers you prefer to support, it's possible to set up a .browserslistrc file. Different tools pick up this definition, autoprefixer included.

You can lint CSS through Stylelint. It can be set up the same way through postcss-loader as autoprefixing above.

Set up a file as follows:

.browserslistrc

> 1% # Browser usage over 1%
Last 2 versions # Or last two versions
IE 8 # Or IE 8

If you build the application now (npm run build) and examine the built CSS, you should be able to find a declaration there without the webkit portion:

...

leanpub-start-insert
.pure-button {
  border-radius: 1em;
}
leanpub-end-insert

autoprefixer is able to remove unnecessary rules and also add rules which are required based on the browser definition.

Conclusion

Autoprefixing is a convenient technique as it decreases the amount of work needed while crafting CSS. You can maintain minimum browser requirements within a .browserslistrc file. The tooling can then use that information to generate optimal output.

To recap:

  • Autoprefixing can be enabled through the autoprefixer PostCSS plugin.
  • Autoprefixing writes missing CSS definitions based on your minimum browser definition.
  • .browserslistrc is a standard file that works with tooling beyond autoprefixer