2.3.2 • Published 3 days ago

@kirklin/eslint-config v2.3.2

Weekly downloads
-
License
MIT
Repository
-
Last release
3 days ago

@kirklin/eslint-config

npm version npm downloads JSDocs License javascript_code style

Features

  • “双引号”,必须有分号;
  • 自动修复格式(旨在独立使用 不包括 Prettier)
  • 排序导入项,悬挂逗号
  • 合理的默认设置,最佳实践,只需一行配置
  • 设计用于与TypeScript,JSX,Vue无缝配合
  • 对json,yaml,toml,markdown等进行语法检查
  • 有主见,但可非常定制化
  • ESLint Flat配置,轻松组合!
  • 使用ESLint Stylistic
  • 默认情况下遵守.gitignore
  • 可选的React, Svelte, UnoCSS, Astro, Solid支持
  • 可选的格式化程序支持CSS,HTML等。
  • 样式原则:最小化阅读,稳定的差异性,保持一致性

!IMPORTANT 从v1.0.0开始,该配置已重写为新的 ESLint Flat配置, 请查看发布说明以获取更多详细信息。

使用方法

起始向导

我们提供了一个命令行工具,帮助您快速设置项目,或者通过一个命令从旧的配置迁移到新的平面配置。

npx @kirklin/eslint-config@latest

手动安装

如果您更喜欢手动设置:

pnpm i -D eslint @kirklin/eslint-config

然后在您的项目根目录下创建 eslint.config.mjs 文件:

// eslint.config.mjs
import kirklin from "@kirklin/eslint-config";

export default kirklin();

如果您仍然使用旧版eslintrc的一些配置,您可以使用@eslint/eslintrc将它们转换为flat config

// eslint.config.mjs
import kirklin from "@kirklin/eslint-config";
import { FlatCompat } from "@eslint/eslintrc";

const compat = new FlatCompat();

export default kirklin(
  {
    ignores: [],
  },

  // Legacy config
  ...compat.config({
    extends: [
      "eslint:recommended",
      // Other extends...
    ],
  })

  // Other flat configs...
);

请注意,在Flat配置中不再支持 .eslintignore,请查看自定义以获取更多详细信息。

在 package.json 中添加脚本

For example:

{
  "scripts": {
    "lint": "eslint .",
    "lint:fix": "eslint . --fix"
  }
}

VS Code支持(自动修复)

为了在Visual Studio Code中实现保存时自动修复代码的功能,您需要安装ESLint扩展并配置相应的设置。以下是详细的步骤和说明:

  1. 安装 VS Code ESLint扩展

  2. 在您的项目根目录下,创建或编辑.vscode文件夹中的settings.json文件,添加以下配置:

{
  // 启用ESLint flat config支持
  "eslint.experimental.useFlatConfig": true,

  // 禁用默认的格式化程序,改用ESLint进行格式化
  "prettier.enable": false,
  "editor.formatOnSave": false,

  // 自动修复
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": "explicit",
    "source.organizeImports": "never"
  },

  // 在IDE中隐藏样式规则的提示,但仍然自动修复它们
  "eslint.rules.customizations": [
    { "rule": "style/*", "severity": "off" },
    { "rule": "format/*", "severity": "off" },
    { "rule": "*-indent", "severity": "off" },
    { "rule": "*-spacing", "severity": "off" },
    { "rule": "*-spaces", "severity": "off" },
    { "rule": "*-order", "severity": "off" },
    { "rule": "*-dangle", "severity": "off" },
    { "rule": "*-newline", "severity": "off" },
    { "rule": "*quotes", "severity": "off" },
    { "rule": "*semi", "severity": "off" }
  ],

  // 为所有支持的语言启用ESLint
  "eslint.validate": [
    "javascript",
    "javascriptreact",
    "typescript",
    "typescriptreact",
    "vue",
    "html",
    "markdown",
    "json",
    "jsonc",
    "yaml",
    "toml",
    "gql",
    "graphql"
  ]
}

