Eslint自定義規則使用

文章目錄

  • 前言
      • 場景設定:維護代碼分層,禁止“跨級調用”
      • 實現步驟:從零到一,創建你的第一條自定義規則
        • **第 1 步:創建規則文件**
        • **第 2 步:在 `eslint.config.mjs` 中注冊并啟用你的規則**
      • 驗證成果


前言

設計一個非常真實、非常有價值的自定義規則場景,這個場景在開發中都可能遇到的:架構約束規則


場景設定:維護代碼分層,禁止“跨級調用”

背景
在一個良好分層的項目中,我們通常會把代碼分成不同的層次。假設你的 uni-app 項目遵循以下結構:

  • src/services/:存放所有與后端 API 交互的邏輯(比如 userService.ts, productService.ts)。這些是“數據服務層”。
  • src/pages/:存放所有的頁面(.vue 文件)。這些是“視圖層”。
  • src/utils/:存放通用的工具函數。

團隊規定(我們的架構約束)
為了保持代碼的清晰和可維護性,團隊規定 “視圖層 (pages)” 不允許直接調用 “數據服務層 (services)”

  • 錯誤的做法:在 src/pages/my/index.vue 中直接 import { getUserInfo } from '@/services/userService';
  • 正確的做法:頁面應該通過一個統一的、更高層的邏輯單元(比如 Vuex/Pinia 的 actions,或者一個專門的 controller 層)來獲取數據,而不是直接觸碰底層的 service。

目標
我們要創建一個自定義 ESLint 規則,叫做 no-service-import-in-pages。當有開發者試圖在 src/pages/ 目錄下的任何文件中導入 src/services/ 里的模塊時,ESLint 應該立刻用紅色下劃線報錯,并給出清晰的提示:“頁面組件不允許直接導入 service,請通過狀態管理層調用。”


實現步驟:從零到一,創建你的第一條自定義規則

這個過程分為兩步:1. 編寫規則2. 注冊規則

第 1 步:創建規則文件
  1. 在你的項目根目錄(和 package.json 同級)創建一個新文件夾,命名為 eslint-rules

  2. 在這個文件夾里,創建一個新文件,命名為 no-service-import-in-pages.js

  3. 將以下代碼粘貼到 no-service-import-in-pages.js 中:

    /*** @fileoverview Rule to prevent importing from the services layer directly into page components.* @author Your Name*/
    "use strict";//------------------------------------------------------------------------------
    // Rule Definition
    //------------------------------------------------------------------------------module.exports = {// meta: 包含了規則的元數據meta: {type: "problem", // 這表示規則將發現一個代碼問題docs: {description: "Disallow direct imports from the services layer in page components",category: "Best Practices",recommended: true,},fixable: null, // 這個規則不可自動修復schema: [], // 這個規則沒有額外的配置選項messages: {noServiceImport: "頁面組件不允許直接導入 service,請通過狀態管理層調用。",}},// create: 返回一個對象,這個對象包含了遍歷 AST 時要訪問的節點create(context) {// 獲取當前正在被檢查的文件的絕對路徑const filename = context.getFilename();// 如果文件路徑不包含 /pages/,那么這個規則直接跳過,不進行任何檢查if (!filename.includes("/src/pages/")) {return {};}// 如果文件在 pages 目錄下,我們返回一個訪問者對象return {// 'ImportDeclaration' 是 AST 中代表 'import ... from ...' 語句的節點類型ImportDeclaration(node) {// node.source.value 獲取的是 from 后面的字符串,比如 '@/services/userService'const importSource = node.source.value;// 檢查這個導入路徑是否包含了 'services'if (importSource && importSource.includes("services")) {// 如果包含了,就報告一個錯誤context.report({node: node, // 在這個 import 語句節點上報告錯誤messageId: "noServiceImport", // 使用 meta.messages 中定義好的錯誤信息});}},};},
    };
    
第 2 步:在 eslint.config.mjs 中注冊并啟用你的規則

現在我們需要告訴 ESLint:“嘿,我寫了一個新規則,給你用!”

打開 eslint.config.mjs,我們需要修改 “3. A main configuration object” 這個部分,添加一個新的 plugins 字段,并啟用我們的規則。

// ... 其他 import 語句 ...
// 導入我們自己的規則
import noServiceImportInPages from './eslint-rules/no-service-import-in-pages.js';export default [// ... 其他配置 ...// 3. A main configuration object for our custom settings{languageOptions: {// ... globals ...},plugins: {// Make plugins available for all files'@typescript-eslint': tseslint.plugin,vue: vuePlugin,// 在這里注冊我們的自定義規則插件'custom-rules': {rules: {'no-service-import-in-pages': noServiceImportInPages,},},},rules: {// ... 其他規則 ...// 在這里啟用我們的自定義規則,并設置為 error 級別'custom-rules/no-service-import-in-pages': 'error',},},// ... 其他配置 ...
];

