Browserslist 信息和配置使用整理

news2024/10/5 19:18:46

我们可以在各种前端工程看到 Browserslist 的配置身影,看似简单但实际上可能会有暗坑导致线上兼容问题,借此文来整理下 Browserslist 的信息。

Browserslist 是由 Autoprefixer 团队维护的一个开源项目,用于自动处理 CSS 和 JavaScript 文件的浏览器兼容性前缀和 polyfill。官方描述:

Share target browsers between different front-end tools, like Autoprefixer, Stylelint and babel-preset-env.用在不同的前端开发工具之间,分享指定的目标浏览器。像是 Autoprefixer,Stylelint,和 babel-preset-env。

Browserslist 主页:https://github.com/ai/browserslist、https://browsersl.ist/

定义

Browserslist 是一个根据目标浏览器(target browser)检查支持浏览器版本的 js 库。它是现代前端工程化不可或缺的工具,无论是处理 js 的 babel 还是处理 css 的 postcss,凡是与垫片相关的,他们背后都有 Browserslist 的身影。比如(后文也有介绍):

  • babel,在 @babel/preset-env 中使用 core-js 作为垫片(polyfill)
  • postcss 使用 autoprefixer 作为垫片

在前端工程化实践中,当我们确认了浏览器版本号,那么它的 polyfill 体积就会确认。关于 polyfill 我们一般都知道有一下规律:

  • 由于低版本浏览器/低版本Nodejs的存在,polyfill 在大多工程项目中是必不可少的;
  • polyfill 越少,打包体积越小;
  • 随着时间的推移,浏览器版本越新,polyfill 越少。

因此,Browserslist 既然会影响 polyfill,进而会影响项目兼容情况以及工程产物体积。

Browserslist 原理

Browserslist 的基本处理是:Browserslist 引擎根据正则解析查询语句,对浏览器版本数据库 caniuse-lite 进行查询,返回所得的浏览器版本列表。请求处理流程如下:

p-flow

caniuse-lite 这个库也由 browserslist 团队进行维护,它是基于 caniuse 的数据库进行的数据整合。caniuse-lite 库是 CanIUse (这个网站用来查询浏览器兼容性)的数据库的小版本,只有一些必需数据,这些数据存放在 caniuse-lite/data 中

因为 Browserslist 并不维护数据库,因此它会经常提醒你去更新 caniuse-lite 这个库,由于 lock 文件的存在,因此需要使用以下命令手动更新数据库。

npx browserslist@latest --update-db

该命令将会对 caniuse-lite 进行升级,并体现在 lock 文件中。此更新将为 Autoprefixer 或 Babel 等 polyfill 工具带来有关新浏览器的数据,并减少已经不必要的 polyfill,因此比较好的实践做法是——我们可以定期更新。

需要定期更新主要有如下三个原因:

  • 在查询中使用最新的浏览器版本和统计信息:例如 last 2 versions or >1% ,如果在 2 年前创建了项目但是没有更新依赖项,那么返回结果是 2 年前的浏览器;
  • 实际的浏览器数据将导致使用更少的 polyfill。它将减少 js 和 css 文件的大小并提高网站性能。
  • caniuse-lite 重复数据删除:在不同工具中同步版本。

现代CI/CD一般都是重新安装依赖并构建项目,所以在没有做缓存的情况下基本都是最新的数据,这样能保持最新但也有兼容处理的隐患(见后文实践提醒)

配置查询

如果选择的前端工具包括对 Browserslist 的支持,它将在以下位置查找指定浏览器版本的查询,从第一个到最后一个,Browserslist 将使用如下配置文件限定的的浏览器和 node 版本范围:

  • 工具 options,例如 Autoprefixer 工具配置中的 browsers 属性。
  • BROWERSLIST 环境变量。
  • 当前目录或者上级目录的 browserslist 配置文件。
  • 当前目录或者上级目录的 .browserslistrc 配置文件。
  • 当前目录或者上级目录的 package.json 配置文件里面的 browserslist 配置项(推荐)。