自定义

从v1.0开始,我们迁移到了ESLint Flat 配置。它提供了更好的组织和组合。

通常,您只需要导入 kirklin 预设:

// eslint.config.js
import kirklin from "@kirklin/eslint-config";

export default kirklin();

就是这样!或者您还可以单独配置每个集成,例如:

// eslint.config.js
import kirklin from "@kirklin/eslint-config";

export default kirklin({
  // 启用风格格式规则
  // stylistic: true,

  // 或自定义风格规则
  stylistic: {
    indent: 2, // 4或'tab'
    quotes: "double", // 或'single'
  },

  // TypeScript和Vue会自动检测,您也可以显式启用它们:
  typescript: true,
  vue: true,

  // 禁用jsonc和yaml支持
  jsonc: false,
  yaml: false,

  // 在Flat配置中不再支持`.eslintignore`,请使用`ignores`代替
  ignores: [
    "**/fixtures",
    // ...globs
  ]
});

kirklin 工厂函数还接受任意数量的自定义配置覆盖:

// eslint.config.js
import kirklin from "@kirklin/eslint-config";

export default kirklin(
  {
    // Configures for kirklin's config
  },

  // From the second arguments they are ESLint Flat Configs
  // you can have multiple configs
  {
    files: ["**/*.ts"],
    rules: {},
  },
  {
    rules: {},
  },
);

更高级的情况下,您还可以导入细粒度的配置并根据需要组合它们:

我们不建议在一般用途中使用这种样式,因为在配置之间可能存在共享选项,可能需要额外的注意以使它们一致。

// eslint.config.js
import {
  combine,
  comments,
  ignores,
  imports,
  javascript,
  jsdoc,
  jsonc,
  markdown,
  node,
  sortPackageJson,
  sortTsconfig,
  stylistic,
  toml,
  typescript,
  unicorn,
  vue,
  yaml,
} from "@kirklin/eslint-config";

export default combine(
  ignores(),
  javascript(/* Options */),
  comments(),
  node(),
  jsdoc(),
  imports(),
  unicorn(),
  typescript(/* Options */),
  stylistic(),
  vue(),
  jsonc(),
  yaml(),
  toml(),
  markdown(),
);

查看configsfactory以获取更多详细信息。

感谢 sxzz/eslint-config 提供灵感和参考。

插件重命名

由于Flat配置要求我们明确提供插件名称(而不是从npm包名称强制性约定),我们已经重命名了一些插件,以使整体范围更一致且更容易编写。

New PrefixOriginal PrefixSource Plugin
import/*import-x/*eslint-plugin-import-x
node/*n/*eslint-plugin-n
yaml/*yml/*eslint-plugin-yml
ts/*@typescript-eslint/*@typescript-eslint/eslint-plugin
style/*@stylistic/*@stylistic/eslint-plugin
test/*vitest/*eslint-plugin-vitest
test/*no-only-tests/*eslint-plugin-no-only-tests

当您想要覆盖规则或在内联中禁用它们时,您需要更新新前缀:

-// eslint-disable-next-line @typescript-eslint/consistent-type-definitions
+// eslint-disable-next-line ts/consistent-type-definitions
type foo = { bar: 2 }

!NOTE 关于插件重命名 - 实际上这是一个相当危险的举动,可能会导致潜在的命名冲突,如这里这里 所指出的。由于这个配置非常个人化主观化,我雄心勃勃地将这个配置定位为每个项目唯一的"顶层"配置,这可能会改变规则命名的偏好。

这个配置更关心面向用户的体验,试图简化实现细节。例如,用户可以继续使用语义化的 import/order,而无需知道底层插件已经迁移到 eslint-plugin-i 然后再到 eslint-plugin-import-x。用户也不被迫在中途迁移到隐式的 i/order,仅仅因为我们将实现换成了一个分支。

话虽如此,这可能仍然不是一个好主意。如果你正在维护自己的 eslint 配置,你可能不想这样做。

如果你想将这个配置与其他配置预设组合使用,但遇到了命名冲突,请随时提出问题。我很乐意找出一种方法让它们协同工作。但目前我没有计划撤销重命名。

从 v2.3.0 版本开始,这个预设将自动重命名插件,也适用于您的自定义配置。您可以使用原始前缀直接覆盖规则。

规则覆盖

某些规则仅在特定文件中启用,例如, ts/* 规则仅在 .ts 文件中启用, vue/* 规则仅在 .vue 文件中启用。如果要覆盖规则,需要指定文件扩展名:

// eslint.config.js
import kirklin from "@kirklin/eslint-config";

export default kirklin(
  {
    vue: true,
    typescript: true
  },
  {
    // 记得在这里指定文件glob,否则可能会导致vue插件处理非vue文件
    files: ["**/*.vue"],
    rules: {
      "vue/operator-linebreak": ["error", "before"],
    },
  },
  {
    // 没有`files`,它们是所有文件的一般规则
    rules: {
      "style/semi": ["error", "never"],
    },
  }
);

