在你的 Vue + Electron 項目里,引入 ESLint

在這里插入圖片描述

因為我的項目是基于 Electron 平臺的 Web 應用,使用 Vue 3 實現,而且用了 TypeScript,所以,在引入 ESLint 的時候,要考慮好幾種規范的問題。

文章目錄

  • 零、簡介
    • 1. 規則
    • 2. 配置文件
    • 3. 共享配置
    • 4. 插件
    • 5. 解析器
    • 6. 自定義處理器
  • 一、在項目引入 ESLint
  • 二、使用配置文件
    • 1. 指定環境
    • 2. 層級關系
    • 3. 擴展
    • 4. 忽略文件
  • 三、在 Vue + Electron 項目中引入
  • 總結

零、簡介

ESLint 是一個可配置的 JavaScript 代碼檢查工具。它幫助你發現并修復 JavaScript 代碼中的問題。這些問題可能包括潛在的運行時錯誤、未遵循最佳實踐或風格問題等。

1. 規則

規則是 ESLint 的核心構建模塊。規則用于驗證你的代碼是否符合某種特定的期望,以及如果不符合期望應該采取什么措施。規則還可以包含特定于該規則的額外配置選項。

例如,分號規則(semi)允許你指定 JavaScript 語句是否應該以分號(;)結束。你可以設置規則,始終要求使用分號,或者要求語句永遠不要以分號結束。

ESLint 包含數百個內置規則供你使用。你也可以創建自定義規則,或者通過插件使用其他人創建的規則。

2. 配置文件

ESLint 配置文件是一個地方,你可以在這里為你的項目設置 ESLint 的配置。你可以在配置文件中包含內置規則、指定你希望如何執行這些規則、帶有自定義規則的插件、可共享的配置,以及你希望規則應用到哪些文件等等。

3. 共享配置

可共享配置(Shareable Configurations)是通過 npm 分享的 ESLint 配置。

通常,可共享配置用于使用 ESLint 的內置規則來強制執行風格指南。例如,可共享配置 eslint-config-airbnb-base 實現了流行的 Airbnb JavaScript 風格指南。

4. 插件

ESLint 插件是一個 npm 模塊,它可以包含一組 ESLint 規則、配置、處理器和環境。通常,插件會包含自定義規則。插件可以用來強制執行風格指南,并支持 JavaScript 擴展(如 TypeScript)、庫(如 React)和框架(如 Angular)。

插件的一個流行用例是強制執行框架的最佳實踐。例如,@angular-eslint/eslint-plugin 包含了使用 Angular 框架的最佳實踐。

5. 解析器

ESLint 解析器的作用是將代碼轉換成抽象語法樹(AST),這樣 ESLint 就可以對其進行評估。默認情況下,ESLint 使用內置的 Espree 解析器,它與標準的 JavaScript 運行時和版本兼容。

自定義解析器允許 ESLint 解析非標準的 JavaScript 語法。通常,自定義解析器作為可共享配置或插件的一部分包含在內,因此你不需要直接使用它們。

例如,@typescript-eslint/parsertypescript-eslint 項目中包含的一個自定義解析器,它允許 ESLint 解析 TypeScript 代碼。這種解析器使得 ESLint 能夠處理 TypeScript 特有的語法結構,從而在 TypeScript 項目中提供有效的代碼檢查和風格指導。

6. 自定義處理器

處理器的作用是從其他類型的文件中提取 JavaScript 代碼,然后讓 ESLint 對這些提取出來的 JavaScript 代碼進行語法檢查。此外,處理器還可以在 ESLint 解析 JavaScript 代碼之前對其進行操作,比如轉換或者預處理。

例如,eslint-plugin-markdown 插件包含了一個自定義的處理器,它允許你在 Markdown 文件的代碼塊內對 JavaScript 代碼進行 lint 檢查。這意味著,即使 JavaScript 代碼嵌入在 Markdown 文件中,你也可以使用 ESLint 來檢查這些代碼的質量和風格,確保它們遵循你設定的規則。

這種處理器的使用擴展了 ESLint 的應用范圍,使其不僅能夠檢查傳統的 .js文件,還能夠處理其他格式文件中的 JavaScript 代碼,從而為開發者提供了更全面的代碼質量保障。

一、在項目引入 ESLint

