Angular由一個bug說起之十八:伴隨框架升級而升級ESLint遇到的問題與思考

請添加圖片描述

伴隨框架升級而升級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默認…