browserslist 是什么?看这篇就够了

12,371 阅读4分钟

概述

简单来说,browserslist 就是一个用特定语句查询浏览器列表的工具,比如:

# 查询 Chrome 最后的两个版本
npx browserslist "last 2 Chrome versions" 
chrome 96
chrome 95

# 查询全球市场占有率大于 10% 的浏览器
npx browserslist "> 10%" 
and_chr 96
chrome 95

常见查询语法

本文只列出常见的查询语法,完整列表请查看:github.com/browserslis…

defaults

# 默认配置,相当于 > 0.5%, last 2 versions, Firefox ESR, not dead
npx browserslist "defaults"
and_chr 96
and_ff 94
and_qq 10.4
...

按市场占有率

# 全球市场占有率大于 5% 的浏览器
npx browserslist "> 5%"

# 全球市场占有率小于 5% 的浏览器
npx browserslist "< 5%"

# 查找 USA 地区市场占有率大于 5% 的浏览器
npx browserslist "> 5% in US"

# 查找 Asia 地区市场占有率大于 5% 的浏览器
npx browserslist "> 5% in alt-AS"

按最后版本

# 查找所有浏览器的最后 2 个版本
npx browserslist "last 2 versions"

# 查找 Chrome 浏览器的最后 2 个版本
npx browserslist "last 2 Chrome versions"

dead

# 查找超过 24 个月没被官方维护的浏览器,比如 IE10、BlackBerry 10 等
npx browserslist "dead"

按浏览器版本

# 查找 ios 7 系统使用的 safiri 的浏览器版本
npx browserslist "ios 7"

# 查找版本号大于 20 的所有 Firefox 的浏览器版本
npx browserslist "Firefox > 20"

# 按版本号范围查找
npx browserslist "Firefox 20-40"

# 查找 Firefox 的长期支持版本
npx browserslist "Firefox ESR"

supports es6-module

# 查找支持 es6 模块的浏览器
npx browserslist "supports es6-module"

组合查询

可通过 and、or、not 关键字进行组合查询。

and 为交集,每个条件相交的结果:

# 查找 Chrome 58 到 65 并且支持 es6-module 的版本,可以看到 Chrome 在 61 版本才开始支持 es6-module
npx browserslist "Chrome 58-65 and supports es6-module"
chrome 65
chrome 64
chrome 63
chrome 62
chrome 61

or 为并集,每个条件合并的结果:

# 查找 Chrome 与 Edge 大于 94 的版本
npx browserslist "Chrome > 94 or Edge > 94"
chrome 96
chrome 95
edge 96
edge 95

也可以用逗号代替 or:

# 等同于上述命令
npx browserslist "Chrome > 94,Edge > 94"

not 为非,取反:

npx browserslist "Chrome 58-65 and not supports es6-module"
chrome 60
chrome 59
chrome 58

配置文件

可以在根目录下创建 .browserslistrc 配置文件,然后在配置文件中编写查询条件。

.browserslistrc:

Chrome > 94
Edge > 94
npx browserslist
chrome 96
chrome 95
edge 96
edge 95

注意,配置文件中的换行表示 or。

caniuse-lite 与 caniuse-db

browserslist 是从 caniuse-lite 这个库中查询数据的,caniuse-lite 是 caniuse-db 的精简版本,对 caniuse-db 的数据按一定规则做了简化,减少了库的大小。

caniuse-db 则是 can i use 网站的数据源,提供了网站查询所需的所有数据,caniuse-db 发布时会同步发布 caniuse-lite。

由于它们都不属于线上数据库,使用时会将数据克隆至本地,所以可能会存在本地数据不是最新的情况,browserslist 提供了更新 caniuse-lite 的命令,可定期运行以获取最新数据:

npx browserslist@latest --update-db

作用

市面上有很多浏览器,每种浏览器又有不同的版本,所支持的环境各不相同,为了抹平它们之间的差异,于是出现了 Pollyfill 解决方案,Pollyfill 的作用是通过降级处理,让新的语法能够运行在其不被支持的浏览器环境中,常见的 Pollyfill 有 Babel、Autoprefixer 等。

以 Babel 为例,它是怎么判断项目是否需要做降级处理的呢,答案就是通过 browserslist 查询出需要支持的浏览器列表,然后根据这个列表来做判断。

用 Babel 验证一下,先安装 Babel:

npm install --save-dev @babel/core @babel/cli @babel/preset-env

创建 babel.config.json:

{
  "presets": ["@babel/preset-env"]
}

创建 .browserslistrc:

chrome 96

创建 index.js:

const say = (msg) => {
  console.log(msg)
}
say('hello')

运行 babel 编译命令:

./node_modules/.bin/babel index.js --out-dir lib

查看编译后的文件,发现并没有做降级处理,因为 chrome 96 本身就支持 const 和箭头函数:

"use strict";

const say = msg => {
  console.log(msg);
};

say('hello');

修改 .browserslistrc 让其支持 ie9:

chrome 96
ie 9

运行编译命令后查看编译文件,发现已做降级处理:

"use strict";

var say = function say(msg) {
  console.log(msg);
};

say('hello');

如果 .browserslistrc 包含版本较旧的浏览器,可能会增大打包文件的体积,因为一些 api 需要通过 Pollyfill 来实现,比如某些浏览器不支持 Promise,那么会在打包文件中注入 Promise 的补丁:

window.Promise = function () {}

而版本较新的浏览器本身就支持了 Promise,不需要打补丁。所以可以根据项目的实际情况适当的设置 .browserslistrc 以减小打包文件的体积。