Oxlint 会取代 Eslint 吗?

news2024/11/23 8:49:59

最近,一个基于 Rust 的代码检查工具 Oxlint 在国外前端社区引起了热议,许多专家对其给予了高度评价。那么,相比于它的大哥 Eslint,Oxlint 有哪些优势?它会在未来取代 Eslint 吗?本文将讨论这个话题。

Oxc 和 Oxlint

OxlintOxc 项目下的一个产品,Oxc 是一个用 Rust 实现的前端工具链集合,包括:

  • Linter:即 Oxlint,可与 Eslint 相媲美,是本文的主角

  • Parser:即 oxc_parser,用于解析 .js(x).ts(x),可与 swc 媲美。基准测试声称其速度是 swc 的两倍

a295b50a7f4710e61d862cdc8828df44.png

  • Resolver:解析 ESM 和 CJS 文件的路径,基准测试显示其速度比 webpack/enhanced-resolve 快 28 倍

  • Formatter:基准测试对比 Prettier,尚未公布

  • Transpiler:对比 Babel 用于将高级语法转为低级语法,尚未公布

  • Minifier:代码压缩工具,尚未公布

除了与 Oxc 具有相同设计理念的工具(所有工具链工具均基于 Rust 开发)之外,还有 BiomeRuff

  • Biome:其前身是由 Babel 作者 Sebastian McKenzie 开发的 Rome。目标语言是 JS

  • Ruff:目标语言是 Python

Oxlint 介绍

Oxlint 引发热议的主要原因是其爆炸性的性能。

df5915daeb68081da91f4c72f0c55e24.png

我使用 Apple M1 Pro 32G 运行一个包含约 50 个文件的小项目,仅用了 18ms,官方声称其基准测试中比 Eslint 快 50-100 倍的说法并非虚言。

8ec86d74a32e85da54ef20c9ef56b02e.png

当然,除了性能优势外,OxlintEslint 还有许多不同之处。接下来,我们将从三个方面比较 OxlintEslint

易用性

Eslint 诞生于 2013 年。相比于竞争对手(如 JSHint),其最大的优势在于提供大量可选规则,并在某些场景下可以自动修复不符合规则的代码。

然而,随着时间推移,这一优势逐渐变成劣势——开发者不再需要大量自定义规则,而是需要基于最佳实践的开箱即用规则集。许多新产品正是基于这一概念而诞生的,如:

  • Prettier:仅检查和格式化代码风格

  • eslint-plugin-antfu:Antfu 自定义规则集的版本

Oxlint 借鉴了上述产品的优势,提供了一套开箱即用的默认规则。这套规则主要关注代码的正确性(如语法错误、冗余代码和容易引起误解的语法),而不是优化代码细节(如语法性能或风格)。

因此,只需要在项目中执行以下命令即可满足常规验证:

npx oxlint@latest

在易用性方面,Oxlint 远胜于 Eslint

可读性诊断

当代码检查工具检测到问题时,它会向开发者提供相关信息。Eslint 提供的信息通常很简短,只告诉你错误的原因。例如,对于以下代码:

let a;

通过信息 "a is defined but never used",我们可以知道错误的原因是变量 a 被定义但未使用。

然而,如果是更复杂的规则,简短的信息可能无法直观地表达错误发生的位置和解决方法。许多时候,我们仍需查看规则文档,了解该规则的具体含义,然后结合错误代码进行分析。

相比之下,Oxlint 提供的信息更加直观和准确。例如,执行以下代码后,会得到一个倍增数的数组:

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 的信息包括三部分:

  • 错误原因

  • 错误具体发生的位置

  • 解决方法

fa17f5311e202d676356fe9bddd88f25.png

通过查看代码中的哪个 reduce 操作(紫色字体)和哪个扩展操作(青色字体),我们可以识别问题。

虽然有些人可能会说,如果项目很大,阅读如此详细的 lint 信息是一种头疼的事。

但我们需要知道——你可以提供它,但我不一定要使用它,不使用它与不能提供它是完全不同的概念。

在诊断可读性方面,Oxlint 优于 Eslint。

参与成本

参与成本指的是开发者自定义规则的成本。Oxlint 是用 Rust 编写的,如果开发者需要用 Rust 来编写自定义规则,成本会很高。相比之下,Eslint 的规则是用 JS 编写的,成本要低得多。

Oxlint 尝试从两个方面解决这个问题:

不需要自己编写,官方已经编写了常用规则。

截至本文撰写时,官方已经实现了大约 200 多条规则。从规则的名称可以看出,这些规则是从各种常见库的最佳实践中提取出来的,例如:

  • jest: no-confusing-set-timeout

  • react: jsx-no-duplicate-props

  • eslint: default-case-last

  • typescript: no-unnecessary-type-constraint

