eslint 配置 import 的引入规则

背景

项目开发的过程中 对于 import的导入,尤其是import过多的情况下,没有一些规范的话 导入非常混乱 举例

js 复制代码
import { Parsing, Management, Comparison, Review } from './index'
import { SvgIcon } from '@/components'
import { useMemo } from 'react'
import { Space } from '@arco-design/web-react'
import ChatSendIcon from '@/assets/svg-icon/contract/chat-send.svg'
import { useContractChat } from '../hook/useChat'
import  type { Itest } from '../test/Itest'

没有区分内置模块、第三方模块、本地模块等等 显得混乱

配置 import 的导入规范 以 vite ts react 为例

1. 安装依赖

首先需要安装必要的包(假设项目已使用 ESLint,若未初始化 ESLint 需先执行 npx eslint --init):

bash

arduino 复制代码
npm install --save-dev eslint-plugin-import eslint-import-resolver-alias eslint-import-resolver-typescript
  • eslint-plugin-import:核心插件,提供导入排序和校验功能
  • eslint-import-resolver-alias:支持解析 Vite 中的路径别名(如 @/
  • eslint-import-resolver-typescript:如果是 TypeScript 项目,用于解析 tsconfig.json 中的路径配置

2. 配置 ESLint(.eslintrc.js)

在 ESLint 配置文件中添加插件和规则,重点配置 import/order 排序规则和路径解析(适配 Vite 的别名):

js 复制代码
module.exports = {
  env: {
    browser: true,
    es2021: true,
    node: true
  },
  extends: [
    'eslint:recommended',
    'plugin:react/recommended',
    'plugin:react-hooks/recommended',
    'plugin:import/recommended', // 引入 import 插件的基础规则
    'plugin:import/react' // 针对 React 项目的导入规则(可选)
  ],
  parserOptions: {
    ecmaFeatures: {
      jsx: true
    },
    ecmaVersion: 'latest',
    sourceType: 'module'
  },
  plugins: [
    'react',
    'import' // 注册 import 插件
  ],
  settings: {
    'import/resolver': {
      'alias': {
        map: [['@', './src']], // 匹配@开头的路径别名
        extensions: ['.js', '.jsx', '.ts', '.tsx']
      }
    }
  },
  rules: {
    // 导入排序规则(核心配置)
    'import/order': [
      'error',
      {
        // 自定义分组顺序(按你的要求)
        groups: [
          ['builtin', 'external'], // 1. npm包(内置模块+第三方模块)
          ['internal'], // 2. @开头的路径(通过pathGroups定义)
          ['parent', 'sibling', 'index'], // 3. 相对路径(../、./、./index)
          'type' // 4. TypeScript类型导入
        ],
        // 自定义路径分组(关键:将@开头的路径归为internal组)
        pathGroups: [
          {
            pattern: '@/**', // 匹配所有@开头的路径
            group: 'internal', // 归入internal组
            position: 'after' // 在builtin和external之后
          }
        ],
        // 确保@路径不会被归到其他组
        pathGroupsExcludedImportTypes: ['builtin', 'external'],
        // 不同组之间必须空行
        'newlines-between': 'always',
        // 每组内按字母升序排序(忽略大小写)
        alphabetize: {
          order: 'asc',
          caseInsensitive: true
        }
      }
    ]
  }
}

3. 同步 Vite 别名配置

确保 ESLint 中的 import/resolver/alias 配置与 Vite 中的路径别名一致(在 vite.config.js 中):

js 复制代码
// vite.config.js
import { defineConfig } from 'vite'
import path from 'path'

export default defineConfig({
  resolve: {
    alias: {
      '@': path.resolve(__dirname, './src'),
      '@components': path.resolve(__dirname, './src/components')
      // 其他别名...
    }
  }
})

4. 配置自动修复(可选)

为了在保存时自动修复导入顺序,可在 package.json 中添加脚本,或配置 IDE:

package.json 脚本

json

json 复制代码
{
  "scripts": {
    "lint": "eslint .",
    "lint:fix": "eslint . --fix" // 自动修复可修复的问题(包括导入顺序)
  }
}

VSCode 自动修复

.vscode/settings.json 中添加:

json 复制代码
    {
      "editor.codeActionsOnSave": {
        "source.fixAll.eslint": true
      }
    }

5. 注意事项

  • 如果是 TypeScript 项目,需确保 tsconfig.json 中的 compilerOptions.paths 与 Vite 别名一致,避免路径解析冲突。

  • 若导入排序规则不符合预期,可调整 import/order 中的 groups 顺序或添加 pathGroups 自定义特殊路径的排序(例如优先排序 @/hooks 等)。

  • 部分第三方库可能需要通过 import/ignore 忽略排序(极少情况)。

配置完成后,ESLint 会自动校验并修复导入顺序,保持代码风格一致。

结果

格式化后效果如下

js 复制代码
import { Space } from '@arco-design/web-react'
import { useMemo } from 'react'

import ChatSendIcon from '@/assets/svg-icon/contract/chat-send.svg'
import { SvgIcon } from '@/components'

import { Parsing, Management, Comparison, Review } from './index'
import {
  CONSTRUCT_LIST,
  CONSTRUCT_PARSING,
  CONSTRUCT_MANAGEMENT,
  CONSTRUCT_COMPARISON,
  CONSTRUCT_REVIEW
} from '../constants/index'
import { useContractChat } from '../hook/useChat'

分层清晰 整洁管理

相关推荐
爱喝白开水a17 分钟前
前端AI自动化测试:brower-use调研让大模型帮你做网页交互与测试
前端·人工智能·大模型·prompt·交互·agent·rag
Never_Satisfied17 分钟前
在JavaScript / HTML中,关于querySelectorAll方法
开发语言·javascript·html
董世昌4117 分钟前
深度解析ES6 Set与Map:相同点、核心差异及实战选型
前端·javascript·es6
WeiXiao_Hyy1 小时前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
吃杠碰小鸡1 小时前
高中数学-数列-导数证明
前端·数学·算法
kingwebo'sZone1 小时前
C#使用Aspose.Words把 word转成图片
前端·c#·word
Serene_Dream2 小时前
JVM 并发 GC - 三色标记
jvm·面试
xjt_09012 小时前
基于 Vue 3 构建企业级 Web Components 组件库
前端·javascript·vue.js
我是伪码农2 小时前
Vue 2.3
前端·javascript·vue.js
夜郎king2 小时前
HTML5 SVG 实现日出日落动画与实时天气可视化
前端·html5·svg 日出日落