如果上述的配置文件缺失或者其他因素导致未能生成有效的配置,browserslist 将使用default配置> 0.5%, last 2 versions, Firefox ESR, not dead

Browserslist 使用者

目前主要前端工程工具都或多或少用到了 Browserslist,如:

users

  • Autoprefixer:Autoprefixer browserslist 从 package.json. 您无需执行任何其他操作——Autoprefixer 会自动查找并加载配置。
  • babel-preset-env是“JavaScript 的自动前缀”。如果它已经知道所有目标浏览器都支持它,它就不会编译 ES2015+ 语法。如:
    "babel": {
      "presets": [
        [
          "env",
          {
            "targets": {
              "browsers": "last 2 version",
              "node": 4
            },
            "loose": true
          }
        ]
      ]
    }
    
  • eslint-plugin-compat:是 ESLint 的一个插件,当并非所有目标浏览器都支持您的 JavaScript 代码时,它会向您发出警告。它支持开箱即用的 Browserslist 配置;它获取目标浏览器版本列表并检查您的代码是否使用所有指定浏览器支持的 JavaScript API。
  • stylelint-no-unsupported-browser-features 的工作方式类似于 eslint-plugin-compat— 但适用于 CSS。Stylelint 是一个出色且最流行的 CSS linter。这个 Stylelint 插件确保所有目标浏览器都支持所有使用的 CSS 属性。它还支持开箱即用的 Browserslist 配置。
  • postcss-normalize 仅包含normalize.css的必要部分 ,基于您支持的浏览器列表。

使用/常用配置

根据用户份额:

  • > 5%: 在全球用户份额大于 5% 的浏览器
  • > 5% in CN: 在中国用户份额大于 5% 的浏览器

根据最新浏览器版本

  • last 2 versions: 所有浏览器的最新两个版本
  • last 2 Chrome versions: Chrome 浏览器的最新两个版本

不再维护的浏览器

dead: 官方不在维护已过两年,比如 IE10

*官方提供的查询

你可以用如下查询条件来限定浏览器和 node 的版本范围(大小写不敏感):

  • > 5%: 基于全球使用率统计而选择的浏览器版本范围。>=,<,<=同样适用。
  • > 5% in US : 同上,只是使用地区变为美国。支持两个字母的国家码来指定地区。
  • > 5% in alt-AS : 同上,只是使用地区变为亚洲所有国家。这里列举了所有的地区码。
  • > 5% in my stats : 使用定制的浏览器统计数据。
  • cover 99.5% : 使用率总和为 99.5%的浏览器版本,前提是浏览器提供了使用覆盖率。
  • cover 99.5% in US : 同上,只是限制了地域,支持两个字母的国家码。
  • cover 99.5% in my stats :使用定制的浏览器统计数据。
  • maintained node versions :所有还被 node 基金会维护的 node 版本。
  • node 10 and node 10.4 : 最新的 node 10.x.x 或者 10.4.x 版本。
  • current node :当前被 browserslist 使用的 node 版本。
  • extends browserslist-config-mycompany :来自 browserslist-config-mycompany 包的查询设置
  • ie 6-8 : 选择一个浏览器的版本范围。
  • Firefox > 20 : 版本高于 20 的所有火狐浏览器版本。>=,<,<=同样适用。
  • ios 7 :ios 7 自带的浏览器。
  • Firefox ESR :最新的火狐 ESR(长期支持版) 版本的浏览器。
  • unreleased versions or unreleased Chrome versions : alpha 和 beta 版本。
  • last 2 major versions or last 2 ios major versions :最近的两个发行版,包括所有的次版本号和补丁版本号变更的浏览器版本。
  • since 2015 or last 2 years :自某个时间以来更新的版本(也可以写的更具体 since 2015-03 或者 since 2015-03-10)
  • dead :通过 last 2 versions 筛选的浏览器版本中,全球使用率低于 0.5% 并且官方声明不在维护或者事实上已经两年没有再更新的版本。
  • last 2 versions: 每个浏览器最近的两个版本。
  • last 2 Chrome versions: chrome 浏览器最近的两个版本。
  • defaults: 默认配置> 0.5%, last 2 versions, Firefox ESR, not dead
  • not ie <= 8: 浏览器范围的取反。

