ESLint + StyleLint + Prettier + VSCode 打造最优雅的前端开发体验

news2024/11/15 17:29:52

ESLint + StyleLint + Prettier + VSCode 打造最优雅的前端开发体验


引言

对于一个成熟的前端团队,统一的编码规范和提交规范尤其重要。要保证秩序井然、风格统一、整齐有序,光把规范写在文档里是没有太多实际价值的。没有人愿意去一条一条看规则,然后背下来,最后在写代码时按照规范来遵守。

如何优雅的开发,守住代码质量的护城河(moat),是尤其值得我们思考的问题。

本文是如上这篇的番外篇,除了原文中的内容外,增加了 StyleLint 来检查样式,增加了 Preiiter 来美化代码并与 ESLint 和 StyleLint 优雅配合,增加了 VSCode 配置来实现整套开发体验在 VSCode 下的开箱即用

护城河

概述

一个理想的开发体验可以抽象成这样:

只关心业务代码,具备优雅的工作流,调试时所有代码都在源码中,产物符合规范要求。

但要想真正符合规范的要求,光靠字面约束以及开发自觉是远远不够的,必须利用工程手段,让开发在开发过程中能使用自动化的工具来完成规范化的要求,而开发本身可以全身心的投入到业务开发中

**本文结合 eslint 、 stylelint 、 prettier 、 vscode 、standardjs 、 husky 、 lint-staged 、 commitizen 、commitlint 等工具,系统化的构建了前端规范解决方案。
**

后续考虑把整套规范写成工具(moat),能一键应用到其他项目工程中。

编码约束

前端编码规范主要包括JS和CSS两部分,分别使用 ESLint 和 Stylelint 来落地工程中使用,同时结合 Prettier 来做编码风格统一。如下图所示:

ESLint + StyleLint + Prettier 搭配完成编码约束的自动化

ESLint

工程集成了 ESLint,自动发现并修复 JavaScript 中的问题。其中 .eslintrc.js 为 eslint 的配置文件。根据不同的工程,配置会不一样,本文工程使用的配置内容如下:

module.exports = {
  env: {
    browser: true,
    es2021: true,
  },
  extends: ['plugin:react/recommended', 'standard', 'plugin:prettier/recommended'],
  parser: '@typescript-eslint/parser',
  parserOptions: {
    ecmaFeatures: {
      jsx: true,
    },
    ecmaVersion: 'latest',
    sourceType: 'module',
  },
  plugins: ['react', '@typescript-eslint'],
  rules: {
    // eslint 规则写这里
    'comma-dangle': ['error', 'only-multiline'],
  }
}

