前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Eslint 会被 Oxlint 干掉吗?

Eslint 会被 Oxlint 干掉吗?

作者头像
公众号@魔术师卡颂
发布于 2023-12-18 10:30:44
发布于 2023-12-18 10:30:44
59700
代码可运行
举报
文章被收录于专栏:魔术师卡颂魔术师卡颂
运行总次数:0
代码可运行

大家好,我卡颂。

最近,一款基于Rustlinter工具Oxlint在国外前端圈引起热烈讨论,很多大佬给出了高度评价。

他相比于老大哥Eslint有什么优势?未来他会取代老大哥么?本文让我们来聊聊这个话题。

Oxc与Oxlint

oxlintOxc项目旗下的一款产品,Oxc作为一款Rust实现的前端工具链集合,包括:

  • linter,即oxlint,对标Eslint,本文的主角
  • Parser,即oxc_parser,用于解析.js(x).ts(x),对标swc基准测试[1]据称比swc快2倍
  • Resolver,解析esmcjs文件路径,对标webpack/enhanced-resolve基准测试[2]据称比webpack快28倍
  • formatter,对标Prettier,还未公布
  • transpiler,对标babel,用于将高级语法转译为低级语法,还未公布
  • minifier,代码压缩工具,还未公布

Oxc抱有同样设计理念(都是基于Rust开发的工具链工具)的还有BiomeRuff,其中:

  • Biome比较命途多舛。他的前身是Rome,由Babel作者「Sebastian McKenzie」开发,和Oxc一样目标语言是JS
  • Ruff的目标语言是Python

Oxlint的介绍

Oxlint之所以引发热烈讨论,主要原因是「他的性能太炸裂了」

尤大用Oxlint跑了Vue3仓库,~590个文件跑~200条规则,仅用时50ms。

我自己(苹果M1 pro,32G)跑一个大概50个文件的小项目,也只用了18ms,官方宣称的在基准测试中比Eslint快50~100倍果然不是空穴来风。

当然,除了「性能优势」Oxlint与老大哥Eslint还有很多区别。接下来我们从3个角度对比OxlintEslint

  1. 易用性
  2. 诊断可读性
  3. 参与成本

易用性

Eslint诞生于2013年,他相比于竞争对手(JSHintJSHint)最大的优势是「提供了大量可选的规则,并且一些场景下对于不符合规则的代码可以自动修复」

但是,随着时代的进步,他的优势逐渐变为劣势 —— 开发者不再需要大量自定义规则,而是需要「开箱即用的规则集的最佳实践」。在此理念下诞生了很多新产品,比如:

  • 仅针对「代码风格」做出检查和格式化的Prettier
  • antfu定制版规则集eslint-plugin-antfu[3]

Oxlint吸取了上述产品的优点,默认提供了一套开箱即用的规则集。这套规则集主要关注「代码的正确性」(比如「语法错误」「冗余代码」「容易造成误解的语法」)而不是「代码的细节优化」(比如语法的性能、风格)。

所以,你只需要在项目执行如下命令,就能满足常规的校验:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npx oxlint@latest

从易用性上看,OxlintEslint强很多。

诊断可读性

linter诊断出问题后,会给开发者提供相关信息。Eslint给的信息通常比较简短,只告诉你「为什么报错」。比如对于如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let a;

通过信息「a is defined but never used」可以知道报错原因是「a定义了但未使用」

但如果是更复杂的规则,简短的信息可能并不能直观表达「具体哪里报错」以及「解决办法」,很多时候我们还需要查下规则文档,看看这条规则的具体含义,再结合报错的代码分析

相比于EslintOxlint的信息更直观与准确。举个例子,下面的代码执行后会得到「数字翻倍的数组」

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const numbers = [1, 2, 3, 4, 5];

const result = numbers.reduce((accumulator, current) => {
  return [...accumulator, current * 2];
}, []);

// [ 2, 4, 6, 8, 10 ]
console.log(result);

这里每次执行reduce回调都会将数组展开,当数组比较长时会造成性能问题。

对此,Oxlint的信息包括三部分:

  • 为什么报错
  • 具体哪里报错
  • 怎么解决

这段示例代码比较简短,可能体现不出Oxlint信息的价值,让我们看看下面这段报错信息:

一眼就能看出是哪个reduce(紫色字体)中的哪个展开操作(青色字体)引发的问题。

虽然有些同学会说:如果项目大了,lint信息这么详细看的人脑袋痛。

但我们要知道 —— 「你能提供,但我不用」「你不能提供」完全是两个概念。

「诊断可读性」看,OxlintEslint更优秀。

参与成本

「参与成本」是指开发者自定义规则的成本。OxlintRust编写的,如果开发者自定义规则也得写Rust,那成本就太高了。相比之下,Eslint的规则都是JS编写的,成本低很多。