debug

直接在工程目录下运行 npx browserslist 来查看你配置的筛选条件筛选出的浏览器版本范围。

注意事项

Browserslist 会处理浏览器的每个版本,所以应该避免配置这样的查询条件 Firefox > 0.

多个查询条件组和在一起之后,其之间的的覆盖是以 OR 的方式,而是不是 AND,也就是说只要浏览器版本符合筛选条件里面的一种即可。

所有的查询条件均基于 caniuse 的支持列表。例如:last 3 ios versions 可能会返回 8.4, 9.2, 9.3(混合了主版本和次版本),然而 last 3 Chrome versions 可能返回 50, 49, 48(只有主版本)。

组合查询

可通过 andornot 关键字进行组合查询。

组合器类型说明例子
and为交集,每个条件相交的结果Chrome 58-65 and supports es6-module:查找 Chrome 58 到 65 并且支持 es6-module 的版本。
or为并集,每个条件合并的结果。也可以用逗号代替 orChrome > 94 or Edge > 94Chrome > 94,Edge > 94:查找 Chrome 与 Edge 大于 94 的版本。
not为非,取反> .5% and not last 2 versions> .5% or not last 2 versions> .5%, not last 2 versions:使用率大于 0.5% 的版本中排除不是最后两个版本。

配置落地形式

1.package.json

如果你想减少工程根目录下的配置文件的数量,可以在 package.json 中设置 browserslist 配置项,如下所示:

{
  "private": true,
  "dependencies": {
    "autoprefixer": "^6.5.4"
  },
  "browserslist": ["last 1 version", "> 1%", "IE 10"]
}

2.配置文件

Browserslist 配置文件应该被命名为 .browserslistrc 或者 browserslist 每条查询条件独占一行。 注释用 # 开头:

# Browsers that we support

last 1 version
> 1%
IE 10 # sorry

browserslist 将检查 path 路径上每一级目录下面是否有配置文件. 所以,如果工具要处理的文件路径是这样的 app/styles/main.css, 那么你可以将配置文件放置在根目录, app/ 或者 app/styles

也可以在 BROWSERSLIST_CONFIG 环境变量中直接指定配置文件的路径 。

3.Shareable Configs

可以使用如下写法,从另外一个输出 browserslist 配置的包导入配置数据:

  "browserslist": [
    "extends browserslist-config-mycompany"
  ]

为了安全起见,额外的配置包只支持前缀 browserslist-config- 的包命名. npm 包作用域也同样支持 @scope/browserslist-config,例如: @scope/browserslist-config or @scope/browserslist-config-mycompany.

当写一个 shared config package 时,必须导出一个数组。如 browserslist-config-mycompany/index.js:

module.exports = ['last 1 version', '> 1%', 'ie 10'];

4.环境的差异化配置

你可以为不同的环境配置不同的浏览器查询条件。 browserslist 将依赖 BROWSERSLIST_ENV 或者 NODE_ENV 查询浏览器版本范围 . 如果两个环境变量都没有配置正确的查询条件,那么优先从 production 对应的配置项加载查询条件,如果再不行就应用默认配置。

如在package.json

  "browserslist": {
    "production": [
      "> 1%",
      "ie 10"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version"
    ]
  }

或在.browserslistrc

[production staging]
> 1%
ie 10

[development]
last 1 chrome version
last 1 firefox version

5.使用自定义数据

这需要 Google Analytics,然后可以通过数据生成browserslist-stats.json

npx browserslist-ga

你也可以通过其它方式得到统计,但是最终数据生成的内容格式应保持如下:

{
  "ie": {
    "6": 0.01,
    "7": 0.4,
    "8": 1.5
  },
  "chrome": {},}

