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'

分层清晰 整洁管理

相关推荐
子兮曰8 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰9 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万9 小时前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝9 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋9 小时前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
晨米酱10 小时前
AGENTS.md:Agent 的上下文策略层
面试·架构·agent
卡布鲁10 小时前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄11 小时前
JavaScript 隐式全局变量解析
javascript
彧azz12 小时前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
汉堡大王952712 小时前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端