我们还提供了一个 overrides 选项,以使其更容易:

// eslint.config.js
import kirklin from "@kirklin/eslint-config";

export default kirklin({
  vue: {
    overrides: {
      "vue/operator-linebreak": ["error", "before"],
    },
  },
  typescript: {
    overrides: {
      "ts/consistent-type-definitions": ["error", "interface"],
    },
  },
  yaml: {
    overrides: {
      // ...
    },
  },
});

配置组合器

从 v2.3.0 版本开始,工厂函数 kirklin() 返回了一个来自 eslint-flat-config-utilsFlatConfigComposer 对象。您可以链式调用方法,以更加灵活地组合配置。

// eslint.config.js
import kirklin from "@kirklin/eslint-config";

export default kirklin()
  .prepend(
    // 主配置之前的一些配置
  )
  // 覆盖任何命名配置
  .override(
    "kirklin/imports",
    {
      rules: {
        "import/order": ["error", { "newlines-between": "always" }],
      }
    }
  )
  // 重命名插件前缀
  .renamePlugins({
    "old-prefix": "new-prefix",
    // ...
  });
// ...

这段代码展示了如何使用 FlatConfigComposer 来更加精细地控制您的 ESLint 配置。通过 prepend 方法,您可以在主配置之前添加一些配置。override 方法允许您覆盖任何命名配置的规则。最后,renamePlugins 方法可以用于重命名插件前缀,这在处理潜在的命名冲突时非常有用。

Vue

对于Vue框架的支持,是通过检查项目中是否安装了vue来自动检测的。您也可以明确地启用或禁用它:

// eslint.config.js
import kirklin from "@kirklin/eslint-config";

export default kirklin({
  vue: true
});

Vue 2

对于Vue 2的有限支持(因为它已经达到了生命周期结束),如果您仍在使用Vue 2,可以通过设置vueVersion2来手动配置它:

// eslint.config.js
import kirklin from "@kirklin/eslint-config";

export default kirklin({
  vue: {
    vueVersion: 2
  },
});

由于Vue 2目前已经进入维护模式,我们只接受针对Vue 2的错误修复。当eslint-plugin-vue停止支持Vue 2时,我们可能会在未来移除对Vue 2的支持。如果可能的话,我们推荐您升级到Vue 3。

可选配置

我们为特定的使用场景提供了一些可选的配置,默认情况下不包含它们的依赖。这些可选配置允许您根据项目的具体需求来选择性地引入和使用,从而避免不必要的依赖引入和性能开销。您可以根据项目需要,选择启用或禁用这些可选配置。如果您想了解更多关于如何使用这些可选配置的信息,可以查阅相关文档或在社区中寻求帮助。