实现专门为编写规则设计的 DSL。

Oxlint 正在研发一种专门用于编写规则的 DSL。至于这个 DSL 何时发布以及效果如何,目前尚不清楚。

从参与成本的角度来看,Eslint 完全胜出。

Oxlint 会取代 Eslint 吗?

根据已知情况,Oxlint 规则参与成本高于 Eslint。只要这个问题没有解决,Eslint 支持的一些规则 Oxlint 就无法支持。因此,短期内完全取代 Eslint 是不现实的。

然而,就像 Vite 相对于 Webpack,前者并未实现后者的所有功能。但只要满足 90% 开发者的常见需求,并提供更好的体验,就能吸引大多数 Webpack 用户。

Oxlint 也是如此——它建议开发者先运行 Oxlint,然后在 lint-stagedCI 设置中运行 ESLint。这样,大多数常见问题在到达 ESLint 之前就被 Oxlint 阻止了。

这种方法可以显著提高 lint 过程的速度,并且学习曲线很低。因此,它很可能在开发者中迅速流行。

当这种方法变得流行时,随着 Oxlint 规则覆盖范围的增加,它将逐渐替代 Eslint 最常见的 90% 需求。

到那时,会出现 Oxlint 为主,Eslint 为辅(处理少数特殊规则)的情况。

从这个角度来看,Oxlint 有很大的胜算。

尽管 Oxlint 前景光明,但它目前还有一些缺点,例如:

框架语法:Oxlint 原生支持 js(x)ts(x),但不支持 SvelteVue 模板语法。

vscode 插件仍不稳定,有 bug。例如,在下面的代码中,警告应该在第 1 行和第 3 行,但第 2 行也被标记了。

8ee08ff64fe0dd302868d5b13ff6d1ee.png

我相信,随着开发团队的持续投入和社区生态系统的形成,Oxlint 及其底层 Oxc 将拥有光明的未来。

最后:

vue2与vue3技巧合集

VueUse源码解读

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

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

相关文章

STM32高级控制定时器(STM32F103):TIM1和TIM8介绍

目录 概述 1 认识TIM1和TIM8 2 TIM1和TIM8的特性 3 TIM1和TIM6时基和分频 3.1 时基单元 3.2 预分频 3.3 时基和分频相关寄存器 3.3.1TIMx_CR1 3.3.2 TIMx_PSC 概述 本文主要介绍STM32高级定时器TIM1和TIM8的功能,还介绍了与之相关的寄存器的配置参数。包括…

Vue CLI 4与项目构建实战指南

title: Vue CLI 4与项目构建实战指南 date: 2024/6/9 updated: 2024/6/9 excerpt: 这篇文章介绍了如何使用Vue CLI优化项目构建配置,提高开发效率,涉及配置管理、项目部署策略、插件系统定制以及Webpack和TypeScript的深度集成技巧。 categories: 前端…

接口自动化Requests+Pytest基础实现

目录 1. 数据库以及数据库操作1.1 概念1.2 分类1.3 作用 2 python操作数据库的相关实现2.1 背景2.2 相关实现 3. pymysql基础3.1 整个流程3.2 案例3.3 Pymysql工具类封装 4 事务4.1 案例4.2 事务概念4.3 事务特征 5. requests库5.1 概念5.2 角色定位5.3 安装5.4 校验5.5 reques…

如何微调 Llama 3 进行序列分类?

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

GDPU unity游戏开发 寻路与导航

学会寻路,出门在外,身份不是他给的,他做不了你一直的导航。 角色寻路 角色控制器替换为普通的角色控制器,给实验九的地形增加NavMesh Surface组件,然后给角色增加NavMesh Agent组件,并选择合适的参数。通过…

Ubuntu24.04基本配置

目录 0. 前言1. 连接网络2. 更新源3. 安装并配置vim4. 设置用户sudo免密5. 同步双系统时间6. 设置终端颜色主题7. 设置中文输入法8. 调整Dock位置等9. 设置Grub10. 其它美化设置10.1 夜灯10.2 壁纸10.3 终端加强gnome-tweaks10.4 字体 11. 常用工具11.1 邮箱配置11.2 翻译工具1…

【机器学习】机器学习与医疗健康在智能诊疗中的融合应用与性能优化新探索

文章目录 引言机器学习与医疗健康的基本概念机器学习概述监督学习无监督学习强化学习 医疗健康概述疾病预测诊断辅助个性化治疗方案制定 机器学习与医疗健康的融合应用实时健康监测数据预处理特征工程 疾病预测与优化模型训练模型评估 诊断辅助与优化深度学习应用 个性化治疗方…

【C++11】多线程常用知识