假設你的項目已經有了 package.json 文件(一般都有),在項目里首次引入 ESLint 使用:

npm init @eslint/config

在項目的根目錄里,有 ESLint 的配置文件,可以是三種格式的,jsymljson,我推薦使用 json,因為如果你使用 js 的話,可能有模塊標準的問題,比如你是 CommonJS 還是 ES Module 呢?跟項目自身的標準是否兼容?不如用 yml 或者 json 這種純數據的格式。

ESLint 規則大概是這樣的:

{"rules": {"semi": ["error", "always"],"quotes": ["error", "double"]}
}

上面的配置里面,有兩條規則,第一條是關于分號(;)的,error 是報錯的級別,可選的值還有 warnoff 分別是警告和關閉。后面的 always 的意思是,總是使用分號的意思,就是這條規則的設定值。第二條規則是 quotes 關于引號的,后面寫著 double 的意思是總是使用雙引號。

二、使用配置文件

ESLint 配置文件是一個地方,你可以在這里為你的項目設置 ESLint 的配置。你可以在配置文件中包含內置規則、指定你希望如何執行這些規則、帶有自定義規則的插件、可共享的配置,以及你希望規則應用到哪些文件等等。

1. 指定環境

一個環境,提供了預定義的全局變量。例如,咱們的項目里用到了 Electron 和 Vue,而且,原理上是有 Chromium 環境的,所以我們設置:

{"env": {"browser": true,"node": true,"es6": true}
}

環境并不是互斥的。所以,如果你的代碼里用到了多種環境的話,都可以設上。

2. 層級關系

可以在配置文件里,加一個 root: true 告訴 ESLint,這已經是頂層配置文件了,讓 ESLint 不要再向上級目錄搜尋配置了。

如果我們的某個子目錄使用另外一種規則,我們也可以在子目錄里放置一個 .eslintrc.json 配置文件,并設定這個,這樣就會阻斷 ESLint 使用根目錄的配置規則。

3. 擴展

我們確實可以使用 rules 鍵來指定大量的規則,不過,我們更多還是使用 extends 來擴展。比如:


"extends": ['eslint:recommended','plugin:vue/vue3-essential','@vue/eslint-config-typescript','@vue/eslint-config-prettier/skip-formatting','.eslintrc-auto-import.json',]

這里擴展了很多東西,一個是官方推薦的規則集,第二個是 Vue 3 的插件,第三、四個可能是“共享配置”,而最后一個則是根目錄里的另一個配置文件,可以說,這個擴展是無所不能。

4. 忽略文件

有時候,我們會在目錄里放一些別的文件,比如我在項目里放入了一個 blog 目錄,這里使用 Hexo 的生成器維護的一個文檔站點,并用 GitHub Actions 自動發布到 GitHub Pages。這里也引用了大量的 js 代碼,但是這些代碼本質上跟我的項目無關,所以,需要忽略掉這個目錄,可以寫成:

{"ignorePatterns" : [ "blog/"]
}

這樣 ESLint 在掃描的時候,就會跳過這個目錄,這個模式的配置,支持 blob 語法,如 src/**/__tests__/* 這種模式。

三、在 Vue + Electron 項目中引入

經過研究,我發現,在 Vue 的項目里,我們還是只能用 js 格式作為 eslint 的配置文件:

/* eslint-env node */
require('@rushstack/eslint-patch/modern-module-resolution')module.exports = {root: true,env: {node: true,browser: true,es6: true,},extends: ['eslint:recommended','plugin:@typescript-eslint/eslint-recommended','plugin:vue/vue3-essential','@vue/eslint-config-typescript','@vue/eslint-config-prettier/skip-formatting','.eslintrc-auto-import.json',],parserOptions: {ecmaVersion: 'latest',},ignorePatterns: ['blog/'],
}

首先看第一行,這個配置文件的第一行 /* eslint-env node */ 是一個 ESLint 的環境指令。它告訴 ESLint 這個文件是在 Node.js 環境中運行的,因此 ESLint 應該預定義所有 Node.js 全局變量,例如 process__dirname 。這樣,當你在代碼中使用這些全局變量時,ESLint 不會報告 “未定義的變量” 錯誤。