Browserslist 的 js API

可先看这段代码:

const browserslist = require('browserslist');

// Your CSS/JS build tool code
const process = function (source, opts) {
  const browsers = browserslist(opts.browsers, {
    stats: opts.stats,
    path: opts.file,
    env: opts.env,
  });
  // Your code to add features for selected browsers
};

查询可以是字符串 "> 1%, IE 10" 或数组 ['> 1%', 'IE 10']

如果缺少查询,browserslist 将查找配置文件。您可以提供一个路径选项(可以是一个文件)来查找相对于它的配置文件。

Options:

  • path: 文件或目录路径来查找配置文件。默认为.
  • env: 从配置中使用什么环境部分。默认为 production
  • stats: 自定义使用统计数据
  • config: 如果要手动设置,则配置路径
  • ignoreUnknownVersions: 不要直接查询(例如 12)。默认为 false
  • dangerousExtend: 禁用扩展查询的安全检查。默认为 false

对于非 js 环境和调试目的,可以使用 cli 工具:

browserslist "> 1%, IE 10"

覆盖率查询

可以通过 js API 获得所选浏览器的总用户覆盖率:

browserslist.coverage(browserslist('> 1%'));
//=> 81.4

或者通过 cli:

browserslist --coverage=US "> 1% in US"

在线覆盖情况查询

地址:https://browsersl.ist/、https://browserslist.dev/

效果:

dev

ist

衍生工具

browerslist 衍生的工具,具体可见browserslist tools

  • browserslist-ga或browserslist-ga-export: 该工具能生成访问你运营的网站的浏览器的版本分布数据,以便用于类似> 0.5% in my stats 查询条件, 前提是你运营的网站部署有 Google Analytics。
  • browserslist-useragent : 检验 某浏览器的 user-agent 字符串是否匹配 browserslist 给出的浏览器范围。
  • browserslist-useragent-ruby : 功能同上,ruby 库。
  • caniuse-api: 返回支持指定特性的浏览器版本范围
  • npx browserslist :在前端工程目录下运行上面命令,输出当前工程的目标浏览器列表。

Browserslist 2(V2版本)

last n versions 为更好的网络而改变

从一开始,Autoprefixer 就 last 2 versions 选择了最后的 2 个浏览器版本,但不是从所有浏览器中挑选出来,只是最流行的那些。事实证明,这是一个错误。

现实世界中没有“主流”浏览器。例如,中国在线市场巨大,在中国有很多流行的本地浏览器。我们不能仅仅忽略本地浏览器——每个人都应该可以访问网络。

事实上,Autoprefixer 本身的创建是为了阻止浏览器的差异化(例如-webkit-对移动浏览器使用 -only 前缀)。

这就是为什么 Autoprefixer 7 和 Browserslist 2 last 2 version 会选择 所有浏览器的 2 个最新版本。

不用担心大小,——gzip 可以很好地压缩前缀,因此您很可能不会看到任何大小差异。

缓存

Browserslist 在托管过程中缓存它从 package.jsonbrowserslist 文件中读取的配置,以及有关文件存在的知识。

要清除这些缓存,请使用:

browserslist.clearCaches();

要完全禁用缓存,请设置 BROWSERSLIST_DISABLE_CACHE 环境变量。

*实践提醒

1.小心lastnot dead

国内场景(比如2C、2G场景)不推荐用 last 2 Chrome versionsnot dead 的查询条件来锁定特别具体的浏览器品牌和版本。市面上有各种各样的浏览器,同时浏览器的版本碎片化也很严重,如果你在开发一款通用的 webapp,那就应该考虑浏览器多样性导致的兼容问题。(not dead在国内外的差异见下图)

not dead 国内覆盖率只有 73%

notdead1

not dead 全球有 86.4%
notdead2

2.定期更新

定期更新 caniuse-lite 数据库和本地 browerslist 配置。这点在上文有有所介绍,是一个好习惯。


