利用 caniuse 结合 browserslist 对 JS 做兼容性检测

背景

前端开发的时候,我们经常会查 caniuse 看看某个方法是否兼容性足够,一旦不小心忘记查,则有可能使用了目标浏览器不支持的方法导致功能不可用甚至低端机上白屏,长期以往会降低质量同学对自己的信任分,比如 array.at 需要 Chrome >= 92 方可使用,而我们的目标浏览器是 90+。兼容性问题比较耗时间复现,有没有彻底的解决之道?

有,我们可以利用 eslint。

第一次尝试 eslint-plugin-compat ❌

www.npmjs.com/package/esl... 第一眼看上去蛮不错的,周下载量挺高 62w,而且支持 browserslist。按照配置尝试下。

js 复制代码
{
  "plugins": ["compat"],
  "extends": ["plugin:compat/recommended"],
  "env": {
    "browser": true,
  },
  // ...
}

package.json:

json 复制代码
"browserslist": [
    "Chrome >= 52",
    "Firefox >= 100",
    ">0.5%",
    "not dead"
  ],

但是发现代码并未检测到预期报错:

ts 复制代码
const array = result.cost.toString().split('.');
const last = array.at(-1); // 不能检测此处误用

翻阅资料 issue#539 发现,并不是我们配置有误,而是该包能力有限,无法推导变量类型故并不能检测原型链方法(若仅根据名字检测,则有误伤,因为任何对象都可以定义一个叫做 at 的方法),仅能检测静态方法。可以验证下:

ts 复制代码
const b = [4, 5, 6].at(2); // 能检测到 error
const foo = Object.values({});  // 能检测到 error

该 issue 同时给出了一个包 github.com/koddsson/es... 但是美中不足是这个包每周下载量仅有 6

第二次尝试 eslint-plugin-typescript-compat ✔️

这次我们使用 Trae 的 chat 模式问问最新的 DeepSeek-V3-0324:

我需要有一个根据 browserslist 规则检测 ts 函数兼容的 eslint 插件,比如我设置browserslist 为 ["Chrome > 90"] 则,即需要能检测到原型链上的方法而不仅仅是 static 方法

ts 复制代码
 const b = [4, 5, 6].at(2); //  需要被 eslint 检测到 error

 const array = result.cost.toString().split('.');
 const last = array.at(-1); // 也需要 error

🤖:根据你的需求,目前有一个 ESLint 插件可以基于 browserslist 规则检测 TypeScript 代码中的浏览器兼容性问题,包括原型链上的方法和静态方法。这个插件是 eslint-plugin-typescript-compat

下载量最高 8K 多,还行,按照官方文档配置下试试:

ts 复制代码
const array = result.cost.toString().split('.');
const last = array.at(-1); // 能检测到
const b = [4, 5, 6].at(2); // 能检测到
const foo = Object.values({}); // Chrome 54 即可支持,故此处不报错符合预期
console.log('last:', last, b, foo);

既能检测静态方法也能检测原型链方法,完美!

下一篇将介绍如何利用 caniuse 结合 browserslist 对 CSS 做兼容性检测。

相关推荐
yume_sibai20 小时前
大屏数据可视化 - 边框红绿呼吸灯实现详解
前端·信息可视化·typescript
豆包MarsCode1 天前
我用 TRAE Work 做了一个 C盘清理工具
trae
孟无岐1 天前
LayaAir IDE 插件开发入门:用 TypeScript 给编辑器加一个自己的面板
typescript·游戏开发·工程化·编辑器扩展·layaair·ide 插件
shakingWaves1 天前
better auth worker on cloudflare
typescript·cloudflare·auth·better-auth
退休倒计时2 天前
【每日一题】LeetCode 437. 路径总和 III TypeScript
算法·leetcode·typescript
柯克七七2 天前
给老项目加了 TypeScript,本来只想自己爽,结果全公司代码审查标准被我抬高了
前端·vue.js·typescript
yume_sibai2 天前
高德地图骑行导航 API 介绍与使用方法
前端·typescript
一叶飘零_sweeeet2 天前
IDEA 插件 Trae AI 最新全攻略(基于 TRAE AI: Coding Assistant 1.7.0.0)
java·intellij-idea·trae
子兮曰3 天前
TypeScript 7.0 RC 深度解读:Go 重写完成,10 倍提速,编译器的「奇点时刻」
前端·后端·typescript
BAIGAOa3 天前
不止 React:我开源了一个框架无关的终端键盘引擎,Vue/Svelte 都能用
typescript