第二行 require('@rushstack/eslint-patch/modern-module-resolution') 是在引入一個名為 @rushstack/eslint-patch/modern-module-resolution 的模塊。這個模塊是 Rushstack 的 ESLint 補丁,它改變了 ESLint 的模塊解析機制,使其能夠更好地支持現代的 JavaScript 模塊解析規則,例如 Node.js 的 exports/imports 字段,或者 package.json 中的 exports 字段。這樣可以幫助 ESLint 更準確地找到和解析項目中的模塊。

也就是為了加載這個補丁,如果我們換成 json 格式的話,就沒辦法寫 require 語句了。而且,看了官方的文檔,下一代的配置文件格式,也是 js 格式的。

這里我們用的是官方創建項目的模板里帶的一些推薦規則,都是以插件的形式提供的。我覺得這樣的形式很好,其實編碼規范的事情無所謂好壞,關鍵是每個人都去做。然后真的形成統一的風格,prettier 那個工具也是一樣的,更加極端一點,直接內置很多規則在里面,就是為了節省團隊的時間,大家省得去討論哪種樣式更好,而是用了這個工具后,就立刻接受了一整套規則,并且跟工具強制綁定。

我看有的項目還會配置 husky,在 git 的 commit 環節注入檢查和格式化,使得代碼強制風格一致。讓協作變得更為簡單。

總結

本文介紹了 ESLint 的一般性用法,以及其配置文件的組成部分,最后介紹了在 Vue + Electron 的項目里如何配置 ESLint。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717764.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717764.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717764.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue開發實例(九)動態路由實現左側菜單導航

之前在【Vue開發實例(六)實現左側菜單導航】文中實現了菜單的導航,本篇是在那個基礎上改造的。 動態路由實現左側菜單導航 一、動態菜單創建二、根據菜單數據來創建路由三、添加路由已加載標記,省的每次點擊菜單都要加載 一、動態…

2021 年 3 月青少年軟編等考 C 語言一級真題解析

目錄 T1. 字符菱形思路分析 T2. 與圓相關的計算思路分析 T3. 蘋果和蟲子 2思路分析 T4. 奇數求和思路分析 T5. 藥房管理思路分析 T1. 字符菱形 給定一個字符,用它構造一個對角線長 5 5 5 個字符,傾斜放置的菱形。 時間限制:1 s 內存限制&a…

3、云原生安全之falco的部署

文章目錄 1、helm安裝2、拉去鏡像失敗與解決3、安裝faclo4、安裝nfs服務器,配置k8s的持久卷4.1、創建nfs服務器,4.2、部署master節點(nsf服務的客戶端)4.3、pv與pvc4.4、假設pv和pvc的配置文件出錯了5、安裝falcosidekick可視化(建議跳過,直接使用6)6、安裝faclo與falco…

【設計模式 01】單例模式

單例模式,是一種創建型設計模式,他的核心思想是保證一個類只有一個實例(即,在整個應用程序中,只存在該類的一個實例對象,而不是創建多個相同類型的對象),并提供一個全局訪問點來訪問…

java012 - Java集合基礎

1、集合基礎 1.1 集合概述 引用數據類型包括:類、接口、數組[] 1.2 ArrayList構造和添加方法 代碼: 空集合對象:[] add() add(int index,E element): 1.3 ArrayList集合常用方法

計算機體系結構安全:對體系結構如何支持安全機制進行調研

一、體系結構支持信任建立和主動防御的技術: 可信3.0 二、體系結構怎么更好的支持信任建立和主動防御 2.1 支持信任建立 一、以手機芯片舉例,用智能手機的芯片作為信任根,確保應用程序和敏感數據受到保護。 二、啟動時驗證操作系統和應用…

Stable Diffusion 模型分享:Henmix_Real(人像、真實、寫真、亞洲面孔)

本文收錄于《AI繪畫從入門到精通》專欄,專欄總目錄:點這里。 文章目錄 模型介紹生成案例案例一案例二案例三案例四案例五案例六案例七案例八下載地址模型介紹 作者述:這個模型試圖改

深入理解算法的空間復雜度

算法一&#xff1a;逐步遞增型 void Loveyou(int n)//n為問題規模 {int i1;while(i<n){i;printf("I love you %d\n",i);}printf("I love you more than %d\n",n);//5 } int main() {Loveyou(3000);return 0; } 無論問題規模怎么變&#xff0c;算法運行…

Springboot教程(五)——單元測試

