在你的 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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/427865.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【比较mybatis、lazy、sqltoy、mybatis-flex、easy-query操作数据】操作批量新增、分页查询(三)

orm框架使用性能比较 比较mybatis、lazy、sqltoy、mybatis-flex、easy-query操作数据 环境: idea jdk17 spring boot 3.0.7 mysql 8.0测试条件常规对象 orm 框架是否支持xml是否支持 Lambda对比版本mybatis☑️☑️3.5.4sqltoy☑️☑️5.2.98lazy✖️☑️1.2.4…

哪个有名的工具可以安全记事 私密记事本笔记推荐

在这个数字化的时代,我们的生活已经离不开各种记事工具。它们帮助我们记录生活中的点点滴滴,无论是工作上的重要事项,还是个人的私密心情。然而,当我在寻找一个能够安心记录私密事情的工具时,安全性成为了我最关心的因…

23.基于springboot + vue实现的前后端分离-在线旅游网站系统(项目 + 论文PPT)

项目介绍 本旅游网站系统采用的数据库是MYSQL ,使用 JSP 技术开发,在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 技术选型 后端: SpringBoot Mybatis 数据库 : MyS…

Matlab 机器人工具箱 动力学

文章目录 R.dynR.fdynR.accelR.rneR.gravloadR.inertiaR.coriolisR.payload参考链接 官网:Robotics Toolbox - Peter Corke R.dyn 查看动力学参数 mdl_puma560; p560.dyn;%查看puma560机械臂所有连杆的动力学参数 p560.dyn(2);%查看puma560机械臂第二连杆的动力学…

MongoDB Java实战

📕作者简介: 过去日记,致力于Java、GoLang,Rust等多种编程语言,热爱技术,喜欢游戏的博主。 📗本文收录于MongoDB系列,大家有兴趣的可以看一看 📘相关专栏Rust初阶教程、go语言基础…

SpringBoot+Vue实现el-table表头筛选排序(附源码)

👨‍💻作者简介:在笑大学牲 🎟️个人主页:无所谓^_^ ps:点赞是免费的,却可以让写博客的作者开心好几天😎 前言 后台系统对table组件的需求是最常见的,不过element-ui的el…

机器学习-面经(part2)

3. 验证方式 3.1什么是过拟合?产生过拟合原因? 定义:指模型在训练集上的效果很好,在测试集上的预测效果很差 数据有噪声 训练数据不足,有限的训练数据 训练模型过度导致模型非常复杂3.2 如何避免过拟合问题? 3.3 什么是机器学习的欠拟合?产生原…

vmware扩容CentOS磁盘的两种方案

vmware扩容CentOS磁盘的两种方案 扩容磁盘的两种需求 扩容磁盘,一种情况,我们希望见原来不足的存储无缝伸缩扩容,通常是给原本的根目录/扩容,另一种是在另一个目录上挂载新磁盘。 本次记录第一种情况,主要参考https…

[LeetBook]【学习日记】寻找链表相交节点

来源于「Krahets」的《图解算法数据结构》 https://leetcode.cn/leetbook/detail/illustration-of-algorithm/ 本题与主站 160 题相同:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/ 训练计划 V 某教练同时带教两位学员,分别以…

Sqli-labs靶场第19关详解[Sqli-labs-less-19]自动化注入-SQLmap工具注入

Sqli-labs-Less-19 通过测试发现,在登录界面没有注入点,通过已知账号密码admin,admin进行登录发现: 返回了Referer ,设想如果在Referer 尝试加上注入语句(报错注入),测试是否会执行…

操作系统|概述|系统分类——笔记

1.1_1操作系统的概念和功能 操作系统的概念 操作系统(Operating System, OS) 是指控制和管理整个计算机系统的 硬件和软件 资源,并合理地组织调度计算机和工作和资源的分配; 1操作系统是系统资源的管理者 以提供给用…

macos docker baota 宝塔 搭建 ,新增端口映射

拉取镜像仅拉取镜像保存到本地,不部署容器,仅需拉取一次,永久存储到本地镜像列表 docker pull akaishuichi/baota-m1:lnmp 其他可参考:宝塔面板7.9.2docker镜像发布-集成LN/AMP支持m1/m2 mac版本 - Linux面板 - 宝塔面板论坛 运行…

Sora爆火,数字人IP如何借助AIGC视频生成软件制作短视频营销?

ChatGPT、Sora等大模型的出现,创新了短视频内容创作生产方式。但目前Sora模型无法准确模拟复杂场景的物理特性,并且可能无法理解因果关系导致视频失真。 广州虚拟动力基于用户使用需求,推出了AIGC数字人视频生成平台,企业、品牌可…

Java基础---lambda表达式

一、为什么要引入lambda表达式 lambda 表达式是一个可传递的代码块 , 可以在以后执行一次或多次 。 在介绍lambda表达式之前,我们看一下,以前,我们对于一个问题的通常写法。 假设你已经了解了如何按指定时间间隔完成工作&#xf…

Django官网项目 二

官网地址:Writing your first Django app, part 2 | Django documentation | Django 创建模组: 注册model (bug:没有加后面的逗号) 在manage.py 的目录下: python manage.py makemigrations polls pyth…

(十)SpringCloud系列——openfeign的高级特性实战内容介绍

前言 本节内容主要介绍一下SpringCloud组件中微服务调用组件openfeign的一些高级特性的用法以及一些常用的开发配置,如openfeign的超时控制配置、openfeign的重试机制配置、openfeign集成高级的http客户端、openfeign的请求与响应压缩功能,以及如何开启…

python实现有限域GF(2^8)上的乘法运算

有限域GF(2^8)上的乘法运算可以看成多项式的乘法 5e转换成二进制为0101 1110,对应的多项式为x^6x^4x^3x^2x 3f转换成二进制为0011 1111,对应的多项式为x^5x^4x^3x^2x1 将这两个多项式相乘再模多项式x^8x^4x^3x1得到结果为1110 0101,转换为…

CUDA 中的线程组织

明朝那些事中有一句话:我之所以写徐霞客是想告诉你,所谓千秋霸业万古流芳,与一件事相比,其实都算不了什么,这件事情就是——用你喜欢的方式度过一生。 我们以最简单的 CUDA 程序:从 GPU 中输出 Hello World…

ES入门四:Term Query Api实践

通过上一篇文章我们知道,在全文搜索的时候,系统会对检索内容进行分词,然后在对每个词项进行检索,但是我们今天介绍的基于词项查询的Api是不需要对输入内容进行分词的,Term Level Query会将输入的内容作为一个整体来进行…

es6 相关面试题

1 var, let ,const 区别? 2 手写将对象进行合并 手写合并对象 3 普通函数和箭头函数区别? 4 find 和 filter的区别? 5 some和every区别?