Oxlint从2个角度出发尝试解决这个问题:

  1. 你别自己写了,官方将常用的规则都写好了

截止本文发稿,官方实现了200个左右的规则,从名字就能看出,这些规则是从各个常见库的最佳实践中摘出来的,比如:

  • jest: no-confusing-set-timeout
  • react: jsx-no-duplicate-props
  • eslint: default-case-last
  • typescript: no-unnecessary-type-constraint
  1. 实现一套专门编写规则的DSL

Oxlint正在研究开发一套DSL,专门用来编写规则。至于这套DSL何时问世、好不好用暂不得知。

「参与成本」角度看,Eslint完胜。

Oxlint会取代Eslint么?

基于已知的现状 —— Oxlint规则参与成本高于Eslint,只要这个问题不解决,就一定存在某些Eslint支持,但Oxlint不支持的规则。所以,要完全取代Eslint,短期内并不现实。

但是,就像Vite之于Webpack,前者也没有实现后者的所有功能。但只要满足开发者最常见的90%需求且体验更好,就能从Webpack手中抢走大部分用户。

Oxlint显然也是这么做的 —— 他们建议开发者在lint-stagedCI设置中先运行Oxlint再运行ESLint。这样,大部分常见问题还没走到Eslint这一步就被Oxlint挡住了。

这种方式能显著提高lint流程的速度,且上手成本极低。所以很可能在开发者中快速普及开。

当这种方式普及后,随着Oxlint规则覆盖度与日俱增,会在「最常见的90%需求」中逐渐取代Eslint

届时,会形成一种Oxlint为主,Eslint为辅(处理少量特殊规则)的局面。

从这个角度看,Oxlint的赢面很大。

后记

虽然Oxlint有着不错的前景,但当前他还存在一些不足,比如:

  • 框架语法支持度不高

Oxlint原生支持js(x)ts(x),但不支持SvelteVue模版语法。

  • vscode插件还不稳定,有bug

比如下面代码中警告的应该是第1、3行,但是第2行也被标记了。

相信随着开发团队的持续投入,社区生态的形成,Oxlint及其背后的Oxc会有不错的未来。

参考资料

[1]

基准测试: https://github.com/oxc-project/bench-javascript-parser-written-in-rust

[2]

基准测试: https://github.com/oxc-project/bench-nodejs-resolver

[3]