配置的具体含义以及作用,请参考 [ESLint](https://github.com/eslint/eslint) 官网文档。

需要安装的包有:

eslint: ESLint 的程序入口,在 lint-staged 中设定针对 JS 文件执行该程序
eslint-config-standard: 一套通用的 ESLint 规则配置。
eslint-config-prettier:关闭与 Prettier 可能冲突的 ESLint 规则,解决 ESLint + Prettier 时的冲突问题
eslint-plugin-prettier:Prettier 的插件,使得 ESLint + Prettier 结合使用成为可能。让 Prettier 的格式化操作归属在 ESLint 的过程中执行,对于 Prettier 发现的格式问题,也在 ESLint 的过程中自动修复

其中 eslint-config-standard 就是一套行业通用的 ESLint 规则配置,由 JavaScript Standard Style 提供。具体单项规则可以参考:https://standardjs.com/rules.html

JavaScript Standard Style

上面 ESLint 配置文件中 extends 字段配置的 standard 表示校验以及修复的规则使用 JavaScript Standard Style 标准

standardjs 能提前发现风格及程序问题,减少代码审查过程中反反复复的修改过程,节约大量时间并且保持全局统一。

默认情况下,使用 standardjs 就够了,不用再制定额外的规则,如果实际开发中确有需要,可以在.eslintrc.js rules 中配置

StyleLint

Stylelint 是一个强大、先进的 CSS 代码检查器(linter),能够帮助开发规避 CSS 代码中的错误并保持一致的编码风格。

它具有如下功能:

理解 最新的(modern) CSS 语法和功能
拥有超过 170 条内置规则 以捕获错误并强制执行编码约定
支持 插件 以创建你自己的规则
自动 修复 大多数代码格式上的问题
拥有一个 不断增长的社区,并且被 Google、GitHub 和 WordPress 所使用

还可以被扩展为:

解析 类似 CSS 的语法,例如 SCSS、Sass、Less 以及 SugarSS
能够从 HTML、Markdown 和 CSS-in-JS 对象以及模板文本中提取 内嵌的样式代码

需要安装的包有:
stylelint: Stylelint 的程序入口,在 lint-staged 中设定针对样式文件执行该程序
stylelint-config-standard: Stylelint 约定的规则配置集,Stylelint 按照这个规则执行
stylelint-config-prettier: 关闭与 Prettier 可能冲突的规则,解决 Stylelint + Prettier 时的冲突问题
stylelint-prettier:Prettier 的插件,使得 Stylelint + Prettier 结合使用成为可能。让 Prettier 的格式化操作归属在 Stylelint 的过程中执行,对于 Prettier 发现的格式问题,也在 Stylelint 的过程中自动修复

其中 stylelint-config-standard 就是一套行业通用的 Stylelint 规则配置。包括如下具体规则: The Idiomatic CSS Principles, Google’s CSS Style Guide, Airbnb’s Styleguide, and @mdo’s Code Guide.

Prettier

Prettier 是一个“有态度”的代码格式化工具,支持大量编程语言。和 ESLint (主要关注语法错误,做了一部分格式化的事情) 相比,更侧重于代码风格以及样式。所以日常开发中需要结合 Prettier 和 ESLint 一起使用,才能优雅无懈可击。

本工程配置,参考 prettier.config.js 文件

需要安装的包有:

prettier

提交约束

上面完成了 ESLint + Stylelint +Prettier 的配置,已经可以在工程中使用 yarn eslint xx.tsx 、 yarn stylelint xx.less 、yarn prettier xx.md 等来校验和修复不同的文件。但依靠开发手动去执行命令不太现实,依然需要工程化的手段来帮助开发自动完成

如下介绍使用 husky + lint-staged + commitizen + commitlint 来实现在提交时自动进行校验和修复,同时约束提交本身的格式等。核心流程如下图所示:

提交约束核心流程图示

commitizen

commitizen 是用来格式化 git commit message 的工具,它提供了一种问询式的方式去获取所需的提交信息。

问询式提交

cz-conventional-changelog 是用来规定提交时需要输入哪些信息,譬如提交的类型是修复问题还是功能开发,提交影响范围等等,cz-conventional-changelog 是官网提供的规则,有追求的前端团队完全可以根据项目实际情况自已开发适合的规则,但现阶段够用了,没必要修改。

由于 windows 平台不支持复用 git commit 来提交,所以可以通过 package.json 中的 cz 脚本命令来提交

 // package.json
 "scripts": {
    "cz": "git-cz"
 } 

本质上就是在工程根目录执行 git-cz 命令来提交,所以你可以使用 yarn cz**、yarn git-cznpm run cz、**npx git-cz 任意一个来完成你的提交。

需要安装的包有:
commitizen
cz-conventional-changelog

husky + lint-staged

husky 是处理 git hooks 的工具,能够拦截 git hooks,让“校验提交格式”、“校验代码”等等成为可能。

lint-staged 是针对暂存区进行 lint 操作的工具。一来不用每次 lint 全局的代码节省时间;二来对于老项目应用 lint 规则时,由于历史遗留原因导致所有提交都没法通过,所以也需要只针对即将要提交的代码进行 lint。

工具使用说明详见: husky

结合使用 lint-staged 工具只针对当前修改的部分进行检测。

// package.json
 "lint-staged": {
  "*.{js,jsx,ts,tsx}": [
     "eslint --fix"
  ],
  "*.{less,css}": [
     "stylelint --fix"
  ]
 }

安装好 husky 后,项目根目录会多出 .husky 文件夹,用于存在 git hooks 的配置,同时 package.json 中增加 lint-staged 配置,如上所示表示对于 js、jsx、ts、tsx 在提交时自动使用 eslint 进行校验和自动修复, 对于 less、css 在提交时自动使用 styleint 进行校验和修复。

只有通过的代码才会被提交,如果存在不符合规范的,会在提交时报错,按照要求修复即可.

需要安装的包有:

husky:处理 git hooks
lint-staged:只对暂存区生效

使用 husky+lint-staged 会在提交时拦截和自动修复,如果能在开发时实时提示错误,在保存时自动修复错误,就能避免在提交时集中修复错误的问题。如何实现,请参考工程配置章节。

commitlint

上面通过 commitizen 实现了问询式的提交方式,但没法保证开发遵守这个约定,为了防止开发误操作,使用 git commmit 自行提交代码,所以在提交入库前,使用 commitlint 对提交信息进行校验。

commitlint 是用来校验提交是否符合规范的工具。

需要的安装包有:

@commitlint/cli : 提供校验的执行入口 commitlint , 结合 husky 使用 commmit-msg 的 git hook,在提交代码来执行提交信息的检查,如果不符合提交规范,就会报错提示。
@commitlint/config-conventional 一套通用的提交信息校验方案,是 Angular 团队出品的。如果需要也可定制自己团队的规范。

工程配置

前面部署了规范以及校验的工具,对于提交也进行了拦截,已经能保证代码的质量。但为了进一步提高开发的效率,不希望在提交时才发现一堆校验错误。

以下以 vscode 为例,实现能在开发过程中 实时提示错误一键自动格式化&修复 的功能,达到所有开发保持一致的开箱即用。

其它编辑器类似,可以参考各自编辑器的配置

VSCode 插件

如果想要在开发时,编辑器自动提示错误并自动修复,请务必安装 ESLint 插件 和 StyleLint 插件

工程依赖的插件配置在 .vscode/extensions.json, 后续如果有新的依赖插件,可以配置在这里,并提交,保证所有开发者依赖插件的统一。

{
 "recommendations": ["dbaeumer.vscode-eslint", "stylelint.vscode-stylelint"]
}

目前只需要 ESLint 、 StyleLint 两个插件。

插件安装好后,对于代码中出错的问题,会显示如下图所示错误提示:

引用于Modern.js ,侵删

同时文件名、右侧预览框中都有提示,非常醒目。

VSCode 配置

工程依赖的 vscode 配置在 .vscode/setting.json,是这些配置让“编辑器实时提示错误”、“保存时自动修复”、“右键格式化文件时自动修复”成为可能。

安装好插件后,还需要对插件进行相应的配置,才能适应不同的开发需要。

譬如,需要把 typescript、javascript、typescriptreact、javascriptreact 等文件默认格式化的工具设置成 eslint 的自动修复。这样在这些文件里,右键 - 格式化文档 能自动调起 eslint 进行校验和格式化。

StyleLint 同理进行配置。

本文工程的配置如下,开启了保存时自动 lint, 这样在保存文件时,自动完成所有校验和修复。

{
  "eslint.run": "onType",
    "eslint.codeActionsOnSave.mode": "all",
      "eslint.format.enable": true, // 允许eslint 格式化对应的文件
        "[typescript]": {
    "editor.defaultFormatter": "dbaeumer.vscode-eslint",
      "editor.codeActionsOnSave": {
      // 开启保存时执行eslint进行校验和格式化
      "source.fixAll.eslint": true
    },
    "editor.formatOnSave": false // 所以编辑器默认的格式化设置为false,避免重复格式化
  },
  "[javascript]": {
    "editor.defaultFormatter": "dbaeumer.vscode-eslint",
      "editor.codeActionsOnSave": {
      "source.fixAll.eslint": true
    },
    "editor.formatOnSave": false
  },
  "[typescriptreact]": {
    "editor.defaultFormatter": "dbaeumer.vscode-eslint",
      "editor.codeActionsOnSave": {
      "source.fixAll.eslint": true
    },
    "editor.formatOnSave": false
  },
  "[javascriptreact]": {
    "editor.defaultFormatter": "dbaeumer.vscode-eslint",
      "editor.codeActionsOnSave": {
      "source.fixAll.eslint": true
    },
    "editor.formatOnSave": false
  },
  "[sass]": {
    "editor.defaultFormatter": "stylelint.vscode-stylelint", // 设置编辑器默认格式化工具为stylelint
      "editor.codeActionsOnSave": {
      "source.fixAll.stylelint": true // 保存时自动使用sytlelint 修复
    },
    "editor.formatOnSave": false // 关闭编辑器默认的保存格式化
  },
  "[css]": {
    "editor.defaultFormatter": "stylelint.vscode-stylelint",
      "editor.codeActionsOnSave": {
      "source.fixAll.stylelint": true
    },
    "editor.formatOnSave": false
  },
  "[less]": {
    "editor.defaultFormatter": "stylelint.vscode-stylelint",
      "editor.codeActionsOnSave": {
      "source.fixAll.stylelint": true
    },
    "editor.formatOnSave": false
  }
}

总结

最后希望每一个前端仓库都守城成功!

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

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

相关文章

ovn:中央节点ip变更导致节点失联

1.当ovn的中央节点ip突然变更(从3.197->1.114)后,便再无法同节点之间进行信息的同步。 2.已将节点的ovn-remote变更到最新的中央节点ip 3.但是进行ovn-controller 检测时却显示失败 4.通过telnet 测试6642 端口失败 5.最后发现原来是中央…

【UE4 第一人称射击游戏】05-设置角色动画

素材资料地址: 链接:https://pan.baidu.com/s/1epyD62jpOZg-o4NjWEjiyg 密码:jlhr 步骤: 1.新建一个名为“Character”的文件夹 将Swat.fbx导入Character文件夹中 新建一个名为“Animation”的文件夹 将Animation文件夹内的所…

大数据基础平台搭建-(一)基础环境准备

大数据基础平台搭建-(一)基础环境准备 大数据平台系列文章: 1、大数据基础平台搭建-(一)基础环境准备 2、大数据基础平台搭建-(二)Hadoop集群搭建 目录大数据基础平台搭建-(一&#…

docker安装minio集群

docker安装minio集群 文章目录docker安装minio集群1、所有节点配置主机名解析2、配置时间同步,关闭防火墙和selinux。3、所有节点安装docker4、部署minio集群,3个节点每个节点挂载2个目录10.20.138.5210.20.138.5310.20.138.545、访问任意节点的9000端口…

vm vh移动端布局及 bilibili官网移动端首页布局

vm和vh是啥? 市场上的移动端大多数为flex布局,此时我们用到了rem这个单位,但是rem需要媒体查询,要根据页面是尺寸进行修改,而vm/vh省去各种判断和修改,像B站就通过vue和vm写的。 vm/vh是一个相对单位&…

【Quarkus技术系列】「云原生架构实战」配置参考指南相关的功能机制配置介绍分析

回顾Quarkus介绍 Quarkus的概念定义 Quarkus是一个为Java虚拟机(JVM)和原生编译而设计的全堆栈 Kubernetes 原生 Java 框架,用于专门针对容器优化 Java,并使其成为无服务器、云和 Kubernetes 环境的高效平台。 Quarkus与框架整…

Spring Boot整合分布式搜索引擎ElasticSearch 实现相关操作

一、ElasticSearch 介绍 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步…

VS Code 中的增强 code CLI

Visual Studio Code 的核心是一个代码编辑器,它通过我们的远程开发经验与其他环境集成,变得更加强大和灵活。 你可能不知道的是,VS Code 有一个内置的命令行界面(CLI),可以让你控制启动和管理编辑器的方式——你可以通过命令行选项…

【图像处理】基于二维FIR的特定角度边缘检测(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

HiveServer2 和 HiveMetastore 梳理

本文重新回顾一下Hive的两个核心服务:HiveServer2 和 HiveMetastore(HMS)。很多人会简单地把HiveServer2当成Hive的JDBC/ODBC服务,不启动HiveServer2服务,就没有10000端口,JDBC/ODBC客户端就连接不上Hive。从使用者的角度理解这就…

常见的数据通信方式有哪些?

数据通信方式指通信双方在信号发送、传输和接收这3个环节对信号的处理方式,下面将对不同的信号处理方式进行讲解。 单工、半双工与全双工通信 按信道上信号的传输方向与时间的关系,通信方式可分为单工通信、半双工通信与全双工通信。 (1) 单工通信 单…

Minecraft 1.19.2 Forge模组开发 09.动画效果方块

我们本次尝试制作一个具有动画效果的方块 效果演示效果演示效果演示 首先,请确保你的开发包中引入了geckolib依赖,相关教程请参考:Minecraft 1.19.2 Forge模组开发 03.动画生物实体 1.首先我们要使用geckolib制作一个物品和对应的动画: 在…

TDOA 定位技术和实际应用简介

介绍了TDOA(Time difference of Arrival)的基本原理,列举了TDOA 定位的优势,并且通过实例分析其在实际应用中的有效性,结合实验数据分析了影响TDOA 的因素。本文提出TDOA 是一种简单高效的定位方式,可以被广…

js原型与原型链完整图解

首先要知道: 1、所有对象(除null)都有一个__proto__属性指向构造函数的原型对象 2、所有对象(除null)都有一个constructor属性指向构造函数(函数也是对象) 已知:有一个构造函数Fn…

如何在交付运维过程中建立风险底线意识,提前识别风险,避免项目延期?

大家好,我是小赛。又到了每周的【项目管理案例】分享栏目了。本期案例来自于希赛PM创造营项目经理们的分享:项目延期是每位项目经理或多或少都会遇到的工作难题,本期我们一起来探讨一下:如何在交付运维过程中建立风险底线意识&…

【檀越剑指大厂—SpringMVC】SpringMVC篇

一.基础概念 1.什么是 MVC MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织代码。MVC 主要作用是降低了视图与业务逻辑间的双向偶合。MVC 不是一种设计模式,MVC 是一种架构模…

APS排产帮助面板制造厂商进行计划调整

液晶面板是决定液晶显示器亮度、对比度、色彩、可视角度的材料,液晶面板的价格走势会直接影响到液晶显示器的价格,液晶面板作为电视、显示器等产品的核心组成部件,一般占到成本的60%以上。在液晶面板下行周期中,面板大厂们日子更不…

设计数据库中常见的规范

文章目录命名规范合适的字段类型主键设计要合理合适的字段长度优先考虑逻辑删除,而不是物理删除每个表都需要添加一些通用字段表的字段不要太多尽可能使用not null 定义字段评估哪块要加索引避免使用MySQL保留字不要外键关联,一般用代码维护一般都选择IN…

外包四年太差劲,幡然醒悟要跳槽

前几天有个读者过来说,“二哥,外包干了四年,感觉和外界差距有点大,现在被动醒悟,希望你能帮我制定一下学习路线。” 那二哥这么负责任,必须得承担起这份职责啊!于是我就让读者整理了一份 1.0 版…

RL - 简单介绍

目录 一、两种机器学习类型 1.1 预测型机器学习 1.2 决策型机器学习 二、强化学习的定义 三、强化学习的交互过程 四、强化学习系统要素 五、强化学习智能体分类 一、两种机器学习类型 1.1 预测型机器学习 1有监督学习: 基于数据的一部分输入,去预测相关输…