格式化器

使用外部格式化器格式化ESLint无法处理的文件(.css.html等)。由eslint-plugin-format提供支持。

// eslint.config.js
import kirklin from "@kirklin/eslint-config";

export default kirklin({
  formatters: {
    /**
     * 格式化CSS、LESS、SCSS文件,以及Vue中的`<style>`块
     * 默认情况下使用Prettier
     */
    css: true,
    /**
     * 格式化HTML文件
     * 默认情况下使用Prettier
     */
    html: true,
    /**
     * 格式化Markdown文件
     * 支持Prettier和dprint
     * 默认情况下使用Prettier
     */
    markdown: "prettier"
  }
});

运行npx eslint时,它应该会提示您安装所需的依赖项,如果没有,您可以手动安装它们:

npm i -D eslint-plugin-format

React

要启用React框架的支持,您需要明确地将其打开:

// eslint.config.js
import kirklin from "@kirklin/eslint-config";

export default kirklin({
  react: true,
});

运行npx eslint时,它应该会提示您安装所需的依赖项,如果没有,您可以手动安装它们:

npm i -D @eslint-react/eslint-plugin eslint-plugin-react-hooks eslint-plugin-react-refresh

Svelte

要启用Svelte框架的支持,您需要明确地将其打开:

// eslint.config.js
import kirklin from "@kirklin/eslint-config";

export default kirklin({
  svelte: true,
});

运行npx eslint时,它应该会提示您安装所需的依赖项,如果没有,您可以手动安装它们:

npm i -D eslint-plugin-svelte

Astro

要启用Astro框架的支持,您需要明确地在配置中启用它:

// eslint.config.js
import kirklin from "@kirklin/eslint-config";

export default kirklin({
  astro: true,
});

运行npx eslint时,它应该会提示您安装所需的依赖项,如果没有,您可以手动安装它们:

npm i -D eslint-plugin-astro

Solid

要启用Solid框架的支持,您需要明确地在配置中启用它:

// eslint.config.js
import kirklin from "@kirklin/eslint-config";

export default kirklin({
  solid: true,
});

运行npx eslint时,它应该会提示您安装所需的依赖项,如果没有,您可以手动安装它们:

npm i -D eslint-plugin-solid

UnoCSS

要启用UnoCSS框架的支持,您需要明确地在配置中启用它:

// eslint.config.js
import kirklin from "@kirklin/eslint-config";

export default kirklin({
  unocss: true,
});

运行npx eslint时,它应该会提示您安装所需的依赖项,如果没有,您可以手动安装它们:

npm i -D @unocss/eslint-plugin

可选规则

此配置还提供了一些用于扩展用途的可选插件/规则。

command

eslint-plugin-command 提供支持。这不是一个典型的代码检查规则,而是一个按需的微型代码修改工具,通过特定的注释触发。

例如,几个触发器包括:

  • /// to-function - 将箭头函数转换为普通函数
  • /// to-arrow - 将普通函数转换为箭头函数
  • /// to-for-each - 将 for-in/for-of 循环转换为 .forEach()
  • /// to-for-of - 将 .forEach() 转换为 for-of 循环
  • /// keep-sorted - 对对象/数组/接口进行排序
  • ... 等 - 参考 文档

你可以在想要转换的代码上方添加触发注释,例如(注意三个斜杠):

/// to-function
const foo = async (msg: string): void => {
  console.log(msg);
};

当你在编辑器中保存或运行 eslint . --fix 时,将转换为:

async function foo(msg: string): void {
  console.log(msg);
}

命令注释通常是一次性的,一旦转换完成,它们将被一并移除。

类型感知规则

您可以通过将选项对象传递给typescript配置来选择启用类型感知规则

// eslint.config.js
import kirklin from "@kirklin/eslint-config";

export default kirklin({
  typescript: {
    tsconfigPath: "tsconfig.json",
  },
});