eslint-plugin-antfu: https://github.com/antfu/eslint-plugin-antfu?tab=readme-ov-file

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 魔术师卡颂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
VoidZero 的野心,开发者的福音!
昨天分享了尤雨溪公司 VoidZero 最新的产品 TSDown,我相信肯定有同学和我一样好奇,尤雨溪为什么要推出这么多工具,来增加大家的学习压力!
萌萌哒草头将军
2025/04/23
990
VoidZero 的野心,开发者的福音!
Eslint团队终于妥协了...
配置过代码格式化的同学一定纠结过如下问题:Eslint和Prettier都能格式化代码风格,是单用Eslint,还是两个一起用呢?
公众号@魔术师卡颂
2023/10/31
4370
Eslint团队终于妥协了...
Biome:更快的格式化和 Linting
大家好,今天要介绍一个超棒的工具链——Biome,它是为网络项目量身打造的,旨在为开发者提供维护项目健康的工具。
chuckQu
2024/04/25
4450
Biome:更快的格式化和 Linting
Bytebase:统一数据库 CI/CD 解决方案 | 开源日报 No.128
Bytebase 是一个数据库 CI/CD 解决方案,为开发人员和 DBA 提供统一的工具来管理不同数据库系统的开发生命周期。其主要功能包括标准化操作流程、SQL 代码审查、GitOps 集成以及数据访问控制等。关键特性和核心优势包括:
小柒
2023/12/26
3700
Bytebase:统一数据库 CI/CD 解决方案 | 开源日报 No.128
从 ESLint 和 Prettier 到 Biome:前端代码质量的新纪元
在前端开发的世界里,ESLint 和 Prettier 已经成为确保代码一致性和无错误的标准工具。随着项目的复杂性增加,工具的性能问题和配置冲突也逐渐显现。而现在,一个新的全能工具——Biome 正在崭露头角,它整合了 ESLint 和 Prettier 的功能,并且通过更高效的底层架构,简化了开发者的工作流程。
井九
2024/10/12
2480
Eslint 的实现原理,其实挺简单
Eslint 是我们每天都在用的工具,我们会用它的 cli 或 api 来做代码错误检查和格式检查,有时候也会写一些 rule 来做自定义的检查和修复。
神说要有光zxg
2021/11/09
7060
Eslint 的实现原理,其实挺简单
【JS】308- 深入理解ESLint
小沈是一个刚刚开始工作的前端实习生,第一次进行团队开发,难免有些紧张。在导师的安排下,拿到了项目的 git 权限,开始进行 clone。
pingan8787
2019/08/06
1.3K0
JSLint,JSHint,ESLint对比
最近在用React写项目,但是我的Vim配置之前并没有配置对JSX和ES6的支持,然后看着那堆报错各种不爽了,于是还是要继续折腾,顺便也增加了点知识,记录一下。
Jintao Zhang
2018/08/27
4K0
卷?能有搞开源打包工具的大佬们卷?
该版本最大的更新是:替换底层所用的JS编译器,从Babel替换为SWC,使整体编译速度较之前快了10x倍。
公众号@魔术师卡颂
2021/07/07
8060
前端代码质量—怎样实现一个支持多语言、高扩展性的 Linter
以及其他无数个争论不休的问题。这些问题困扰了广大程序员不知道多久,让多少个程序员吵得不可开交、头破血流。
ConardLi
2019/11/21
1.4K0
前端代码质量—怎样实现一个支持多语言、高扩展性的 Linter
前端科普系列(5):ESLint - 守住优雅的护城河
【前端科普系列】帮助阅读者了解web前端,主要覆盖web前端的基础知识,但不深入讲解,定位为大而全并非细而精,适合非前端开发的同学对前端有一个系统的认识,能更好的与前端开发协作。尽可能的写成科普类文章,对于前端开发而言,只适合刚入门的新手。
2020labs小助手
2020/10/28
2.5K0
2022 前端技术领域这些新变化,你准备好了吗?
Concerns with TypeScript 4.5's Node 12+ ESM Support #46452[6]
苏南
2022/03/14
1.2K0
耗时一年半才出第一版,这个工具会一统前端么?
事实也如此,Rome团队用时一年半终于上线了第一个稳定版本Rome v10[1]。
公众号@魔术师卡颂
2022/11/22
8240
耗时一年半才出第一版,这个工具会一统前端么?
给 eslint 写一个插件
eslint 是非常有名的 linter,地球上每一个 JavaScript 程序员都应该知道。
疯狂的技术宅
2020/12/15
8920
揭秘!尤雨溪成立的VoidZero如何改变前端世界
Vue和Vite之父尤雨溪宣布成立公司 VoidZero,目前已经融资3200万。这篇文章欧阳将带你了解VoidZero是如何改变javascript的世界!
前端欧阳
2024/10/10
2730
揭秘!尤雨溪成立的VoidZero如何改变前端世界
ESLint静态代码检查
ESLint是一个用来识别 ECMAScript 并且按照规则给出报告的代码检测工具,使用它可以避免低级错误和统一代码的风格。如果每次在代码提交之前都进行一次eslint代码检查,就不会因为某个字段未定义为undefined或null这样的错误而导致服务崩溃,可以有效的控制项目代码的质量。
xiangzhihong
2022/11/30
2.2K0
前端老项目接入 eslint 从配置到上线的一些思考
大家好,我是若川。持续组织了近一年的源码共读活动,感兴趣的可以 点此扫码加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外:目前建有江西|湖南|湖北籍前端群,可加我微信进群。
若川
2022/11/11
1.4K0
前端老项目接入 eslint 从配置到上线的一些思考
ESLint 在中大型团队的应用实践
代码规范是软件开发领域经久不衰的话题,几乎所有工程师在开发过程中都会遇到,并或多或少会思考过这一问题。随着前端应用的大型化和复杂化,越来越多的前端工程师和团队开始重视 JavaScript 代码规范。得益于前端开源社区的繁盛,当下已经有几种较为成熟的 JavaScript 代码规范检查工具,包括 JSLint、JSHint、ESLint、FECS 等等。本文主要介绍目前较为通用的方案——ESLint,它是一款插件化的 JavaScript 代码静态检查工具,其核心是通过对代码解析得到的 AST(Abstract Syntax Tree,抽象语法树)进行模式匹配,定位不符合约定规范的代码。
前端劝退师
2019/09/16
1.2K0
ESLint 在中大型团队的应用实践
性能最快的代码分析工具,Ruff 正在席卷 Python 圈!
几天前,Python 开源社区又出了一个不小的新闻:HTTPX 和 Starlette 在同一天将在用的代码分析工具(flake8、autoflake 和 isort)统一替换成了 Ruff。
Python猫
2023/04/09
1.1K0
精读《Rust 是 JS 基建的未来》
Rust Is The Future of JavaScript Infrastructure 这篇文章讲述了 Rust 正在 JS 基建圈流行的事实:Webpack、Babel、Terser、Prettier、ESLint 这些前些年才流行起来的工具都已有了 Rust 替代方案,且性能有着 10~100 倍的提升。
黄子毅
2022/03/15
1.1K0
相关推荐
VoidZero 的野心,开发者的福音!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验