browserslist
The config to share target browsers and Node.js versions between different
front-end tools. It is used in:
- Autoprefixer
- Babel
- postcss-preset-env
- eslint-plugin-compat
- stylelint-no-unsupported-browser-features
- postcss-normalize
- obsolete-webpack-plugin
All tools will find target browsers automatically,
when you add the following to package.json
:
"browserslist": [ "defaults and supports es6-module", "maintained node versions" ]
Or in .browserslistrc
config:
# Browsers that we support defaults and supports es6-module maintained node versions
Developers set their version lists using queries like last 2 versions
to be free from updating versions manually.
Browserslist will use caniuse-lite
with Can I Use data for this queries.
You can check how config works at our playground: browsersl.ist
<p>
</a>
</p>
<h2 dir="auto">
<a rel="nofollow noopener" target="_blank" id="user-content-table-of-contents" class="anchor" aria-hidden="true" href="#table-of-contents"></a>Table of Contents
</h2>
<ul dir="auto">
<li>
<a rel="nofollow noopener" target="_blank" href="#tools">Tools</a>
</li>
<li>
<a rel="nofollow noopener" target="_blank" href="#best-practices">Best Practices</a>
</li>
<li>
<a rel="nofollow noopener" target="_blank" href="#queries">Queries</a>
</li>
<li>
<a rel="nofollow noopener" target="_blank" href="#config-file">Config File</a>
</li>
<li>
<a rel="nofollow noopener" target="_blank" href="#shareable-configs">Shareable Configs</a>
</li>
<li>
<a rel="nofollow noopener" target="_blank" href="#configuring-for-different-environments">Configuring for Different Environments</a>
</li>
<li>
<a rel="nofollow noopener" target="_blank" href="#custom-usage-data">Custom Usage Data</a>
</li>
<li>
<a rel="nofollow noopener" target="_blank" href="#js-api">JS API</a>
</li>
<li>
<a rel="nofollow noopener" target="_blank" href="#environment-variables">Environment Variables</a>
</li>
<li>
<a rel="nofollow noopener" target="_blank" href="#cache">Cache</a>
</li>
<li>
<a rel="nofollow noopener" target="_blank" href="#security-contact">Security Contact</a>
</li>
<li>
<a rel="nofollow noopener" target="_blank" href="#for-enterprise">For Enterprise</a>
</li>
</ul>
<h2 dir="auto">
<a rel="nofollow noopener" target="_blank" id="user-content-tools" class="anchor" aria-hidden="true" href="#tools"></a>Tools
</h2>
<h3 dir="auto">
<a rel="nofollow noopener" target="_blank" id="user-content-analyze-your-browserslist-config" class="anchor" aria-hidden="true" href="#analyze-your-browserslist-config"></a>Analyze your Browserslist Config
</h3>
<ul dir="auto">
<li>
Run <code>npx browserslist</code> in your project directory to see project’s<br /> target browsers. This CLI tool is built-in and available in any project<br /> with Autoprefixer.
</li>
<li>
<code>browserslist-lint</code> checks your config for popular mistakes.
</li>
</ul>
<h3 dir="auto">
<a rel="nofollow noopener" target="_blank" id="user-content-update-caniuse-lite" class="anchor" aria-hidden="true" href="#update-caniuse-lite"></a>Update <code>caniuse-lite</code><br />
</h3>
<ul dir="auto">
<li>
<code>update-browserslist-db</code> is a CLI tool to update browsers DB for queries<br /> like <code>last 2 version</code> or <code>>1%</code>.
</li>
<li>
<code>browserslist-update-action</code> is a GitHub Action to automatically<br /> runs <code>update-browserslist-db</code> and proposes a pull request to merge updates.
</li>
</ul>
<h3 dir="auto">
<a rel="nofollow noopener" target="_blank" id="user-content-show-we-do-not-support-your-browser-banner" class="anchor" aria-hidden="true" href="#show-we-do-not-support-your-browser-banner"></a>Show “We do not support your browser” Banner
</h3>
<ul dir="auto">
<li>
<code>browserslist-useragent-regexp</code> compiles Browserslist query to a RegExp<br /> to test browser useragent.
</li>
<li>
<code>browserslist-useragent-ruby</code> is a Ruby library to checks browser<br /> by user agent string to match Browserslist.
</li>
</ul>
<h3 dir="auto">
<a rel="nofollow noopener" target="_blank" id="user-content-get-statistics-for-5-in-my-stats" class="anchor" aria-hidden="true" href="#get-statistics-for-5-in-my-stats"></a>Get Statistics for <code>>5% in my stats</code>:
</h3>
<ul dir="auto">
<li>
<code>browserslist-ga</code> and <code>browserslist-ga-export</code> download your website<br /> browsers statistics to use it in <code>> 0.5% in my stats</code> query.
</li>
<li>
<code>browserslist-new-relic</code> generate a custom usage data file for Browserslist
</li>
<li>
<code>browserslist-adobe-analytics</code> use Adobe Analytics data to target browsers.<br /> from your New Relic Browser data.
</li>
</ul>
<h3 dir="auto">
<a rel="nofollow noopener" target="_blank" id="user-content-others" class="anchor" aria-hidden="true" href="#others"></a>Others
</h3>
<ul dir="auto">
<li>
<code>browserslist-rs</code> is a Browserslist port to Rust.
</li>
<li>
<code>browserslist-browserstack</code> runs BrowserStack tests for all browsers<br /> in Browserslist config.
</li>
</ul>
<h3 dir="auto">
<a rel="nofollow noopener" target="_blank" id="user-content-text-editors" class="anchor" aria-hidden="true" href="#text-editors"></a>Text Editors
</h3>
<p>
These extensions will add syntax highlighting for <code>.browserslistrc</code> files.
</p>
<ul dir="auto">
<li>
<a rel="nofollow noopener" target="_blank" href="https://marketplace.visualstudio.com/items?itemName=webben.browserslist">VS Code</a>
</li>
<li>
Vim
</li>
<li>
<a rel="nofollow noopener" target="_blank" href="https://plugins.jetbrains.com/plugin/16139-browserslist">WebStorm</a>
</li>
</ul>
<h2 dir="auto">
<a rel="nofollow noopener" target="_blank" id="user-content-best-practices" class="anchor" aria-hidden="true" href="#best-practices"></a>Best Practices
</h2>
<ul dir="auto">
<li>
There is a <code>defaults</code> query, which gives a reasonable configuration<br /> for most users:</p> <pre> "browserslist": [
"defaults"
]
<li>
If you want to change the default set of browsers, we recommend including<br /> <code>last 2 versions, not dead, > 0.2%</code>. This is because <code>last n versions</code> on its<br /> own does not add popular old versions, while only using a percentage of usage<br /> numbers above <code>0.2%</code> will in the long run make popular browsers even more<br /> popular. We might run into a monopoly and stagnation situation, as we had with<br /> Internet Explorer 6. Please use this setting with caution.
</li>
<li>
Select browsers directly (<code>last 2 Chrome versions</code>) only if you are making<br /> a web app for a kiosk with one browser. There are a lot of browsers<br /> on the market. If you are making general web app you should respect<br /> browsers diversity.
</li>
<li>
Don’t remove browsers just because you don’t know them. Opera Mini has<br /> 100 million users in Africa and it is more popular in the global market<br /> than Microsoft Edge. Chinese QQ Browsers has more market share than Firefox<br /> and desktop Safari combined.
</li>
</ul>
<h2 dir="auto">
<a rel="nofollow noopener" target="_blank" id="user-content-queries" class="anchor" aria-hidden="true" href="#queries"></a>Queries
</h2>
<p>
Browserslist will use browsers and Node.js versions query<br /> from one of these sources:
</p>
<ol dir="auto">
<li>
<code>.browserslistrc</code> config file in current or parent directories.
</li>
<li>
<code>browserslist</code> key in <code>package.json</code> file in current or parent directories.
</li>
<li>
<code>browserslist</code> config file in current or parent directories.
</li>
<li>
<code>BROWSERSLIST</code> environment variable.
</li>
<li>
If the above methods did not produce a valid result<br /> Browserslist will use defaults:<br /> <code>> 0.5%, last 2 versions, Firefox ESR, not dead</code>.
</li>
</ol>
<h3 dir="auto">
<a rel="nofollow noopener" target="_blank" id="user-content-query-composition" class="anchor" aria-hidden="true" href="#query-composition"></a>Query Composition
</h3>
<p>
An <code>or</code> combiner can use the keyword <code>or</code> as well as <code>,</code>.<br /> <code>last 1 version or > 1%</code> is equal to <code>last 1 version, > 1%</code>.<br /> <code>and</code> query combinations are also supported to perform an<br /> intersection of all the previous queries:<br /> <code>last 1 version or chrome > 75 and > 1%</code> will select<br /> (<code>browser last version</code> or <code>Chrome since 76</code>) and <code>more than 1% marketshare</code>.<br /> There are 3 different ways to combine queries as depicted below. First you start<br /> with a single query and then we combine the queries to get our final list.<br /> Obviously you can not start with a <code>not</code> combiner, since there is no left-hand<br /> side query to combine it with. The left-hand is always resolved as <code>and</code><br /> combiner even if <code>or</code> is used (this is an API implementation specificity).
</p>
<p>
Query combiner type<br /> Illustration<br /> Example
</p>
<p>
<code>or</code>/<code>,</code> combiner (union)
</p>
<p>
<code>> .5% or last 2 versions</code> <code>> .5%, last 2 versions</code>
</p>
<p>
<code>and</code> combiner (intersection)
</p>
<p>
<code>> .5% and last 2 versions</code>
</p>
<p>
<code>not</code> combiner (relative complement)
</p>
<p>
These three are equivalent to one another: <code>> .5% and not last 2 versions</code> <code>> .5% or not last 2 versions</code> <code>> .5%, not last 2 versions</code>
</p>
<p>
A quick way to test your query is to do <code>npx browserslist '> 0.3%, not dead'</code><br /> in your terminal.
</p>
<h3 dir="auto">
<a rel="nofollow noopener" target="_blank" id="user-content-full-list" class="anchor" aria-hidden="true" href="#full-list"></a>Full List
</h3>
<p>
You can specify the browser and Node.js versions by queries (case insensitive):
</p>
<ul dir="auto">
<li>
<code>defaults</code>: Browserslist’s default browsers<br /> (<code>> 0.5%, last 2 versions, Firefox ESR, not dead</code>).
</li>
<li>
By usage statistics: <ul dir="auto">
<li>
<code>> 5%</code>: browsers versions selected by global usage statistics.<br /> <code>>=</code>, <code><</code> and <code><=</code> work too.
</li>
<li>
<code>> 5% in US</code>: uses USA usage statistics.<br /> It accepts <a rel="nofollow noopener" target="_blank" href="https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements">two-letter country code</a>.
</li>
<li>
<code>> 5% in alt-AS</code>: uses Asia region usage statistics.<br /> List of all region codes can be found at <code>caniuse-lite/data/regions</code>.
</li>
<li>
<code>> 5% in my stats</code>: uses <a rel="nofollow noopener" target="_blank" href="#custom-usage-data">custom usage data</a>.
</li>
<li>
<code>> 5% in browserslist-config-mycompany stats</code>: uses <a rel="nofollow noopener" target="_blank" href="#custom-usage-data">custom usage data</a><br /> from <code>browserslist-config-mycompany/browserslist-stats.json</code>.
</li>
<li>
<code>cover 99.5%</code>: most popular browsers that provide coverage.
</li>
<li>
<code>cover 99.5% in US</code>: same as above, with <a rel="nofollow noopener" target="_blank" href="https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements">two-letter country code</a>.
</li>
<li>
<code>cover 99.5% in my stats</code>: uses <a rel="nofollow noopener" target="_blank" href="#custom-usage-data">custom usage data</a>.
</li>
</ul>
</li>
<li>
Last versions: <ul dir="auto">
<li>
<code>last 2 versions</code>: the last 2 versions for each browser.
</li>
<li>
<code>last 2 Chrome versions</code>: the last 2 versions of Chrome browser.
</li>
<li>
<code>last 2 major versions</code> or <code>last 2 iOS major versions</code>:<br /> all minor/patch releases of last 2 major versions.
</li>
</ul>
</li>
<li>
<code>dead</code>: browsers without official support or updates for 24 months.<br /> Right now it is <code>IE 11</code>, <code>IE_Mob 11</code>, <code>BlackBerry 10</code>, <code>BlackBerry 7</code>,<br /> <code>Samsung 4</code>, <code>OperaMobile 12.1</code> and all versions of <code>Baidu</code>.
</li>
<li>
Node.js versions: <ul dir="auto">
<li>
<code>node 10</code> and <code>node 10.4</code>: selects latest Node.js <code>10.x.x</code><br /> or <code>10.4.x</code> release.
</li>
<li>
<code>last 2 node versions</code>: select 2 latest Node.js releases.
</li>
<li>
<code>last 2 node major versions</code>: select 2 latest major-version Node.js releases.
</li>
<li>
<code>current node</code>: Node.js version used by Browserslist right now.
</li>
<li>
<code>maintained node versions</code>: all Node.js versions, which are still maintained<br /> by Node.js Foundation.
</li>
</ul>
</li>
<li>
Browsers versions: <ul dir="auto">
<li>
<code>iOS 7</code>: the iOS browser version 7 directly.
</li>
<li>
<code>Firefox > 20</code>: versions of Firefox newer than 20.<br /> <code>>=</code>, <code><</code> and <code><=</code> work too. It also works with Node.js.
</li>
<li>
<code>ie 6-8</code>: selects an inclusive range of versions.
</li>
<li>
<code>Firefox ESR</code>: the latest <a rel="nofollow noopener" target="_blank" href="https://support.mozilla.org/en-US/kb/choosing-firefox-update-channel">Firefox Extended Support Release</a>.
</li>
<li>
<code>PhantomJS 2.1</code> and <code>PhantomJS 1.9</code>: selects Safari versions similar<br /> to PhantomJS runtime.
</li>
</ul>
</li>
<li>
<code>extends browserslist-config-mycompany</code>: take queries from<br /> <code>browserslist-config-mycompany</code> npm package.
</li>
<li>
<code>supports es6-module</code>: browsers with support for specific features.<br /> <code>es6-module</code> here is the <code>feat</code> parameter at the URL of the <a rel="nofollow noopener" target="_blank" href="https://caniuse.com/">Can I Use</a><br /> page. A list of all available features can be found at<br /> <code>caniuse-lite/data/features</code>.
</li>
<li>
<code>browserslist config</code>: the browsers defined in Browserslist config. Useful<br /> in Differential Serving to modify user’s config like<br /> <code>browserslist config and supports es6-module</code>.
</li>
<li>
<code>since 2015</code> or <code>last 2 years</code>: all versions released since year 2015<br /> (also <code>since 2015-03</code> and <code>since 2015-03-10</code>).
</li>
<li>
<code>unreleased versions</code> or <code>unreleased Chrome versions</code>:<br /> alpha and beta versions.
</li>
<li>
<code>not ie <= 8</code>: exclude IE 8 and lower from previous queries.
</li>
</ul>
<p>
You can add <code>not </code> to any query.
</p>
<h3 dir="auto">
<a rel="nofollow noopener" target="_blank" id="user-content-grammar-definition" class="anchor" aria-hidden="true" href="#grammar-definition"></a>Grammar Definition
</h3>
<p>
There is a grammar specification about the query syntax,<br /> which may be helpful if you’re implementing a parser or something else.
</p>
<h3 dir="auto">
<a rel="nofollow noopener" target="_blank" id="user-content-debug" class="anchor" aria-hidden="true" href="#debug"></a>Debug
</h3>
<p>
Run <code>npx browserslist</code> in a project directory to see which browsers were selected<br /> by your queries.
</p>
<pre>$ npx browserslist
and_chr 61 and_ff 56 and_qq 1.2 and_uc 11.4 android 56 baidu 7.12 bb 10 chrome 62 edge 16 firefox 56 ios_saf 11 opera 48 safari 11 samsung 5
<h3 dir="auto">
<a rel="nofollow noopener" target="_blank" id="user-content-browsers" class="anchor" aria-hidden="true" href="#browsers"></a>Browsers
</h3>
<p>
The following table maps browser names & their target devices into identifiers used by browserslist.
</p>
<p>
Browser Name<br /> Desktop<br /> Android<br /> iOS<br /> Other Mobile
</p>
<p>
Android (WebView)
</p>
<p>
<code>Android</code>
</p>
<p>
Baidu<br /> <code>Baidu</code>
</p>
<p>
BlackBerry
</p>
<p>
<code>BlackBerry</code> <code>bb</code>
</p>
<p>
Chrome<br /> <code>Chrome</code>
</p>
<p>
<code>ChromeAndroid</code> <code>and_chr</code>
</p>
<p>
↪︎ <code>ios_saf</code>2
</p>
<p>
Edge<br /> <code>Edge</code><br /> ↪︎ <code>and_chr</code>
</p>
<p>
↪︎ <code>ios_saf</code>2
</p>
<p>
Electron<br /> <code>Electron</code>
</p>
<p>
Firefox
</p>
<p>
<code>Firefox</code> <code>ff</code>
</p>
<p>
<code>FirefoxAndroid</code> <code>and_ff</code>
</p>
<p>
↪︎ <code>ios_saf</code>2
</p>
<p>
Internet Explorer
</p>
<p>
<code>Explorer</code> <code>ie</code>
</p>
<p>
<code>ie_mob</code>
</p>
<p>
Node.js<br /> <code>Node</code>
</p>
<p>
<a rel="nofollow noopener" target="_blank" href="https://medium.com/design-at-kai/what-you-didnt-know-about-kaios-browser-53937ea1636">KaiOS Browser</a>
</p>
<p>
<code>kaios</code>
</p>
<p>
Opera<br /> <code>Opera</code>
</p>
<p>
<code>op_mob</code> 1
</p>
<p>
↪︎ <code>ios_saf</code>2
</p>
<p>
<a rel="nofollow noopener" target="_blank" href="https://en.wikipedia.org/wiki/Opera_Mini">Opera Mini</a>
</p>
<p>
<code>OperaMini</code>
</p>
<p>
<a rel="nofollow noopener" target="_blank" href="https://en.wikipedia.org/wiki/QQ_browser">QQ browser</a>
</p>
<p>
<code>and_qq</code>
</p>
<p>
Safari<br /> <code>Safari</code>
</p>
<p>
<code>iOS</code> <code>ios_saf</code>
</p>
<p>
Samsung Internet
</p>
<p>
<code>Samsung</code>
</p>
<p>
<a rel="nofollow noopener" target="_blank" href="https://en.wikipedia.org/wiki/UC_Browser">UC Browser</a>
</p>
<p>
<code>UCAndroid</code> <code>and_uc</code>
</p>
<ul dir="auto">
<li>
<code>↪︎ name</code> implies that the browser uses the same engine captured by <code>name</code>
</li>
<li>
1 Opera Mobile ≈ Chrome Android
</li>
<li>
2 <a rel="nofollow noopener" target="_blank" href="https://en.wikipedia.org/wiki/WebKit">All iOS browsers use WebKit</a>
</li>
</ul>
<h2 dir="auto">
<a rel="nofollow noopener" target="_blank" id="user-content-config-file" class="anchor" aria-hidden="true" href="#config-file"></a>Config File
</h2>
<h3 dir="auto">
<a rel="nofollow noopener" target="_blank" id="user-content-packagejson" class="anchor" aria-hidden="true" href="#packagejson"></a><code>package.json</code><br />
</h3>
<p>
If you want to reduce config files in project root, you can specify<br /> browsers in <code>package.json</code> with <code>browserslist</code> key:
</p>
<pre>{
“private”: true, “dependencies”: { “autoprefixer”: “^6.5.4” }, “browserslist”: [ “last 1 version”, “> 1%”, “not dead” ] }
<h3 dir="auto">
<a rel="nofollow noopener" target="_blank" id="user-content-browserslistrc" class="anchor" aria-hidden="true" href="#browserslistrc"></a><code>.browserslistrc</code><br />
</h3>
<p>
Separated Browserslist config should be named <code>.browserslistrc</code><br /> and have browsers queries split by a new line.<br /> Each line is combined with the <code>or</code> combiner. Comments starts with <code>#</code> symbol:
</p>
<pre># Browsers that we support
last 1 version > 1% not dead # no browsers without security updates
<p>
Browserslist will check config in every directory in <code>path</code>.<br /> So, if tool process <code>app/styles/main.css</code>, you can put config to root,<br /> <code>app/</code> or <code>app/styles</code>.<br /> You can specify…
</p>