编辑器特定禁用

有些规则在ESLint IDE集成中被禁用,具体来说是 unused-imports/no-unused-importstest/no-only-tests

这样做是为了防止在重构过程中IDE自动移除未使用的导入,以提供更好的开发体验。当您在终端或使用 Lint Staged 运行ESLint时,这些规则将会被应用。如果您不希望有这样的行为,可以通过以下方式禁用它们:

// eslint.config.js
import kirklin from "@kirklin/eslint-config";

export default kirklin({
  isInEditor: false
});

Lint Staged

如果您想在每次提交之前应用lint和自动修复,可以将以下内容添加到您的 package.json 中:

{
  "simple-git-hooks": {
    "pre-commit": "pnpm lint-staged"
  },
  "lint-staged": {
    "*": "eslint --fix"
  }
}

然后运行:

npm i -D lint-staged simple-git-hooks

// to active the hooks
npx simple-git-hooks

查看启用的规则

我创建了一个可视化工具,帮助您查看项目中启用了哪些规则,并将它们应用于哪些文件,@eslint/config-inspector

前往包含 eslint.config.js 的项目根目录,并运行:

npx eslint-flat-config-viewer

版本控制策略

本项目遵循语义化版本控制用于发布。然而,由于这只是一个配置文件,涉及意见和许多不断变化的部分,我们不将规则更改视为破坏性更改。

被视为破坏性更改的变化

  • Node.js 版本要求的更改
  • 可能破坏配置的大规模重构
  • 插件进行了可能破坏配置的重大更改
  • 可能影响大部分代码库的更改

被视为非破坏性更改的变化

  • 启用/禁用规则和插件(可能更加严格)
  • 规则选项的更改
  • 依赖项的版本升级

徽章

在你的项目中使用此配置?在你的自述文件中包括以下徽章,以告知人们你的代码正在使用Kirk Lin的代码风格。

kirklin-code-style-image

[![kirklin-code-style-image](https://img.shields.io/badge/code__style-%40kirklin%2Feslint--config-3491fa?style=flat&colorA=080f12&colorB=3491fa)](https://github.com/kirklin/eslint-config/)

Thanks

This project is based on @antfu/eslint-config

Check Also

License

MIT License © 2019-PRESENT Kirk Lin

2.3.2

3 days ago

2.3.0

15 days ago

2.3.1

15 days ago

2.2.0

1 month ago

2.1.0

3 months ago

2.0.0

4 months ago

1.1.1

4 months ago

1.1.0

4 months ago

1.0.1

6 months ago

1.0.0

6 months ago

0.5.4

8 months ago

0.5.3

8 months ago

0.5.6

8 months ago

0.5.5

8 months ago

0.5.0

10 months ago

0.4.1

10 months ago

0.5.2

9 months ago

0.5.1

9 months ago

0.3.9

11 months ago

0.3.10

11 months ago

0.3.6

12 months ago

0.3.5

12 months ago

0.3.8

11 months ago

0.3.7

11 months ago

0.4.0

11 months ago

0.3.0

1 year ago

0.2.7

1 year ago

0.3.2

1 year ago

0.3.1

1 year ago

0.3.4

1 year ago

0.3.3

1 year ago

0.2.6

1 year ago

0.2.5

1 year ago

0.2.1

1 year ago

0.2.0

1 year ago

0.1.9

1 year ago

0.2.3

1 year ago

0.2.2

1 year ago

0.2.4

1 year ago

0.1.8

2 years ago

0.1.7

2 years ago

0.1.4

2 years ago

0.1.6

2 years ago

0.1.5

2 years ago

0.1.3

2 years ago

0.1.2

2 years ago

0.1.1

2 years ago

0.1.0

2 years ago

0.0.3

2 years ago

0.0.3-beta.2

2 years ago

0.0.2

2 years ago

0.0.1

2 years ago