Umi 4 特性 05:稳定白盒性能好的 ESLint

简介: Umi 4 特性 05:稳定白盒性能好的 ESLint
🙋🏻‍♀️ 编者按:本文是蚂蚁集团前端工程师云谦关于 Umi 4 新特性系列分享的第五篇 - 稳定白盒性能好的 ESLint,欢迎享用~


第一篇 👉🏻Umi 4 特性 01:MFSU V3,比 Vite 还要快

第二篇 👉🏻 Umi 4 特性 02:React Router 6 和新路由

第三篇 👉🏻Umi 4 特性 03:默认最快的请求

第四篇 👉🏻Umi 4 特性 04:build 阶段的构建提速

ESLint 大家都很熟,通过很多规则,让大家写更好的代码,而且部分规则还能自动修复。Umi 3 也有 Lint 命令,包含 ESLint、Prettier、Stylelint 等。Lint 虽然不是卡点,但大家在这块遇到问题的比较多,同时带来了不少咨询量。


问题主要集中在这些方面,


1、规则开太多,有些规则见仁见智,不同人有不同的想法

2、依赖不稳定,睡一觉醒来规则变了,CI 过不了影响发布节奏

3、太黑盒,不知道开了什么规则,甚至框架(Umi)层自己都不敢更新依赖

4、性能不好,影响提交和 CI 速度


以上问题,Umi 4 的 Lint 方案全解。


规则开太多是因为 Umi 3 对于 ESLint 的定位不清晰。ESLint 的规则分质量类、建议类和风格类。比如使用未定义的变量是质量类,比如语句后加不加逗号则是风格类。在拥有 Prettier 之后,Umi 4 的方案里,风格类的全交给 Prettier,ESLint 则只负责可能导致问题的质量类。经过筛选,Umi 4 开的规则仅 60 多条。


依赖不稳定是 ESLint 的设计缺陷。ESLint 生态包含 Config 和 Plugin,Plugin 实现规则,Config 决定规则的开启或关闭。这理应是不错的设计,但可惜 ESLint 只考虑了项目级如何使用,却没有考虑三方库封装 Config 和 Plugin 的场景。具体的问题是 ESLint 找 Config 和 Plugin 只会从项目根目录去找。而 npm client 都有 Hoist 依赖的特性,导致往上提到根目录的依赖是不是正确有一定运气成分。所以依赖不稳定有两个原因,1)由于 npm client 的原因导致出现错误的 ESLint config 或 plugin,2)Config、Plugin 或其依赖和间接依赖更新导致的 break change。


对于依赖不稳定,Umi 4 有不同的解。短期的现在的解是通过 @rushstack/eslint-patch/modern-module-resolution 进行 hack,修改 Config 里找 Plugin 的规则,改从 Config 所在路径开始找。这可以确保 Plugin 版本找正确,但无法避免 Plugin 及其依赖更新后的功能变更。所以,更长期的未来的解是预打包 Config 和 Plugin 依赖,但由于 ESLint 设计上的问题,还需要调研 hack 的方式。


太黑盒是因为之前有继承其他 Config。Umi 4 的实现里,不再继承任何其他 Config,只使用提供规则功能的 Plugin,然后具体开什么规则是直接一个列表写死,只列我们需要的规则。这样三方或者 ESLint 官方规则启用开启的变更,都不会影响到 Umi 的用户,同时框架层也可以放心地更新依赖。


性能不好和 TypeScript 有关。Umi 3 会根据项目 TypeScript 文件的占比,决定是否开启 TypeScript 相关的 Lint 规则,而这些规则中,有一些是 type-aware linting。type-aware 的规则和类型相关,由于 TypeScript 的语言特性,比如跑一遍完整的项目才能确定类型是否正确,所以每次 lint 就算只改了一个文件,也需要跑整个项目。这里有把雨燕的 commit 时间从 19s 优化到 1-3s 的记录。而 Umi 4 中,压根不会开 type-aware 的规则,因为这些规则更多也是风格类,和质量无关。


参考:

Umi 4 开的 ESLint 规则列表

https://github.com/umijs/umi-next/blob/ad0dc988b0c2b98be5f71ae44a6f357612ede2f1/packages/lint/src/config/eslint/rules/recommended.ts#L5 

@rushstack/eslint-patch

https://github.com/microsoft/rushstack/tree/master/eslint/eslint-patch

Linting with Type Information

https://typescript-eslint.io/docs/linting/type-linting/ 

相关文章
postcss-px-to-viewport-8-plugin 适配
postcss-px-to-viewport-8-plugin 适配
2438 0
|
10月前
|
存储 Kubernetes 安全
云计算分类与主流产品
云计算已广泛应用于政府、企业和个人生活,主要分为私有云、公有云、混合云和多云。服务模式以IaaS、PaaS、SaaS为主,未来将向S2S模式发展。公有云具备规模大、价格低、灵活性强等特点,而私有云则更注重数据安全和资源控制。混合云结合多种云的优势,提供更灵活的架构。此外,云存储、虚拟桌面、开发测试、电子政务等场景广泛应用,OpenStack、Kubernetes等开源产品也推动了云计算的发展。
1183 0
|
存储 人工智能 缓存
【AI系统】Ascend C 语法扩展
Ascend C 是基于标准 C++ 扩展的编程语言,专为华为昇腾处理器设计。本文介绍了 Ascend C 的基础语法扩展、API(基础与高阶)、关键编程对象(数据存储、任务间通信与同步、资源管理及临时变量),以及如何利用这些特性高效开发。通过华为自研的毕昇编译器,Ascend C 实现了主机与设备侧的独立执行能力,支持不同地址空间的访问。API 包括计算、数据搬运、内存管理和任务同步等功能,旨在帮助开发者构建高性能的 AI 应用。
619 2
【AI系统】Ascend C 语法扩展
|
API C# 数据库
SemanticKernel/C#:实现接口,接入本地嵌入模型
SemanticKernel/C#:实现接口,接入本地嵌入模型
443 1
|
机器学习/深度学习 数据采集 算法
探索机器学习在金融风控中的应用
本文深入探讨了机器学习技术在金融风险控制领域的应用与挑战。通过分析当前金融市场的风险类型及传统风控方法的局限性,本文详细阐述了如何利用机器学习算法提升风控效率和准确性。文中不仅分享了机器学习模型在实际风控场景中的成功案例,还讨论了实施过程中可能遇到的技术挑战和策略选择问题。最后,本文对机器学习在金融风控领域的未来发展趋势进行了展望,旨在为金融科技从业者提供有价值的参考。
597 2
|
前端开发 JavaScript 开发者
常见的web前端框架推荐
常见的web前端框架推荐
609 4
|
机器学习/深度学习 数据可视化 Python
Anaconda下Python中pydot与graphviz模块下载与安装方法
Anaconda下Python中pydot与graphviz模块下载与安装方法
435 1
|
资源调度
umi如何利用postcss-px-to-viewport做移动端布局?
先下载postcss-px-to-viewport npm i postcss-px-to-viewport yarn add postcss-px-to-viewport
679 1