文章目录

  • 前言
      • 场景设定:维护代码分层,禁止“跨级调用”
      • 实现步骤:从零到一,创建你的第一条自定义规则
        • **第 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;不仅仅是为…