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'

分层清晰 整洁管理

相关推荐
Juchecar17 分钟前
分析:将现代开源浏览器的JavaScript引擎更换为Python的可行性与操作
前端·javascript·python
极客小俊25 分钟前
Font Awesome 一个基于CSS和LESS的免费图标库工具包
前端
yinuo1 小时前
CSS基础动画keyframes
前端
一条上岸小咸鱼1 小时前
Kotlin 基本数据类型(一):Numbers
android·前端·kotlin
前端小巷子2 小时前
Vue 事件绑定机制
前端·vue.js·面试
是乐谷2 小时前
阿里云杭州 AI 产品法务岗位信息分享(2025 年 8 月)
java·人工智能·阿里云·面试·职场和发展·机器人·云计算
uhakadotcom2 小时前
开源:subdomainpy快速高效的 Python 子域名检测工具
前端·后端·面试
爱加班的猫2 小时前
Node.js 中 require 函数的原理深度解析
前端·node.js
用户8165111263972 小时前
WWDC 2025 Build a SwiftUI app with the new design
前端