idea中一般使用JUnit進行單元測試 基本使用 我們可以在idea的test文件夾下的XXXXApplicationTests內進行單元測試&#xff1a; 可以在Test標注的方法上寫測試代碼&#xff1a; SpringBootTest class C0101ApplicationTests {Testfun contextLoads() {println("Hello …

基礎二分學習筆記

模板 : 個人傾向第一種 ; 整數二分 : 最大化查找 : 可行區域在左側 : 查找最后一個<q的數的下標 : int find(int q){// 查找最后一個 < q 的下標 int l 0 , r n 1 ;while(l 1 < r){int mid l r >> 1 ;if(a[mid]<q) l mid ;else r mid ;}return…

django settings.py STATICFILES_FINDERS 設置

STATICFILES_FINDERS 定義查找器后端以確保Django能夠正確地定位和提供靜態文件是很重要的. Django中的STATICFILES FINDERS設置是一個inder后端列表&#xff0c;它知道如何在不同的位置定位靜態文件。 它被Django的靜態文件處理系統用來在開發和部署過程中查找和收集靜態文件…

js json轉換成字符串

js中JSON數據轉換成字符串&#xff0c;可以使用JSON.stringify()方法。 var obj {name: "張三", age: 18, gender: "男"}; var jsonString JSON.stringify(obj); console.log(jsonString); // 輸出 {"name":"張三","age"…

土壤類型數據

國家地球系統科學數據中心

AGM CPLD (AGRV2K )的時鐘(外部時鐘和片上內部振蕩器)

AGM CPLD &#xff08;AGRV2K &#xff09;的時鐘(外部時鐘和片上內部振蕩器) 外部晶振 與 內部振蕩器&#xff1a; mcu 和 cpld 聯合編程時&#xff0c; 整顆芯片需要一顆外部晶振。 &#xff08;芯片有內部振蕩器&#xff0c; 但誤差較大&#xff0c; 校準后 5%以內誤差&…

216. 組合總和 III(力扣LeetCode)

文章目錄 216. 組合總和 III回溯算法 216. 組合總和 III 找出所有相加之和為 n 的 k 個數的組合&#xff0c;且滿足下列條件&#xff1a; 只使用數字1到9每個數字 最多使用一次 返回 所有可能的有效組合的列表 。該列表不能包含相同的組合兩次&#xff0c;組合可以以任何順序…

Electron通過預加載腳本從渲染器訪問Node.js

問題&#xff1a;如何實現輸出Electron的版本號和它的依賴項到你的web頁面上&#xff1f; 答案&#xff1a;在主進程通過Node的全局 process 對象訪問這個信息是微不足道的。 然而&#xff0c;你不能直接在主進程中編輯DOM&#xff0c;因為它無法訪問渲染器 文檔 上下文。 它們…

【軟考】數據庫的三級模式

目錄 一、概念1.1 說明1.2 數據庫系統體系結構圖 二、外模式三、概念模式四、內模式 一、概念 1.1 說明 1.數據的存儲結構各不相同&#xff0c;但體系結構基本上具有相同的特征&#xff0c;采用三級模式和兩級鏡像 2.數據庫系統設計員可以在視圖層、邏輯層和物理層對數據進行抽…

matplotlib散點圖

matplotlib散點圖 假設通過爬蟲你獲取到了北京2016年3, 10月份每天白天的最高氣溫(分別位于列表a, b), 那么此時如何尋找出氣溫和隨時間(天)變化的某種規律? from matplotlib import pyplot as pltx_3 range(1, 32) x_10 range(51, 82)y_3 [11,17,16,11,12,11,12,6,6,7,8…

試手一下CameraX(APP)

書接上回。 首先還是看谷歌的官方文檔&#xff1a; https://developer.android.com/media/camera/camerax?hlzh-cn https://developer.android.com/codelabs/camerax-getting-started?hlzh-cn#1 注&#xff1a;這里大部分內容也來自谷歌文檔。 官方文檔用的是Kotlin&…

常用的字符字符串的讀取方法(C / C++)

一、字符 1、讀取單個字符&#xff1a;直接讀取 //輸入a //讀取 char x; scanf("%c",&x); 2、讀取帶空格的字符 h h h 按格式書寫格式化字符串即可 char a,b,c; scanf("%c %c %c",&a,&b,&c); 3、 處理字符間的換行符 假設要讀取以…