知识体系 thread C++ thread中最常用的两个函数是join和detach,怎么选择呢,简单来说,如果希望等待线程结束,用join,如果希望异步执行,且不等待执行结果,那么就用detach;thread_local可以简单理解为一个线程级别的全局变量;线程id在调试多线程程序时是非常有用的东西;…

Responder工具

简介 Responder是一种网络安全工具,用于嗅探和抓取网络流量中的凭证信息(如用户名、密码等)。它可以在本地网络中创建一个伪造的服务(如HTTP、SMB等),并捕获客户端与该服务的通信中的凭证信息。 Responder工…

华为云耀云服务器L实例规则配置教程(亲自实操经验)

我刚买了这个最基础的36¥的L实例的云服务器,这个实例是自带公网ip的,不需要额外购买。我准备先配置好,能够通过公网ip访问,以便之后上传javaweb项目可以直接访问,不过中途遇到了点问题,但是已解…

Linux内核下网卡硬件 MAC 和PHY分析笔记

1 简介 通常CPU自带的以太网接口是MAC控制器,为了实现完整的功能,外围硬件还需要增加一个PHY芯片。 PHY芯片在建立网络连接时负责协商确定网速、全双工 或者 半双工等。在正常通讯时负责在MAC控制器的MII信号 与 网线中的信号之间做转换。 本文的内核代…

pyinstall 打包 paddleocr 成为.exe文件步骤

一、首先进入虚拟环境 使用pip安装pyinstaller pip install pyinstaller我的已经安装完成 二、用cmd进入当前打包文件夹下,新建使spec文件内容如下 注意:其中需要修改的部分是pathex中文件所在路径文件内容摘抄自另一篇博文(❄点击可查看❄) # -*- m…

第二讲笔记:隐私计算助力数据要素流通

1、数据要素流转与数据 2、数据外循环中的信任 焦虑 信任焦虑背后的代表性案例 内鬼门 : 2023 年 , 美国科技公司 Ubiquiti在2021年1月曝出数据泄露事 件, “攻击者”在随后的“谈判”中试 图向该企业勒索近200万美元(50比特 币&…

Steam游戏如何选择适合的服务器

在Steam平台上,玩家可以享受到来自世界各地开发者的游戏作品。然而,要获得最佳的游戏体验,选择合适的服务器至关重要。本文将从网络延迟、服务器位置、游戏类型和个人偏好等多个方面,为玩家提供选择Steam游戏服务器的实用指南。 如…

设计模式-中介者(调停者)模式(行为型)

中介者模式 中介者模式是一种行为型模式,又叫调停者模式,它是为了解决多个对象之间,多个类之间通信的复杂性,定义一个中介者对象来封装一些列对象之间的交互,使各个对象之间不同持有对方的引用就可以实现交互&#xf…

湖南源点(市场研究咨询)如何产出更加有意义的竞品调研

湖南源点咨询认为:当前,任何项目都不能盲目开始,前期的准备工作必不可少。在基础架构搭建的同时,设计上对于前端功能、用户体验的调研就优先开始了。在这个阶段,大部分设计师都会分配很多调研任务,疯狂对竞…

BC C language

题目汇总 No.1 打印有规律的字符(牛牛的字符菱形) 代码展示 #include<stdio.h> int main() {char ch0;scanf("%c",&ch);for(int i0;i<5;i){for(int j0;j<5;j){if((i0||i4)&&j2)printf("%c", ch);else if ((i 1||i3) &&…

大疆智图_空三二维重建成果传输

一、软件环境 1.1 所需软件 1、 大疆智图&#xff1a;点击下载&#xff1b;   2、 ArcGIS Pro 3.1.5&#xff1a;点击下载&#xff0c;建议使用IDM或Aria2等多线程下载器&#xff1b;   3、 IDM下载器&#xff1a;点击下载&#xff0c;或自行搜索&#xff1b;   4、 Fas…

最近一直没动静的Pika Labs原来在筹集融资,加快构建视频基础模型

Pika 筹集了 8000 万美元&#xff0c;因此任何人都可以根据命令制作视频。 今天对我们来说是一个重要的日子。自从我们从斯坦福大学退学去构建 Pika 以来已经一年了&#xff0c;在这段时间里&#xff0c;我们在 Discord 上进行了秘密发布&#xff0c;发布了我们的 1.0 模型和 …

找了半天,还不如自己写一个图片转ico格式的程序

关于jpg、png等图片转ICO格式 最近突然急需一张ico格式的文件&#xff0c;就拿着处理好的png图片出网上找在线转换器&#xff0c;找了一个小时&#xff0c;绝了&#xff0c;不是需要注册充钱就是下载不下来&#xff0c;好不容易下载下来还是个文件错误。想着找个PS插件直接导出…