请添加图片描述

伴随框架升级而升级ESLint遇到的问题与思考

对于eslint这个前端事实上的代码检查工具标准,大家可能是再熟悉不过了。几乎是在编码的时时刻刻都在和它接触。在我们开发维护长达十年的项目中自然也是采用了ESLint,在从 AngularJS 一路到今天现代化的 Angular V20。 为了保持项目的活力和能够利用现代化的框架特性,我们持续跟随 Angular 的版本更新。在这么长时间的版本变动中,ESLint作为项目必不可少的一部分自然也经历了许多变动。我们也遇到过一些问题自然也有一些心得,今天就在这里和大家分享一下。

Lint 工具的变迁

  1. AngularJS 时代

在这个古早的版本时期,如今大名鼎鼎甚至开始过气的Webpack还只有个初级的版本。AngularJS本身还没有如今基于Webpack的这一套打包工具,我们的项目中依赖的是gulp,使用gulp-eslint插件来做linter。

  1. Angular V4-V11

这一时期AngularJS被废弃,谷歌发布了现代化标准的Angular框架同时从JS转向了类型安全的Typescript,但是对于传统的面向Javascript的ESLint此时被替换为了TSLint并成为了Angular的默认linter。这一时期改变巨大并且是web技术高速发展的时期,所以Angular的发展有些混乱。它全面转向TS,框架完全重做还要有很大的精力来开发让开发者能顺利从AngularJS顺利升级到新的Angular的技术。我们从ESLint规则转向了TSLint的规则,由于TS的语言特性我们还加了一些TS专有的规则。

  1. Angular v12-v18

在经过几年的发展以后TSlint 团队在2019年突然宣布废弃项目,究其原因主要是TSLint 无法复用 JavaScript 生态系统中围绕 ESLint 所做的任何工作。TSLint 不得不重新实现所有功能,从编辑器扩展到自动修复,再到规则。这个重大变化又导致Angular重新转向了angular-eslint,在而它依赖的是typescript-eslint.

在这里插入图片描述

在这里插入图片描述

  1. Angular V18 - 现在

从Angular V18 开始angular-eslint开始使用 ESLint V9,从v9开始ESLint开始使用所谓扁平化设置。
从原来的JSON配置,变成默认使用 eslint.config.js

一个典型的eslint.config.js设置:

