Browserslist 终于干了件我一直想吐槽的事:你不用再靠“浏览器版本名单”去猜“平台能力边界”了。
以前每次看到项目里的 browserslist 配置我都挺别扭的——那串东西看着很工程化:
last 2 versions
not dead
> 0.2%
但你真要问一句:这到底对应了哪些 Web API 或 CSS 特性?大多数时候答案是沉默的。(或者更真实一点:大家开始去翻 Can I Use)
从 Browserslist 4.26.0 开始,它支持写 Baseline 目标:你可以用 baseline widely available / baseline newly available 这种“能力成熟度”的口径,去驱动下游的 Babel、Autoprefixer 等工具。
我更在意的其实是:以后你能用一句 baseline widely available 把目标讲清楚——我们默认哪些能力已经够稳,整个前端工具链该如何跟着收敛。
Baseline 的价值,不在“更潮”,在“少拍脑袋”
我见过太多团队的兼容策略,最后都变成一种玄学:
- 要么极度保守:新特性永远别用,反正没人敢担责任。
- 要么极度乐观:看到兼容表一片绿就上,出问题再说。
然后 browserslist 配置就慢慢长成祖传咒语:能跑就别动。(这句话我说得很心虚,因为我自己也干过)
Baseline 的好处是它把“能不能用”这件事,从“我猜这些浏览器版本应该够了”,变成一个更接近共识的信号:一组平台能力已经在主流浏览器里形成稳定交集。
你不用把它当成“权威答案”,但它至少让讨论更落地了:我们到底是要押注“某几个浏览器版本”,还是要押注“某一批已经稳定的平台能力”?
最关键的变化:Browserslist 现在能直接写 Baseline 了
以前你写的是浏览器范围,工具链再根据浏览器范围去推导要不要做这些事:
- Babel:要不要转译语法?
- Autoprefixer:要不要加前缀?
- polyfill(如果你还在用):要不要补?
- 产物体积:要不要为“理论上的兼容性”多背一堆包袱?
现在你可以把目标写得更像“工程语言”一点。
例如 .browserslistrc:
baseline widely available
或者你想更激进一点(我个人会先谨慎):
baseline newly available
同样也能写在 package.json:
{
"browserslist": [
"baseline widely available"
]
}

如果你想确认它到底会落到哪些具体的浏览器版本,直接用命令看结果比猜更靠谱:
npx browserslist "baseline widely available"
这一步我建议你真跑一下。因为“概念升级”很容易,产物有没有变大、前缀有没有变少、转译有没有变轻,得看实际输出——不然很容易写完配置还自我感动半天,最后构建结果啥也没变。
顺手再提醒一个很现实的坑:Browserslist 的判断背后依赖 caniuse-lite 数据库。如果你本地或 CI 里的数据版本老了,结果可能会怪怪的。
一般我会在升级或迁移配置前先跑一下这个命令,把数据库更新到最新:
npx update-browserslist-db@latest
(我以前干过最尴尬的一件事:把兼容配置“升级”完,结果打包体积涨了,最后还是靠线上报警才发现的。别学我。)
它到底会怎么影响你:别只盯着配置文件
Baseline 这件事如果落到日常工程里,我觉得你主要会感受到三种变化:

第一种是最直观的:CSS 前缀变少。
Autoprefixer 或一些 PostCSS preset 本来就依赖 Browserslist 的查询结果。你把目标从版本列表换成 Baseline 之后,哪些 CSS 前缀要保留、哪些可以丢弃,通常会有比较明显的差异。这个差异对最终的产物体积和 CSS 代码的可读性来说,是挺实在的优化。
第二种是你不一定第一时间注意到的:Babel 转译策略会变。
有些“纯粹为了兼容老旧浏览器”而加的语法转译步骤,现在可能可以少做一点,但也可能反过来在某些特性上变得更保守。别猜,直接对比构建前后的输出文件。
第三种是更隐蔽的:团队内外的沟通成本会下降。当大家明确目标是 “widely available” 的能力时,这些能力大概率能当作项目开发的默认前提;而不在这个范围内的特性,就别急着写进业务的关键路径里,或者需要明确标注并讨论兜底方案。
但别急着把旧配置一脚踢飞:我会先看这三件事
Baseline 很好用,但它不是“每个项目都应该立刻迁移”的魔法按钮。
我一般会先把问题问得更实际一点:
1)你的用户群够不够主流?
如果你做的是公开的 Web 产品、内容资讯站、企业中后台,用户基本都在用现代浏览器,那切换到 Baseline 会很舒服。
但如果你做的是企业内网、特殊工业设备上的应用、甚至是有“指定浏览器/指定版本”的硬性约束,那你最好先别急,老老实实用版本名单更稳妥。
2)你有没有“必须兼容”的特殊底线?
比如某些重要客户就是固定用某个版本的 Safari,或者你们的 App 内 WebView 版本很难升级。
这种情况下,Baseline 只能当个有益的参考,不能当作百分之百的保证书。
3)你们的工具链有没有历史包袱?
有些老项目的 Babel 配置、polyfill 引入方案、甚至 CSS 处理流程,本来就因为各种原因变成了“谁也不敢动”的雷区。
这种项目的迁移策略应该是:先把它当成一次可控的实验,别上来就当成一次大规模的重构。
还有一类情况我会额外谨慎:组件库或 SDK。
业务应用的兼容策略,说白了就是“对最终用户负责”;但组件库往往要对“下游无数项目的构建链”负责,你也不确定别人会怎么用你的库。这个时候 Baseline 当然能用,但你得先在文档里把话说清楚:你保证兼容到什么程度,哪些高级能力建议下游项目自己根据情况兜底。
我更推荐的迁移方式:先试一段,再决定要不要全面切换
我不会建议你上来就把现有的 browserslist 配置全盘推翻。
更稳妥的做法是把迁移拆成几个你可以验证、并且随时能回滚的动作:
- 先单开一个特性分支,把
browserslist 的查询条件改成 baseline widely available。
- 然后跑一遍完整的构建流程,别只“感觉良好”,直接对比产物体积、文件数量和构建输出的差异。
- 接着重点查看生成的 CSS 中,
-webkit-、-moz- 等前缀有没有明显减少(这个变化通常很直观)。
- 顺手再挑一个你团队之前不太敢用的新特性(比如某个 CSS 新语法或 JS API)验证一下:现在能不能安全地把之前的“保守兼容写法”删掉了。
这套流程看着普通,但特别适合团队协作:在代码评审(Code Review)的时候,你能把修改的意图说得很实在——我改这个配置不是为了追赶技术潮流,是因为前缀、语法转译和最终的产物确实发生了可验证的积极变化。
如果你想把它做得更工程化一点,在 Pull Request 的描述里加两句简洁的说明就行:你希望通过修改配置换来什么(如减少体积),以及你具体验证了什么(如对比了体积、检查了关键页面、测试了一个代表性特性)。别写成长篇大论,大家真的不会细看。
这件事我最喜欢的一点
我喜欢 Baseline 进入 Browserslist 的原因很朴素:它让“制定兼容策略”这件事,没那么容易跑偏。
我们到底在为什么负责?是为了一串浏览器版本号,还是为了一组确定的、可用的平台能力?
以前这个问题很容易被冗长的版本名单糊弄过去。名单写得越长,看起来越“稳”、越“安全”,但你其实很难说清它到底在保护什么,又为此付出了多少不必要的构建成本。
Baseline 进到 Browserslist 之后,至少你可以把团队内的技术讨论从“我们要兼容到哪些浏览器版本”,往前推半步变成:哪些 Web 能力已经可以当作我们项目的默认前提?哪些还得继续保持保守?
说白了,前端工程化这些年的配置越来越复杂,很多时候也不是开发者喜欢折腾,而是 Web 平台能力演进得太快、精准判断的成本太高,最后不得不在构建流程里堆叠一层又一层的“兼容保险”。
现在,我们有了一个更接近社区共识的、基于能力而非版本的尺子。它挺好用的,也值得你在下一个项目中尝试。对于更多类似的前端工程化思考与实践,欢迎到 云栈社区 与更多开发者交流探讨。