相关链接

  • https://github.com/ai/browserslist
  • https://evilmartians.com/chronicles/autoprefixer-7-browserslist-2-released
  • https://css-tricks.com/browserlist-good-idea/
  • http://browserl.ist/
  • https://browserslist.dev/
  • https://github.com/browserslist/update-db#readme

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/977550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

opencv识别一张图片的多个红框,并截取红框的内容

需求 需要获取图片的红框的内容&#xff0c;实体的图片我就不放了 获取红框 先截取获得图片的多个轮廓 import cv2 import numpy as np # 加载图像并转换为灰度图像 image cv2.imread(image6.jpg) gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 应用高斯模糊以减…

基本的 Linux 命令以及 Linux 目录结构

目录 什么是Linux&#xff1f; ls - 列出文件和目录 pwd - 显示当前工作目录 cd - 切换目录 mkdir - 创建目录 touch - 创建空文件 rm - 删除文件和目录 cp - 复制文件和目录 mv - 移动和重命名文件和目录 文件系统基础 Linux 操作系统是开源且强大的操作系统&…

流媒体之推流和拉流

推流&#xff1a;将直播内容推送至服务器的过程 拉流&#xff1a;为服务器已有直播内容&#xff0c;用指定地址进行拉取的过程 什么是推流&#xff1f; 推流&#xff0c;指的是把采集阶段封包好的内容传输到服务器的过程。其实就是将现场的视频信号传到网络的过程。“推流”…

D. Sorting By Multiplication(贪心)

Problem - D - Codeforces 给定一个长度为n的数组a&#xff0c;由正整数组成。 您可以对该数组执行以下操作任意次数&#xff08;可能为零&#xff09;&#xff1a; 选择三个整数l、r和x&#xff0c;使得1≤l≤r≤n&#xff0c;并将满足l≤i≤r的每个ai乘以x。 请注意&#…

操作系统内存(32位为例)

0、OS能使用最大的虚拟内存和物理内存 最大的虚拟内存与寻址总线有关。一般是40根&#xff0c;对应256T 最大的物理内存与PTE的位数有关。 10-10-12分页模式下是32位&#xff0c;所以最大寻址空间就4G 1、CPU分页模式 分类 还有5-level&#xff0c;一般适用于大型服务器。…

【Springcloud】Seata分布式事务

【Springcloud】Seata分布式事务 【一】基本介绍&#xff08;1&#xff09;什么是分布式事务&#xff08;2&#xff09;为什么要使用分布式事务&#xff08;3&#xff09;seata分布式事务 【二】下载方式【1】Windows平台安装包下载 【三】如何使用【1】创建相关测试数据库和表…

每日刷题-1

目录 一、选择题 二、编程题 1、组队竞赛 2、删除公共字符 一、选择题 1、 解析&#xff1a;%s遇到\0会停止&#xff0c;%m.ns中m表示字符串宽度&#xff0c;n表示左起取目标字符串n个字符&#xff0c;右对齐&#xff0c;&#xff08;如果想要左对齐&#xff0c;可以写成%-m.n…

【C++学习笔记】5、变量作用域

文章目录 【 1、局部变量 】【 2、全局变量 】【 3、局部变量和全局变量的初始化 】 作用域是程序的一个区域&#xff0c;一般来说有三个地方可以定义变量&#xff1a; 在函数或一个代码块内部声明的变量&#xff0c;称为局部变量。 在函数参数的定义中声明的变量&#xff0c;称…

【LeetCode】剑指 Offer <二刷>(2)

目录 题目&#xff1a;剑指 Offer 04. 二维数组中的查找 - 力扣&#xff08;LeetCode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;剑指 Offer 05. 替换空格 - 力扣&#xff0…

【ROS 05】ROS常用组件

在ROS中内置一些比较实用的工具&#xff0c;通过这些工具可以方便快捷的实现某个功能或调试程序&#xff0c;从而提高开发效率&#xff0c;本章主要介绍ROS中内置的如下组件: TF坐标变换&#xff0c;实现不同类型的坐标系之间的转换&#xff1b;rosbag 用于录制ROS节点的执行过…