// @ts-check// Allows us to bring in the recommended core rules from eslint itself
const eslint = require('@eslint/js');// Allows us to use the typed utility for our config, and to bring in the recommended rules for TypeScript projects from typescript-eslint
const tseslint = require('typescript-eslint');// Allows us to bring in the recommended rules for Angular projects from angular-eslint
const angular = require('angular-eslint');// Export our config array, which is composed together thanks to the typed utility function from typescript-eslint
module.exports = tseslint.config({// Everything in this config object targets our TypeScript files (Components, Directives, Pipes etc)files: ['**/*.ts'],extends: [// Apply the recommended core ruleseslint.configs.recommended,// Apply the recommended TypeScript rules...tseslint.configs.recommended,// Optionally apply stylistic rules from typescript-eslint that improve code consistency...tseslint.configs.stylistic,// Apply the recommended Angular rules...angular.configs.tsRecommended,],// IMPORTANT: Set the custom processor to enable inline template linting// This allows your inline Component templates to be extracted and linted with the same// rules as your external .html template filesprocessor: angular.processInlineTemplates,// Override specific rules for TypeScript files (these will take priority over the extended configs above)rules: {'@angular-eslint/directive-selector': ['error',{type: 'attribute',prefix: 'app',style: 'camelCase',},],'@angular-eslint/component-selector': ['error',{type: 'element',prefix: 'app',style: 'kebab-case',},],},},{// Everything in this config object targets our HTML files (both external template files,// AND inline templates thanks to the processor set in the TypeScript config above)files: ['**/*.html'],extends: [// Apply the recommended Angular template rules...angular.configs.templateRecommended,// Apply the Angular template rules which focus on accessibility of our apps...angular.configs.templateAccessibility,],rules: {},},
);

遇到的问题

  1. 从ESLint到TSLint
    当时从ESLint规则到TSLint规则,由于命名上的不同需要一一对应的来迁移,耗费了一些时间。

  2. 从TSLint 迁移到 typescript-eslint
    这一时期的问题主要是因为从 TSLint 的rule重新迁移到 eslint 的rule并不能实现完美的迁移,是因为 TypeScript 添加了 ESLint 不知道的新功能,ESLint 里没有专门针对TS的特定规则。所以我们需要扩展 ESLint 的规则来实现对 Typescript 的支持,但是在我们当时迁移的时候,有些扩展还没有完全支持,所以我们需要禁用掉一些lint规则来使迁移能够顺利完成。

  3. ESLint V9
    当我们升级项目的框架到Angular V18版本以后,本地运行的 lint-staged 命令失效了。这个命令是在每次commit本地代码的时候对修改的文件做检查。原因是随着新版本的框架带来了ESLint的V9版本,这个版本默认是需要采用上文所述的“扁平化”配置文件,但是Angular 本身做了处理继续使用原来的JSON格式配置是可以的。但是问题在于我们的这个lint-staged 配置的是直接使用 eslint 而不是采用Angular的linter命令,所以无法继续兼容以前的 eslintrc 配置文件。

最终的解决方案
由于历史原因在我们的项目中server端和client的代码在一个统一的代码库中,但是server的开发使用比较老的gulp-eslint,而client使用Angularng lint。所以导致项目中其实是有两个版本的配置文件,一个针对客户端的Typescript另一个是针对后端的Javascript。所以我们使用了统一扁平化的配置文件利用ESLint的 override特性来覆盖不同位置代码。
简化的配置文件如下:
eslint.config.js

// @ts-nocheck
const eslint = require("@eslint/js");
const tseslint = require("typescript-eslint");
const angular = require("angular-eslint");
const globals = require("globals");
const jsdoc = require('eslint-plugin-jsdoc');const typescriptEslintParser = require("@typescript-eslint/parser");
jsdoc.configs['flat/recommended'],module.exports = tseslint.config(/**** targeting all ts files in the client side*/{files: ["client/**/*.ts"],ignores: ["client/**/*.spec.ts","client/**/*.json.ts","client/**/*.d.ts","client/mockmodel/**/*.ts","client/**/polyfills.ts","client/unitTest.config.ts","client/environments/**/*.ts",],plugins: {jsdoc},extends: [...tseslint.configs.recommended,...angular.configs.tsRecommended],processor: angular.processInlineTemplates,rules: {// rules for the client side},},/*** targeting all html files, including inline templates*/{files: ["client/**/*.html"],extends: [...angular.configs.templateRecommended],rules: {},},/*** targeting all JS files in server folder*/{files: ["server/**/*.js"],extends: [eslint.configs.recommended],languageOptions: {globals: {...globals.browser,...globals.node,...globals.es2020,...globals.jasmine},parserOptions: {ecmaVersion: 2020,}},rules: {// rules for the server side},}
);

一些思考
在Angular和Typescript生态建设的这些年,我们在linter这个工具上遇到了一些麻烦。也感谢开源社区的贡献让我们也成功的解决了这些问题。

  • 前端工具的快速迭代:前端生态变化迅速,选择工具时需要评估其长期维护性,优先选择有强大社区支持的项目。
  • 配置标准化:ESLint V9的扁平化配置是未来趋势,对于已有项目可以尽早适配以避免差异过大导致的后续问题。
  • 混合项目管理:对于全栈项目,可以通过更好更清晰的ESLint多配置支持统一管理前后端代码规范。
  • 自动化测试:在工具链变更时,需要确保CI/CD流程中的lint检查同步更新,避免本地与远程环境不一致。


参考:

  1. https://en.wikipedia.org/wiki/Webpack?oldformat=true
  2. https://typescript-eslint.io/troubleshooting/faqs/eslint

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unfold 切图像,图形transformer的切割操作

import torch x torch.arange(8*12).view(1,1,8,12) mx.unfold(2, 4, 4) n m.unfold(3, 4, 4)输入第一次切,切高度维度,但是切完做了转置 ,得到(1,1,2,12,4)切宽度 得…

基于最小二乘支持向量机的数据回归预测 LSSVM

一、作品详细简介 1.1附件文件夹程序代码截图 全部完整源代码,请在个人首页置顶文章查看: 学行库小秘_CSDN博客​编辑https://blog.csdn.net/weixin_47760707?spm1000.2115.3001.5343 1.2各文件夹说明 1.2.1 main.m主函数文件 该MATLAB 代码实现了…

Java虚拟机故障处理工具全指南

目录 一、JVM故障处理工具概述 二、详细工具解析 1. jps:虚拟机进程状况工具 2. jstat:虚拟机统计信息监视工具 3. jinfo:Java配置信息工具 4. jmap:Java内存映像工具 5. jhat:堆转储快照分析工具 6. jstack&a…

【LeetCode热题100道笔记+动画】接雨水

题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水…

短剧小程序系统开发:构建影视娱乐新生态的基石

在移动互联网的浪潮中,影视娱乐行业正经历着深刻的变革。短剧,作为一种新兴的内容形式,以其独特的魅力和广泛的受众基础,成为了行业发展的新亮点。而短剧小程序系统开发,则是构建影视娱乐新生态的基石,为行…

基于Pytochvideo训练自己的的视频分类模型

视频分类模型简介 ​X3D 系列模型 官方网站 https://github.com/facebookresearch/SlowFast ​提出论文​ Facebook Research 的《X3D: Expanding Architectures for Efficient Video Recognition》 https://arxiv.org/pdf/2004.04730 原理 X3D 的设计思路受到机器学习中…

LidaRefer-v2论文速读

研究背景 研究背景 3D视觉定位(3D Visual Grounding, VG)是一项旨在根据自然语言描述,在三维场景中精确定位出相应物体或区域的任务 。这项技术在人机交互领域至关重要,尤其是在自动驾驶、机器人技术和AR/VR等应用中,它…

逻辑移位与算术移位

根本的区别在于:它们如何对待符号位(最高位)。 一、逻辑移位 (Logical Shift) 无论左移、右移,空出的位永远用 0 填充。主要针对无符号整数、快速乘除2的幂。 二、算术移位 (Arithmetic Shift) 左移用 0 填充、右移用符号位填充。…

内存对齐的使用和禁用

在 C 语言和 C 中,__attribute__((packed)) 是一种用于数据结构体的编译器扩展属性,这个属性主要用于修改结构体的内存对齐行为。背景知识:结构体内存对齐在许多计算机架构中,编译器会自动对数据进行对齐(alignment&am…

SpringBoot3后端项目介绍:mybig-event

mybig-event 项目简介 mybig-event 是一个基于 Spring Boot 的事件管理系统,提供用户管理、文章发布、分类管理、文件上传等功能,采用现代化的 Java 技术栈构建,支持高效开发和部署。 仓库链接:https://github.com/foorgange/mybi…

week3-[分支嵌套]方阵

week3-[分支嵌套]方阵 题目描述 有 nmn\times mnm 个人站成 nnn 行 mmm 列的方阵。我们想知道第 xxx 行 yyy 列的人的某个方向有没有人。 输入格式 输入共 222 行。 第 111 行输入 444 个正整数 n,m,x,yn,m,x,yn,m,x,y。 第 222 行输入 111 个字符为 U、D、L、R 其中之一&#…

深入理解C++ std::shared_ptr:现代C++内存管理的艺术与实践

在C++的发展历程中,内存管理始终是开发者面临的核心挑战。从C语言继承而来的手动内存管理方式,虽然提供了极大的灵活性,却也成为无数程序错误的根源。内存泄漏、悬空指针、双重释放等问题长期困扰着C++开发者,直到智能指针的出现改变了这一局面。作为C++11标准引入的重要特…

一个 WPF 文档和工具窗口布局容器

一个 WPF 文档和工具窗口布局容器、用于排列文档 和工具窗口的方式与许多知名 IDE 类似,例如 Eclipse、Visual Studio、 PhotoShop 等等 AvalonDock 是一个 WPF 文档和工具窗口布局容器,用于排列文档 和工具窗口的方式与许多知名 IDE 类似,例…

【qml-5】qml与c++交互(类型单例)

背景: 【qml-1】qml与c交互第一次尝试(实例注入) 【qml-2】尝试一个有模式的qml弹窗 【qml-3】qml与c交互第二次尝试(类型注册) 【qml-4】qml与c交互(类型多例) 【qml-5】qml与c交互&#…

循环神经网络(RNN)、LSTM 与 GRU (一)

循环神经网络(RNN)、LSTM 与 GRU (一) 文章目录循环神经网络(RNN)、LSTM 与 GRU (一)循环神经网络(RNN)、LSTM 与 GRU一、RNN(Recurrent Neural N…

【AAOS】Android Automotive 16模拟器源码下载及编译

源码下载repo init -u https://android.googlesource.com/platform/manifest -b android-16.0.0_r2 repo sync -c --no-tags --no-clone-bundle源码编译source build/envsetup.sh lunch sdk_car_x86_64-bp2a-eng make -j8运行效果emualtorHomeAll appsSettingsHAVCNotification…

jvm三色标记

好的,咱们把专业概念和生活例子结合起来,一步一步说清楚三色标记法:一、核心概念:用“颜色”给对象贴“状态标签”就像给家里的物品贴标签,每种颜色代表它在“垃圾回收(大扫除)”中的状态&#…

生成式AI的能力边界与职业重构:从“百科实习生“到人机协作增强器

根据微软最新研究,基于20万条Copilot使用数据及用户反馈,研究者揭示了生成式AI在实际应用中的能力边界与职业影响。数据显示,用户使用AI助手最频繁的任务是信息获取(占比近40%),其次是公众沟通类工作&#…

java17学习笔记

Java17是一个重要的特性发布,也是比较常用的一个版本,根据 2024Java生态统计,Java 17、11 和 8 的用户比例分别为 35%、33% 和 29%。它遵循了自Java10以来引入的Java发布步调,并于2021年 9 月 14 日发布,在Java16发布后…

【AI应用】修改向量数据库Milvus默认密码

说明: 1)部署向量数据库milvus运行一段时间后,想开启密码认证登录attu页面 2)开启密码认证登录,提示用户和密码不正确,因为默认密码已存储在物理机 3)通过attu管理页面修改向量数据库milvus默认…