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

news2024/11/15 12:13:58

在这里插入图片描述

因为我的项目是基于 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.coloradmin.cn/o/1486756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity 切换场景

场景切换前必须要将场景拖动到Build中 同步加载场景 using System.Collections; using System.Collections.Generic; //using UnityEditor.SearchService; using UnityEngine; // 场景管理 需要导入该类 using UnityEngine.SceneManagement;public class c3 : MonoBehaviour {…

你是否知道Python的列表翻转、排序和多维列表

1.reverse() 表示翻转列表中的元素,不会生成新列表 list1 [2343, 55, 4, 345, 676, 768] list1.reverse() print(list1) # [768, 676, 345, 4, 55, 2343] 2.sort() 对原列表元素进行排序,默认是升序 list1 [2343, 55, 4, 345, 676, 768] list1…

在Python中使用多线程(通俗版本)

一、多线程的介绍: 1.进程 通常一个进程包含一个或者多个线程,每个进程有自己独立的一块内存空间,所有的线程共享这一块空间,例如:在Windows操作系统中,一个运行的xx.exe就是一个进程。 2.线程 一个进程…

lua调用C++函数

第一步搭建lua的环境. win10 lua环境搭建-CSDN博客 我使用的环境是win10vs2015lua54 先来个最简单的lua调用C函数, 无参数无返回值的 第一步:定义C函数. int CTest(lua_State* L) // 返回值是固定的int类型,返回0表示没有返回参数,返回1表示有一个返回参数 {std::cout &l…

什么是支持向量机(Support vector machine)和其原理

作为机器学习的基础算法,SVM被反复提及,西瓜书、wiki都能查到详细介绍,但是总是觉得还差那么点,于是决定自己总结一下。 一、什么是SVM? 1、解决什么问题? SVM,最原始的版本是用于最简单的线…

【C++从0到王者】第五十站:B树

文章目录 一、内查找与外查找1.内查找2.外查找 二、B树概念三、B树的插入1.B树的插入分析2.B树插入总结3.插入代码实现4.B树满树和最空时候的对比5.B树的删除6.遍历B树7.B树的性能分析 一、内查找与外查找 1.内查找 像我们之前所用的在内存中的查找就是内查找 种类数据格式时…

Arduino应用开发——使用GUI-Guider制作LVGL UI并导入ESP32运行

Arduino应用开发——使用GUI-Guider制作LVGL UI并导入ESP32运行 目录 Arduino应用开发——使用GUI-Guider制作LVGL UI并导入ESP32运行前言1 使用GUI-Guider设计UI1.1 创建工程1.2 设计UI 2 ESP工程导入UI2.1 移植LVGL2.2 移植UI文件2.3 调用UI文件2.4 烧录测试 结束语 前言 GU…

STM32(5) GPIO(2)输出

1.点亮LED 1.1 推挽接法和开漏接法 要想点亮LED,有两种接法 推挽接法: 向寄存器写1,引脚输出高电平,LED点亮;向寄存器写0,引脚输出低电平,LED熄灭。 开漏接法: 向寄存器写0&…

杂记-买华强北电子产品的教训

之前不信邪,去华强北买了一个西部数据所谓全新的机械硬盘,1T,差不多300元。用了不到一年就坏了。然后去官网查S/N,结果查无device。Onedrive同步的时候,我把同步路径设置为机械硬盘,结果机械硬盘崩的时候&a…

HarmonyOS Next 实现登录注册页面(ARKTS) 并使用Springboot作为后端提供接口

1. HarmonyOS next ArkTS ArkTS围绕应用开发在 TypeScript (简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集 ArkTS在TS的基础上扩展了struct和很多的装饰器以达到描述UI和状态管理的目的 以下代码是一个基于…

【和鲸冬令营】通过数据打造爆款社交APP用户行为分析报告

【🐋和鲸冬令营】通过数据打造爆款社交APP用户行为分析报告 文章目录 【🐋和鲸冬令营】通过数据打造爆款社交APP用户行为分析报告1 业务背景2 数据说明3 数据探索性分析4 用户行为分析4.1 用户属性与行为关系分析4.2 转化行为在不同用户属性群体中的分布…

Android之MQTT的使用

MQTT的简单介绍 MQTT是广泛应用于物联网的传输协议,基于TCP MQTT有一个代理服务器,其客户端可以订阅主题或向一个主题发送消息,从而实现通信 MQTT 设计了 3 个 QoS 等级。 QoS 0:消息最多传递一次,如果当时客户端不…

Jmeter基础使用---Token鉴权接口关联

接口测试流程: 查看API接口文档,熟悉接口业务(地址、端口、参数、鉴权、状态码)设计接口测试用例(正例:正确的结果;反例:鉴权异常、参数异常、兼容异常、其他异常)使用接…

Java中的List

List集合的特有方法 方法介绍 方法名描述void add(int index,E element)在此集合中的指定位置插入指定的元素E remove(int index)删除指定索引处的元素,返回被删除的元素E set(int index,E element)修改指定索引处的元素,返回被修改的元素E get(int inde…

rtt的io设备框架面向对象学习-io设备管理层

目录 1.设备基类2.rtt基类2.1 rtt基类定义2.2 对象容器定义2.3 rtt基类构造函数 3.io设备管理接口4.总结 这层我的理解就是rtt基类和设备基类所在,所以抽离出来好点,不然每个设备类都要重复它。 1.设备基类 /include/rtdef.h中定义了设备基类struct rt_…

Spring:EnclosingClass工具类分辨

Spring:EnclosingClass工具类分辨 1 前言 通过Spring的工具分辨EnclosingClass类。 测试类如下: package com.xiaoxu.test.enclosingClass;/*** author xiaoxu* date 2024-01-18* java_demo2:com.xiaoxu.test.enclosingClass.Outter*/ public class …

计算机专业必看的几部电影推荐

计算机专业必看的几部电影,就像一场精彩的编程盛宴!《黑客帝国》让你穿越虚拟世界,感受高科技的魅力;《社交网络》揭示了互联网巨头的创业之路,《源代码》带你穿越时间解救世界,这些电影不仅带我们穿越到科…

模型部署 - onnx 的导出和分析 -(1) - PyTorch 导出 ONNX - 学习记录

onnx 的导出和分析 一、PyTorch 导出 ONNX 的方法1.1、一个简单的例子 -- 将线性模型转成 onnx1.2、导出多个输出头的模型1.3、导出含有动态维度的模型 二、pytorch 导出 onnx 不成功的时候如何解决2.1、修改 opset 的版本2.2、替换 pytorch 中的算子组合2.3、在 pytorch 登记&…

SpringBoot+Maven多环境配置模式

我这里有两个配置文件 然后在最外层的父级POM文件里面把这个两个配置文件写上 <profiles><profile><id>druid</id><properties><spring.profiles.active>druid</spring.profiles.active></properties><activation><…

管理系统提升:列表页构成要素,拒绝千篇一律

大家伙&#xff0c;我是大千UI工场&#xff0c;专注UI知识案例分享和接单&#xff0c;本期带来B端系统列表页的分享&#xff0c;欢迎大家关注、互动交流。 一、什么是列表页 管理系统列表页是指管理系统中用于展示和管理数据的页面&#xff0c;通常以表格或列表的形式呈现。列…