驗證成果

做完以上修改后,請重啟 VSCode!

現在,去任何一個位于 src/pages/ 目錄下的 .vue 文件,在 <script> 標簽里嘗試寫下:

import { someFunction } from '@/services/api';

你會立刻看到,這行代碼被畫上了紅色波浪線,當你把鼠標懸停在上面時,會顯示我們自定義的錯誤信息:“頁面組件不允許直接導入 service,請通過狀態管理層調用。”

而在 src/utils 或其他非 pages 目錄的文件中進行同樣的導入,則不會有任何報錯。

就這樣成功地創建并應用了一條非常有價值的、用于維護項目架構的自定義 ESLint 規則!

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

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

相關文章

深入剖析Spring Cloud Gateway,自定義過濾器+斷言組合成攔截器鏈實現Token認證

一、Spring Cloud Gateway網關的整體架構 Spring Cloud Gateway 是 Spring Cloud 官方推出的網關解決方案&#xff0c;旨在替代 Netflix Zuul 1.x。其底層基于 Spring WebFlux Reactor 模型 構建&#xff0c;具備響應式、異步非阻塞的高性能特點。 1. 整體架構圖 ----------…

VMware Workstation Pro下Centos 7.9 安裝

背景系統安裝方案1、VMware安裝? ? 1.1、下載? ? 1.2、安裝 2、Centos 7.9 安裝? ? 2.1 、Centos7.9 iso 下載? ? 2.2、使用VMware 安裝? ? 2.2.1、VMware配置虛擬機? ? 2.2.2、Linux安裝 結語 背景 本文所在專欄的所有文章基于Centos7.9系統來演示&#xff0c;系…

我做個一個APP叫【圖影工具箱】:一站式解決視頻提取音頻和加水印的鴻蒙神器

在數字內容創作和日常使用手機的過程中&#xff0c;提取視頻音頻、處理圖片和視頻水印是一大需求。許多人在尋找合適的軟件時&#xff0c;往往試遍各種工具卻仍無法滿足需求。所以&#xff0c;我做了一款應用 —— 圖影工具箱&#xff0c;一站式解決這些令人頭疼的問題。 圖影…

【StarRocks系列】查詢語句執行全流程

目錄 StarRocks 查詢數據流程詳解 1. 提交查詢語句 2. FE 解析與優化 3. 選擇 BE 節點與數據路由 4. BE 數據讀取與計算 5. 結果返回 關鍵優化點總結 示例流程 流程圖 StarRocks 查詢數據流程詳解 StarRocks 采用分布式 MPP 架構&#xff0c;查詢流程涉及 FE&#xff…

HarmonyOS 5的分布式通信矩陣是如何工作的?

HarmonyOS 5 的分布式通信矩陣通過多層級技術協同實現跨設備高效協同&#xff0c;其核心工作機制如下&#xff1a; 一、核心架構&#xff1a;分布式軟總線 3.0? ?動態拓撲感知? 設備自動發現并構建最優傳輸路徑&#xff08;如手機與智慧屏優先采用 Wi-Fi P2P 直連&#xf…

自定義Django rest_framework中response的示例

在實際項目開發中&#xff0c;原有框架的response可能并不能完全滿足我們的需求。比如我們需要定義一些更加詳細的RESULT_CODE來說明情況。那么我們就可以基于原有的response進行自定義。 下面是一個自定義Django rest_framework中response的示例 # -*- coding:utf-8 -*- imp…

如何開發HarmonyOS 5的分布式通信功能?

以下是基于HarmonyOS 5開發分布式通信功能的完整技術指南&#xff0c;涵蓋核心流程與關鍵代碼實現&#xff1a; 一、開發前置配置 權限聲明? 在module.json5中添加分布式權限&#xff1a; {"module": {"requestPermissions": [{"name": &quo…

Linux --靜態庫和動態庫的制作和原理

本章重點&#xff1a; 動靜態庫的制作&#xff0c;使用和查找 可執行程序ELF格式 可執行程序的加載過程 虛擬地址空間和動態庫加載的過程 動靜態庫的制作&#xff0c;使用和查找 1.在了解庫的制作之前&#xff0c;我們首先需要知道什么是庫。庫是寫好的現有的&#xff0c;成…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | IncrementingCounter(遞增計數器)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— IncrementingCounter組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API 和 <script setup&g…

簡約求職簡歷競聘工作求職PPT模版共享

