实际工作中,不同场景需要不同的规范严格度。通过三级配置体系,既能保证团队一致性,又能灵活处理历史债务和特殊模块。
7.3.1 配置层级与优先级
配置采用就近覆盖原则,优先级由低到高:
全局配置(~/.config/) < 项目配置(<root>/) < 目录配置(<sub>/)
典型应用场景:
- 全局:个人编码习惯(如缩进宽度、换行符)
- 项目:团队规范(如 ESLint 规则、换行符强制 LF)
- 目录:特殊处理(如
legacy/目录关闭严格规则,src/api/强制 JSDoc)
7.3.2 实战配置示例
EditorConfig 示例
# ~/.editorconfig(全局)
[*]
indent_style = space
indent_size = 4
# 项目根目录 .editorconfig
[*]
indent_size = 2 # 覆盖全局:项目统一 2 空格
end_of_line = lf
[src/legacy/**.js] # 老代码目录特殊规则
indent_size = 4 # 保持原有 4 空格,避免大量 diff
max_line_length = off # 暂不限制行长度
ESLint 示例
// 项目根目录 eslint.config.js
export default [
{ rules: { 'no-console': 'error' } },
// 测试目录放宽规则
{
files: ['tests/**/*', '**/*.test.js'],
rules: { 'no-console': 'off', 'max-lines': 'off' }
},
// 脚本目录允许 Node 全局变量
{
files: ['scripts/**/*'],
languageOptions: { globals: { process: 'readonly' } }
}
];
7.3.3 冲突解决策略
当配置冲突时,按以下逻辑处理:
| 场景 | 解决方案 | 示例 |
|------|---------|------|
| 相同规则不同值 | 子级覆盖父级 | 全局 4 空格 → 项目 2 空格 |
| 规则继承 vs 重置 | 显式 root = true 阻断继承 | 项目根目录 .editorconfig 加 root = true 忽略用户全局配置 |
| 多工具冲突 | 明确职责边界 | ESLint 管语法,Prettier 管格式,EditorConfig 管编辑器行为 |
7.3.4 最佳实践
- 项目级必须显式声明
在仓库根目录添加 root: true(ESLint)或 root = true(EditorConfig),防止用户全局配置干扰团队协作。
- 目录级配置注释说明
在特殊目录的配置文件顶部加注释,说明为何例外:
// src/legacy/.eslintrc.js
// 注意:此目录为 2018 年历史代码,暂不强制 TypeScript 规则
- CI 中验证配置生效
在流水线中检查配置是否正确加载:
# 查看实际生效的规则
npx eslint --print-config src/legacy/old.js
- 避免过度细化
目录级配置不超过 2 层(如 src/legacy/ 可以特殊,src/legacy/utils/ 不建议再特殊),维护成本过高。
提示:多数现代工具(Biome、Ruff、Prettier v3)已支持 overrides 字段,优先使用单一配置文件内的 overrides 替代多个物理配置文件,降低维护复杂度。