news 2026/10/3 8:15:13

30 seconds of code 的 ESLint 9 与 Prettier 3 配置实战:一份可直接复用的前端代码规范方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
30 seconds of code 的 ESLint 9 与 Prettier 3 配置实战:一份可直接复用的前端代码规范方案
  • 教程
  • 文档

【免费下载链接】30-seconds-of-code

Coding articles to level up your development skills

项目地址:https://gitcode.com/gh_mirrors/30/30-seconds-of-code
点击查看免费下载

本文围绕 30 seconds of code 仓库中实际使用的 ESLint 与 Prettier 配置展开,完整呈现作者的个性化代码规范方案:包括基于 flat config 的eslint.config.js、精简的.prettierrc、全局变量文件globals.js以及配套依赖版本。读完本文,你将理解每一处规则的意图与取值依据,并能将这套配置迁移到自己的 JavaScript / TypeScript 项目中快速启动。

[!WARNING]

这是作者非常个人化的配置,带有强烈的主观倾向,你可能需要根据团队风格或个人习惯进行调整。

配置总览:两份文件完成规范闭环

整套方案的核心是两份配置文件,分工明确:ESLint 负责"查"(代码质量与潜在错误),Prettier 负责"改"(统一格式化风格),再由eslint-config-prettier关闭两者之间冲突的规则,实现零摩擦协作。

import js from '@eslint/js'; import eslintConfigPrettier from 'eslint-config-prettier/flat'; import globals from './globals.js'; export default [ js.configs.recommended, eslintConfigPrettier, { languageOptions: { ecmaVersion: 2025, sourceType: 'module', globals: { ...globals }, }, rules: { 'no-duplicate-imports': 'error', 'no-useless-computed-key': 'error', 'no-console': 'off', eqeqeq: ['error', 'smart'], curly: 'off', 'object-shorthand': ['warn', 'always'], camelcase: ['warn', { properties: 'always' }], 'no-extend-native': 'error', 'no-loop-func': 'error', 'no-implied-eval': 'error', 'no-iterator': 'error', 'no-label-var': 'error', 'no-multi-str': 'error', 'no-script-url': 'error', 'no-shadow-restricted-names': 'error', 'no-spaced-func': 'error', 'no-sparse-arrays': 'warn', 'no-fallthrough': 'warn', 'no-caller': 'error', 'no-eval': 'error', 'no-negated-in-lhs': 'error', 'no-new': 'error', 'no-new-require': 'error', 'block-scoped-var': 'error', 'no-use-before-define': 'warn', 'no-proto': 'error', complexity: ['warn', 50], 'new-parens': 'error', yoda: ['error', 'never'], 'no-useless-assignment': 'error', }, }, ];
{ "printWidth": 80, "arrowParens": "avoid", "singleQuote": true, "tabWidth": 2, "useTabs": false, "semi": true, "trailingComma": "es5", "bracketSpacing": true, "objectWrap": "collapse" }

可以看到,这套方案只依赖三个基础包——@eslint/js提供推荐规则集、eslint-config-prettier处理与 Prettier 的兼容、本地globals.js声明全局变量。没有引入任何风格化插件,规则全部手写,保持了配置的最小化与可读性。

依赖与版本基线

该配置针对ESLint 9 与 Prettier 3设计并优化,配套使用了eslint-config-prettier来协调两者。原文档编写时基于eslint@9.24.0与prettier@3.5.3;而在当前仓库的 package.json 中,实际的开发依赖为:

依赖当前仓库版本作用
eslint^9.28.0代码检查器,采用 v9 的 flat config 体系
prettier^3.5.3代码格式化器
eslint-config-prettier^10.1.2关闭 ESLint 中与 Prettier 冲突的格式类规则
prettier-plugin-astro^0.14.1让 Prettier 支持.astro文件的格式化

globals.js:全局变量的来源与作用

配置中导入的globals.js是一个记录了各运行环境下全局变量的清单文件。它让 ESLint 能正确识别哪些标识符是环境提供的(如浏览器中的window、document,Node.js 中的Buffer、process),从而避免把全局变量误报为"未定义"。