簡歷競聘&#xff0c;自我介紹&#xff0c;個人簡歷&#xff0c;工作求職PPT模版&#xff0c;崗位競聘求職簡歷PPT模版&#xff0c;低調綠自我介紹PPT模版&#xff0c;簡約求職簡歷PPT模版&#xff0c;個人介紹PPT模版&#xff0c;我的簡歷PPT模版&#xff0c;個人求職簡介PPT模…

Java大廠面試攻略:Spring Boot與微服務架構深度剖析

問題一&#xff1a;Spring Boot 的自動配置原理是什么&#xff1f; 簡潔面試回答&#xff1a; Spring Boot 的自動配置基于條件化配置&#xff0c;通過 Conditional 注解實現&#xff0c;根據項目中依賴和環境自動裝配 Bean。 詳細解析&#xff1a; Spring Boot 自動配置的核…

Windows核心端口攻防全解析:135、139、445端口的技術內幕與安全實踐

Windows核心端口攻防全解析&#xff1a;135、139、445端口的技術內幕與安全實踐 引言&#xff1a;Windows網絡通信的命脈 在Windows網絡生態系統中&#xff0c;135、139和445端口猶如網絡通信的"大動脈"&#xff0c;承載著關鍵的系統服務和網絡功能。這些端口不僅是…

從生活場景學透 JavaScript 原型與原型鏈

一、構造函數&#xff1a;以 “人” 為例的對象工廠 1. 生活場景下的構造函數定義 我們以 “人” 為場景創建構造函數&#xff0c;每個人都有姓名、年齡等個性化屬性&#xff0c;也有人類共有的特征&#xff1a; // 人類構造函數 function Person(name, age) {this.name na…

學c++ cpp 可以投遞哪些崗位

此次描述知識針對應屆生來說哈&#xff0c;如果是社招&#xff0c;更多是對于你目前從事的方向&#xff0c;技術棧進行招聘就好了。 此次編寫是按照boss上崗位篩選的方式進行編寫的&#xff0c;其實投簡歷一般也是用boss&#xff0c;后面也會出一篇文章給大家介紹一般找工作都用…

【Docker基礎】Docker鏡像管理:docker rmi、prune詳解

目錄 引言 1 Docker鏡像管理概述 1.1 為什么需要鏡像清理&#xff1f; 1.2 鏡像生命周期管理 2 docker rmi命令詳解 2.1 基本語法 2.2 常用選項 2.3 刪除單個鏡像 2.4 刪除多個鏡像 2.5 強制刪除鏡像 2.6 刪除所有鏡像 3 docker rmi工作原理 3.1 鏡像刪除流程 3.…

57-Oracle SQL Profile(23ai)實操

在上一期中說到了SQL Tuning Advisor其中一個影響對象就是SQL Profile&#xff0c;同樣在管理和應用開發中,SQL性能優化是個任重道遠的工作&#xff0c;低效的SQL語句讓應用響應緩慢,用戶整體體驗下降,拖垮搞蹦整個系統都有可能。Oracle數據庫提供了多種組合工具&#xff0c;有…

man的使用

man的使用 文章目錄 man的使用基本用法&#xff1a;常見 man 命令操作&#xff1a;man 命令的章節&#xff1a;示例&#xff1a; man 是 Linux 和 macOS 系統中的命令&#xff0c;用于查看命令和程序的手冊頁&#xff08;manual pages&#xff09;。手冊頁包含了關于命令、函…

【藍牙】手機連接Linux系統藍牙配對,Linux Qt5分享PDF到手機

要實現手機連接 A40i Linux 系統并通過藍牙接收 PDF 文件&#xff0c;可以按照以下步驟操作&#xff1a; 1. 配置 Linux 藍牙功能 確保開發板上的藍牙模塊已正確驅動并支持藍牙協議棧。 安裝藍牙工具&#xff1a; bash sudo apt install bluetooth bluez bluez-tools 啟動藍…

1432. 改變一個整數能得到的最大差值

1432. 改變一個整數能得到的最大差值 題目鏈接&#xff1a;1432. 改變一個整數能得到的最大差值 代碼如下&#xff1a; class Solution { public:int maxDiff(int num) {string s to_string(num);function<int(char, char)> replace_stoi [&](char old_char, cha…

解密 Spring MVC:從 Tomcat 到 Controller 的一次完整請求之旅

今天&#xff0c;想和你聊一個我們每天都在打交道&#xff0c;但可能不曾深入思考的話題&#xff1a;當一個 HTTP 請求從瀏覽器發出&#xff0c;到最終被我們的 Spring Controller 處理&#xff0c;它到底經歷了一場怎樣的旅程&#xff1f; 理解這個流程&#xff0c;不僅僅是為…