如何方便的为团队所有项目统一 ESLint 配置

简介: 近期给团队项目 CLI 做重构,其中涉及到 ESLint 的部分,这部分之前的方式是通过开发和编译时调用 ESLint 的 CLI 去检查项目代码,虽然不会出什么问题,但是各种 IDE 的提示就废掉了,所以打算换一种比较通用的方式。

前言

近期给团队项目 CLI 做重构,其中涉及到 ESLint 的部分,这部分之前的方式是通过开发和编译时调用 ESLint 的 CLI 去检查项目代码,虽然不会出什么问题,但是各种 IDE 的提示就废掉了,所以打算换一种比较通用的方式。

统一配置处理

为了统一配置,配置自然是不能直接暴露给开发者的,不然很容易被各种魔改就废了,所以需要将配置包装起来。

ESLint extends

ESlint 中支持 extends 属性,用于在现有配置中扩展上一些其它的通用的配置。主要支持以下几种传值:

  • 预置的通用配置:eslint:recommended、eslint:all

实际配置文件在 eslint/conf 中可以找到

  • 配置文件地址:./path/to/shared/.eslintrc
  • 插件中提供的配置:plugin:react/recommended

可以在 eslint-plugin-react/index.js 中看到的配置详情,eslint-plugin- 的前缀可省略,/recommended 为包中抛出的 configs 的 recommended 属性

  • 配置模块包:react-app

实际配置在 eslint-config-react-app 中可以找到,eslint-config- 的前缀为可省略

通过 extends,可以方便的将统一的配置文件放置在自定义配置包中。假设我们现在定义一个通用的模块包名:@ucloud/eslint-config-console

Package eslintConfig

ESlint 配置除了可以使用配置文件,也可以在 package.json 中配置 eslintConfig 字段,较配置文件稍微简洁一点。直接如下使用上述模块包:

// package.json
{
    "name": "my-package",
    "eslintConfig": {
        "extends": "@ucloud/console"
    }
}
复制代码

依赖包

可以将 ESLint 以及相关的插件、依赖包等安装到 config 包中,保证包的统一性。

参考

最终 @ucloud/eslint-config-console 如下

package.json

{
  "name": "@ucloud/eslint-config-console",
  "version": "0.0.3",
  "description": "eslint config for console develop",
  "main": "index.js",
  "author": "zxbing0066@gmail.com",
  "dependencies": {
    "@typescript-eslint/eslint-plugin": "^2.6.1",
    "@typescript-eslint/parser": "^2.6.1",
    "babel-eslint": "^10.0.3",
    "eslint": "^6.6.0",
    "eslint-plugin-flowtype": "^4.3.0",
    "eslint-plugin-import": "^2.18.2",
    "eslint-plugin-jsx-a11y": "^6.2.3",
    "eslint-plugin-react": "^7.16.0",
    "eslint-plugin-react-hooks": "^2.2.0"
  }
}
复制代码

indexjs

module.exports = {
    root: true,
    parser: 'babel-eslint',
    plugins: ['import', 'flowtype', 'jsx-a11y', 'react', 'react-hooks'],
    env: {
        browser: true,
        commonjs: true,
        es6: true,
        jest: true,
        node: true
    },
    parserOptions: {
        ecmaVersion: 2018,
        sourceType: 'module',
        ecmaFeatures: {
            jsx: true
        }
    },
    extends: ['eslint:recommended', 'plugin:react/recommended'],
    overrides: [
        {
            files: ['**/*.ts?(x)'],
            parser: '@typescript-eslint/parser',
            parserOptions: {
                ecmaVersion: 2018,
                sourceType: 'module',
                ecmaFeatures: {
                    jsx: true
                },
                warnOnUnsupportedTypeScriptVersion: true
            },
            plugins: ['@typescript-eslint'],
            extends: ['eslint:recommended', 'plugin:react/recommended', 'plugin:@typescript-eslint/recommended']
        }
    ],
    settings: {
        react: {
            version: 'detect'
        }
    }
};
复制代码

项目中使用

{
  "name": "my-project",
  "eslintConfig": {
    "extends": "@ucloud/console"
  }
}
复制代码

保证配置不被篡改

通过 extends 可以方便统一配置,但是配置在各项目中依旧容易被篡改,这个时候需要做一些防范措施。

CLI

如果有统一的开发用 CLI,可以在 CLI 中做好校验。

commit hook

通过 commit hook 在项目 commit 时校验项目的 eslint 配置是否被篡改,不过依然可以绕过。

CI/CD

可在 CI/CD 阶段做校验,配置篡改后直接报错。

发布系统发布时做校验

在最终发布时做好校验。

后续升级

前端技术发展迅猛,也需要考虑到后续升级的问题。

  • 尽量保持配置一致性
  • 可切割版本,老项目不做升级,新项目直接使用新版
  • 通过 AST,将规则差异处做转换

总结

通过 ESLint extends 可以很好的统一团队的配置,并且不会影响 IDE 的 lint 提示。

借助 CI/CD 等工具做好检验工作,可以有效防止统一配置被篡改。

相关文章
|
安全 前端开发 iOS开发
钉钉里微应用ios 底部安全区域的颜色怎么修改?
钉钉里微应用ios 底部安全区域的颜色怎么修改?
436 5
|
移动开发 前端开发 Java
《钉钉应用开发者速成手册》之“钉钉应用开发入门——H5微应用”
本文将以获取当前用户部门信息的H5微应用为例,帮助您快速了解钉钉H5微应用的开发流程。
3446 0
《钉钉应用开发者速成手册》之“钉钉应用开发入门——H5微应用”
|
前端开发 JavaScript Android开发
React-Native优质开源项目
React-Native优质开源项目
|
12月前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
506 2
|
存储 关系型数据库 MySQL
如何搭建MySQL
【8月更文挑战第16天】如何搭建MySQL
292 1
|
XML JSON 数据挖掘
天猫商品评论接口:从申请到应用全攻略
天猫商品评论数据接口(Tmall.item_review)让商家与开发者获取天猫商品评论数据。接口通过HTTP请求提供评论内容、时间、评分等信息,助力商家优化产品与营销策略。使用需创建应用获App Key/Secret,编写代码调用并处理JSON/XML响应。适用于数据分析、商品优化、营销推广及客户管理。遵循规定合法使用数据。
|
XML JSON 前端开发
Bpmn.js 进阶指南之原理分析与模块改造(下)
Bpmn.js 进阶指南之原理分析与模块改造
2230 2
|
人工智能 C++ 开发者
verilog vscode 与AI 插件
【9月更文挑战第11天】在Verilog开发中,使用Visual Studio Code(VS Code)结合AI插件能显著提升效率。VS Code提供强大的编辑功能,如语法高亮、自动补全和代码格式化;便捷的调试功能,支持多种调试器;以及丰富的插件生态。AI插件则可自动生成代码、优化现有代码、检测并修复错误,还能自动生成文档。常用插件包括Verilog AI Assistant和Verilog Language Server,可根据需求选择合适的工具组合,提高开发效率和代码质量。
1117 2
|
JavaScript 前端开发 API
Vue3 跟着尤雨溪学 TypeScript 之 Ref 类型从零实现
Vue3 中,ref 是一个新出现的 api,不太了解这个 api 的小伙伴可以先看 官方api文档。 简单介绍来说,响应式的属性依赖一个复杂类型的载体,想象一下这样的场景,你有一个数字 count 需要响应式的改变。
|
前端开发
前端如何制作简易的菜单多级导航栏
前端如何制作简易的菜单多级导航栏
338 0