原文档作者并未百分百确认该文件的出处,但指出可以从globals这个 npm 包获取同类清单。在当前仓库中,globals.js 就位于仓库根目录,共约 800 行,采用如下结构:

export default { // Node.js / 通用运行时全局变量 __dirname: false, __filename: false, process: false, Buffer: false, console: false, // 浏览器全局变量 window: false, document: false, navigator: false, localStorage: false, fetch: false, // 事件处理属性(可赋值,故为 true) onload: true, onclick: true, // ... };

其中每个键名都是全局变量的名称,值false表示该变量只读(不可赋值),true表示可写(例如exports、location、OffscreenCanvas及各类on*事件属性)。这份清单同时覆盖 Node.js 与浏览器环境,还包含 Web API(如ReadableStream、RTCPeerConnection)、SVG DOM 以及 JavaScript 内置对象(如Array、Map、Promise)等。

在languageOptions.globals中通过{ ...globals }展开后,ESLint 便会以这些条目作为全局变量的定义来源,与ecmaVersion: 2025、sourceType: 'module'一起构成完整的语言环境描述。

ESLint:从推荐规则到个性化调整

ESLint 的规则多如牛毛,无法也不必逐一覆盖。js.configs.recommended提供的默认规则质量已经不错,但为了让代码风格与多数协作团队保持一致,仍需做少量针对性调整。

[!NOTE]

作者最近升级到了 ESLint9.x.x,此前使用的一些风格类规则已在 v9 中废弃,官方建议改用@stylistic/eslint-plugin-js插件。作者计划在未来迁移到该插件,以发挥其全部能力。这也是从 v8 的 eslintrc 配置迁移到 v9 flat config 时最常见的注意事项之一。

通用配置(General setup)

  • js.configs.recommended:启用 ESLint 官方推荐的规则集,作为安全基线。
  • eslintConfigPrettier:通过eslint-config-prettier/flat入口(flat config 专用版本)关闭与 Prettier 冲突的规则,避免"格式检查"和"格式修改"互相打架。
  • languageOptions:
    • ecmaVersion: 2025:启用 2025 年的最新 JavaScript 语法特性,如最新的RegExp增强、Promise.try等。
    • sourceType: 'module':按 ES Module 解析,支持import/export语句。
    • globals: { ...globals }:注入globals.js中的全局变量清单,让no-undef等规则正确放行环境内置变量。

规则详解

原文档对每条规则都给出了选型理由,以下是完整解读:

  • no-duplicate-imports(error):禁止重复导入同一模块,避免冗余import语句。
  • no-useless-computed-key(error):禁止无意义的计算属性键,如{ ['a']: 1 }应写成{ a: 1 }。
  • no-console(off):允许使用console语句。作者提示:生产环境你可能想把它改回warn或error。
  • eqeqeq(['error', 'smart']):强制使用严格相等===/!==;smart模式允许在明确比较null、undefined等场景下使用==。
  • curly(off):关闭强制花括号规则。作者偏好能不加花括号的if语句尽量不加。
  • object-shorthand(['warn', 'always']):对象字面量未使用简写语法时给出警告,如{ a: a }应写为{ a }。
  • camelcase(['warn', { properties: 'always' }]):要求变量与对象属性都遵循 camelCase 命名,违反时警告。
  • no-extend-native(error):禁止扩展原生对象(如给Array.prototype添加方法)。
  • no-loop-func(error):禁止在循环内声明函数,规避闭包捕获循环变量的经典陷阱。
  • no-implied-eval(error):禁止隐式eval(),如setTimeout('code')这种传入字符串的形式。
  • no-iterator(error):禁止使用遗留的__iterator__属性。
  • no-label-var(error):禁止标签名与变量名重名。
  • no-multi-str(error):禁止使用反斜杠续行的多行字符串。
  • no-script-url(error):禁止使用javascript:协议的 URL(如<a href="javascript:void(0)">)。
  • no-shadow-restricted-names(error):禁止遮蔽undefined、NaN、Infinity等受限标识符。
  • no-sparse-arrays(warn):对稀疏数组(如[1, , 3])给出警告。
  • no-fallthrough(warn):对switch语句中意外的贯穿(fallthrough)分支给出警告。
  • no-caller(error):禁止使用arguments.caller/arguments.callee。
  • no-eval(error):禁止使用eval()。
  • no-negated-in-lhs(error):禁止在in表达式中对左操作数取反(如!key in obj)。
  • no-new(error):禁止new一个构造函数却不用其返回值,如new Foo()单独成行。
  • no-new-require(error):禁止new require()调用(针对 CommonJS)。
  • block-scoped-var(error):强制变量遵循块级作用域,防止var提升带来的问题。
  • no-use-before-define(warn):在变量定义前使用该变量时给出警告。
  • no-proto(error):禁止使用__proto__属性。
  • complexity(['warn', 50]):函数圈复杂度超过 50 时警告,用于控制函数过度复杂。
  • new-parens(error):要求构造调用必须带括号,如new Date()而非new Date。
  • yoda(['error', 'never']):禁止 Yoda 条件(如if (true === condition)),要求把变量放在比较运算符左侧。
  • no-useless-assignment(error):禁止无意义的赋值(值从未被读取),ESLint 9 新增的规则。

仓库实际配置的差异补充

原文档展示的是"最小可迁移版本"。当前仓库根目录的 eslint.config.js 在此基础上扩展了更多规则与一个ignores字段,可作为进阶参考:

  • ignores: ['app/assets/config/manifest.js']:显式跳过无需检查的第三方生成文件。
  • 风格类规则:indent: 'off'、quotes: ['error', 'single', { avoidEscape: true, allowTemplateLiterals: true }]、semi: ['error', 'always']、comma-dangle(数组/对象/导入多行时强制尾逗号、函数参数禁用)、brace-style、arrow-parens: ['error', 'as-needed']等。
  • 空格类规则:key-spacing、comma-spacing、block-spacing、space-infix-ops、eol-last、no-multi-spaces、no-multiple-empty-lines等。

这套完整配置同样保留了原文档的核心规则(no-duplicate-imports、eqeqeq、yoda、complexity、no-useless-assignment等),印证了两者出自同一套配置演进脉络。

Prettier:一行一参数的格式化偏好

Prettier 的配置相对直白,每个选项对应一种明确的格式化行为:

  • printWidth: 80:单行最大宽度 80 字符。作者不喜欢长行代码,超出即换行。
  • arrowParens: "avoid":能省略括号的箭头函数参数一律省略(如x => x,多参数时仍保留括号)。
  • singleQuote: true:统一使用单引号,视觉上更简洁。
  • tabWidth: 2:缩进 2 个空格,保持统一。
  • useTabs: false:永远用空格、不用制表符。
  • semi: true:语句末尾强制分号。作者坦言将来可能会改变主意。
  • trailingComma: "es5":仅在 ES5 合法的地方(对象、数组)多行时添加尾逗号,函数参数不加。作者认为多行对象和数组的尾逗号对版本控制更友好(新增一行不会污染上一行 diff)。
  • bracketSpacing: true:对象字面量花括号内侧保留空格,如{ foo: 1 }而非{foo: 1}。
  • objectWrap: "collapse":对象能在一行放下时尽量折叠为单行,有助于缩短文件长度。作者对此选项态度中立。

[!NOTE]

trailingComma是几个选项中最有争议的一个(es5、all、none三种取值各有拥趸),选择时建议与团队约定一致。

仓库里的 Prettier 进阶用法

当前仓库的 .prettierrc 在原文档配置之外还添加了两段内容,展示了 Prettier 在生产项目中的实际扩展方式:

{ "plugins": ["prettier-plugin-astro"], "overrides": [ { "files": "*.astro", "options": { "parser": "astro" } } ] }
  • plugins:注册prettier-plugin-astro,让 Prettier 能够格式化 Astro 组件文件。
  • overrides:针对*.astro文件指定专用parser,避免默认解析器误判混合了 HTML / CSS / JS 的 Astro 语法。

这说明了 Prettier 配置的典型演进路径:先设定全局格式化偏好,再通过overrides与插件为特定文件类型定制行为。

从零搭建:如何在自己的项目中使用这套配置

结合仓库的 package.json 中type: "module"的设置与 scripts 组织方式,你可以按以下步骤在任意 ESM 项目中落地这套方案:

  1. 安装依赖:
npm install --save-dev eslint@^9 prettier@^3 eslint-config-prettier
  1. 将上面的eslint.config.js与.prettierrc复制到项目根目录,并按需创建或引入自己的globals.js(可直接npm install globals后从中导出,或参照 globals.js 手写精简版)。

  2. 在package.json中补充脚本:

{ "scripts": { "lint": "eslint .", "format": "prettier --write ." } }
  1. 若项目中存在非标准文件类型(如 Astro、Vue、MDX),参照上文为.prettierrc添加对应插件与overrides。

该仓库自身以"type": "module"运行(见 package.json),因此eslint.config.js可以直接使用import/export default语法;如果你在 CommonJS 项目中使用,需相应改为module.exports或保留.mjs扩展名。

结语

这套 ESLint + Prettier 配置的价值在于克制与自洽:ESLint 聚焦真正的代码质量隐患(重复导入、隐式 eval、原生对象扩展、复杂度过高等),把纯格式问题完全交给 Prettier,再通过eslint-config-prettier消除二者重叠。如果你想查看这套配置在大型真实项目中的完整形态,可以对照仓库根目录的 eslint.config.js 与 .prettierrc 两份实际生效文件,以及记录了全部依赖版本的 package.json,直接复刻或按需裁剪即可。

  • 教程
  • 文档

【免费下载链接】30-seconds-of-code

Coding articles to level up your development skills

项目地址:https://gitcode.com/gh_mirrors/30/30-seconds-of-code
点击查看免费下载
上一篇:C++并发编程实战:深入理解\<chrono\>时间库
下一篇:深入解析分布式系统:从基础概念到实践应用

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 8:15:10

猫抓扩展快速上手指南:把网页视频离线保存到本地

猫抓扩展快速上手指南&#xff1a;把网页视频离线保存到本地 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你点开一个网页视频&#xff0c;右键菜…

作者头像 李华
网站建设 2026/10/3 8:15:05

基于多阶段、多角色LLM协作的深度专业内容生成体系

我们如何将LLM生成内容的专业度提升至顾问级报告水平呢,可以通过引入更精密的控制、更明确的质量门槛、更细致的角色定义以及更强的风险管理意识&#xff0c;构建一个企业级、可扩展的“模拟专家协作网络” (Simulated Expert Collaboration Network - SECoNet) 内容生成协议。…

作者头像 李华
网站建设 2026/10/3 8:14:57

免费解锁 WeMod 专业版:Wand-Enhancer 本地补丁完整指南

免费解锁 WeMod 专业版&#xff1a;Wand-Enhancer 本地补丁完整指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 想用 WeMod 的 Pro 修改器却不…

作者头像 李华
网站建设 2026/10/3 8:13:01

华硕笔记本风扇控制:G-Helper 快速调好风扇曲线的完整指南

华硕笔记本风扇控制&#xff1a;G-Helper 快速调好风扇曲线的完整指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook…

作者头像 李华
网站建设 2026/10/3 8:10:49

【扩频通信】基于matlab扩频通信系统仿真【含Matlab源码 337期】

⛄一、获取代码方式 获取代码方式1: 完整代码已上传我的资源:【扩频通信】基于matlab扩频通信系统仿真【含Matlab源码 337期】 点击上面蓝色字体,直接付费下载,即可。 获取代码方式2: 付费专栏Matlab信号处理(初级版) 备注: 点击上面蓝色字体付费专栏Matlab信号处理…

作者头像 李华
网站建设 2026/10/3 8:10:46

【电路仿真】基于simulink全数字锁相环设计【含Matlab源码 340期】

💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞💞💞💞💞💞💥💥💥💥💥💥 ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进; 🍎个人主页:海神之光 🏆代码获取方式: 海神之光Matlab王…

作者头像 李华