One config to rule them all
Andrey Sitnik, Evil Martians
Browserslist
The company behind PostCSS and Autoprefixer
Check out my Twitter for the slides
Part 1. The problem.
Two most common Autoprefixer mistakes
.postcssrc{
"plugins": {
"autoprefixer": {
"browsers": [
"last 2 Chrome versions",
"last 2 Firefox versions",
"last 2 Edge versions",
"last 2 Safari versions"
]
}
}
}Adds prefixes needed for specified browsers
/*
"last 2 Chrome versions"
*/
.text {
-webkit-user-select: none;
user-select: none;
}/*
"last 2 Chrome versions"
"last 2 Edge versions"
*/
.text {
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
}babel-preset-env is “Autoprefixer” for JS
.babelrc{
"presets": [
["@babel/preset-env", {
"targets": {
"browsers": [
"last 2 Chrome versions",
…
]
}
}]
]
}Adds polyfills needed for specified browsers
/*
"last 2 Chrome versions"
*/
const array = [1, 2, 3];
const [first, second] = array;/*
"last 2 Chrome versions"
"last 2 Edge versions"
*/
const array = [1, 2, 3];
const first = array[0],
second = array[1];Two configs with the same list
"autoprefixer": {
"browsers": [
"last 2 Chrome versions",
"last 2 Firefox versions",
"last 2 Edge versions",
"last 2 Safari versions"
]
}["@babel/preset-env", {
"targets": {
"browsers": [
"last 2 Chrome versions",
"last 2 Firefox versions",
"last 2 Edge versions",
"last 2 Safari versions"
]
}
}]More tools, more configs with browsers
"autoprefixer": {
"browsers": [
"last 2 Chrome versions",
"last 2 Firefox versions",
"last 2 Edge versions",
"last 2 Safari versions"
]
}["@babel/preset-env", {
"targets": {
"browsers": [
"last 2 Chrome versions",
"last 2 Firefox versions",
"last 2 Edge versions",
"last 2 Safari versions"
]
}
}]"postcss-preset-env": {
"browsers": [
"last 2 Chrome versions",
"last 2 Firefox versions",
"last 2 Edge versions",
"last 2 Safari versions"
]
}"plugin/no-unsupported-browser-features": [true, {
"browsers": [
"last 2 Chrome versions",
"last 2 Firefox versions",
"last 2 Edge versions",
"last 2 Safari versions"
]
}]Part 2. The solution.
A single config for all tools
7
.browserslistrc
last 2 versions
> 1% in US
not dead # IE 10, BlackBerry, and Opera Mobile 12.1* Only Babel 7 supports config file
Or package.json
{
…
"browserslist": [
"last 2 versions",
">1% in US",
"not dead"
]
}* Only Babel 7 supports config file
Queries instead of exact versions
> 0.5%, > 0.5% in US, > 0.5% in alt-NA, > 0.5% in my stats
last 2 versions, last 2 Chrome versions
last 2 years, since 2016
Firefox ESR, Electron 1.4.5
not dead
extends @my-company/browserslist-configFeature 1: Single config for all tools
Feature 2: A single development convention
— Do we still support IE 11?
— Check Browserslist config
Feature 3: Tools will think about browsers
Part 3. Who uses Browserslist?
The only recommended way for Autoprefixer
The only recommended way for Babel
@custom-media --mobile (width <= 800px);
@media (--mobile) {
body {
font-family: system-ui;
}
}@media (max-width: 800px) {
body {
font-family: system-ui,
-apple-system,
BlinkMacSystemFont, …
}
}/* last 3 versions */
audio, video {
display: inline-block;
}
img {
border-style: none;
}/* last 2 versions */
img {
border-style: none;
}Part 4. The ecosystem.
const { matchesUA } = require('browserslist-useragent')
if (!matchesUA(request.headers['user-agent'])) {
response.end(
updateBrowserWarning + html
)
} else {
response.end(html)
}> 0.5% in my statsbrowserslist-stats.jsonnpx browserslist-gaPart 4. The community.
Create React App
CSS Tricks
by Chris Coyier on CSS Tricks
Official public Browserslist configs
extends @ebay/browserslist-configextends @wordpress/browserslist-configPart 4. Best practices.
1. Do not specify browsers by name
last 2 Chrome versions
last 2 Firefox versions
last 2 Edge versions
last 2 Safari versionslast 2 versionsBut it is OK for kiosks and Electron apps
last 1 Electron version2. Don’t remove mobile browsers
defaults
not last 1 Android versions
not last 1 Samsung version
not last 1 iOS versiondefaultsMobile users visit desktop-only websites too
3. Don’t exclude browsers you don’t know
defaults
not Opera Mini all
not last 1 UCAndroid version
not last 1 QQAndroid version
not last 1 Baidu versiondefaults100M Opera Mini users in Africa
Opera Mini 2.66% > 1.86% Microfsoft Edge
* According Can I Use
Chinese browsers
UC Browser 7.51% > 3.85% Firefox + 2.71% Safari
* According Can I Use
The best queries
last 1 version
> 0.5% # or > 1% in my stats
not deaddefaults
# last 2 versions
# > 0.5%
# Firefox ESR
# not deadMinimum
Perfect
4. Built-in CLI to check the result
npx browserslistand_chr 64
and_ff 57
and_qq 1.2
and_uc 11.8
android 62
baidu 7.12
chrome 65
…Coverage
npx browserslist --coverageThese browsers account
for 57% of all users
globallyFixing 2 most common Autoprefixer mistakes
{
"plugins": {
"autoprefixer": {
"browsers": [
"last 2 Chrome versions",
"last 2 Firefox versions",
"last 2 Edge versions",
"last 2 Safari versions"
]
}
}
}{
"plugins": {
"autoprefixer": { }
}
}last 1 version
> 0.5% # or > 1% in my stats
not dead5*. Do not support only popular browsers
> 1%> 1%
last 1 version
not deadInternet Explorer
Developers
The circle
Developers make sites for popular browsers
Users use browsers supported by wesbites
Now days
Tweets about new awesome tools
Hedgehogs for every release
Subscribe
@browserslist
@evilmartians
@sitnikcode