基于springboot实现了后台定时统计数据报表并将数据生成excel文件作为附件,然后通过邮件发送通知的功能

概述 本例子基于springboot实现了后台定时统计数据报表并将数据生成excel文件作为附件&#xff0c;然后通过邮件发送通知的功能。 详细 一、准备工作 1、首先注册两个邮箱&#xff0c;一个发送邮箱&#xff0c;一个接收邮箱。 2、发送邮箱开启IMAP/SMTP/POP3服务&#xff0c…

服务器间 ssh 免密登录

1、在所有服务器生产密钥文件 ssh-keygen -t rsa一直空格就可以 2、查看所有节点的公钥文件 cat /home/bigdata/.ssh/id_rsa.pub3、将所有节点的公钥文件写入到authorized_keys文件中 4、将authorized_keys文件分发给其他节点并修改权限 #注意查看authorized_keys文件的权…

131.【MySQL_基础篇】

MySQL_基础篇 (一)、MySQL 介绍1.MySQL三大阶段(1).基础篇(2).进阶篇(3).运维篇 2.MySQL 概念3.数据模型(1).关系型数据库(RDBMS) 4.数据库三大范式 (二)、SQL 编程语言1.SQL通用语法2.SQL 四大分类3.DDL (数据定义语言)(1).数据库操作 ->(增删改查)(2).表操作 -> (增删改…

整数拆分【动态规划】

整数拆分 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 class Solution {public int integerBreak(int n) {int[] dp new int[n 1];//正整数&#x…

day 48|● 583. 两个字符串的删除操作 ● 72. 编辑距离

583. 两个字符串的删除操作 dp的含义&#xff1a;指0开头&#xff0c;i- 1和j - 1为结尾的两个序列的删除最小数 递推公式方面&#xff1a; 初始化方面&#xff1a;前面0行和0列的初值要赋好 func minDistance(word1 string, word2 string) int {dp : make([][]int, len(wor…

工具教程【甜心转译】-双语字幕、中文语音生成,打破信息差

甜心转译是一款AI加持的音/视频生成双语字幕、中文语音的软件。帮助人们更容易的获取外语信息、不管是学习、还是娱乐&#xff0c;快人一步。 主要功能 字幕生成&#xff1a;只需几个简单的步骤&#xff0c;轻松生成字幕。字幕翻译&#xff1a;只需一键&#xff0c;就可以将字…

JavaScript代码中字符串如何换行?

在工作中&#xff0c;代码提交之前可能会有一些语法检查的限制&#xff0c;限制我们的单行代码长度。 对于一些逻辑代码&#xff0c;有多种换行方式。这里主要记录一下对于字符串过长情况的处理方式。 对于字符串&#xff0c;除了使用 进行字符串拼接之外&#xff0c;也可以…

算法通关村第12关【青铜】| 字符串转换问题

1.转换成小写字母 思路&#xff1a;ASCll码中&#xff0c;a-z&#xff1a;97-122 A-Z&#xff1a;65-90 小写转大写-32&#xff0c;大写转小写32 class Solution {public String toLowerCase(String s) {int len s.length();StringBuilder str new StringBuilder();for(int…

windos设置环境变量--java环境变量

1.右键此电脑---属性 2.点高级系统设置 3.点环境变量 4.点新建--自定义变量名 5.找到安装路径&#xff0c;并且找到bin目录下的启动程序 验证&#xff1a;winR 输入cmd

Elasticsearch 全文搜索引擎 ---- IK分词器

原理&#xff1a;分词的原理&#xff1a;二叉树 首先讲一下为什么要出这个文章&#xff0c;前面我们讲过分词方法&#xff1a;中文分词搜索 pscws&#xff08;感兴趣的同学可以去爬楼看一下&#xff09;&#xff0c;那为什么要讲IK分词&#xff1f;最主要的原因是&…