ESLint

ESLint 是一个流行的 JavaScript 代码风格检查工具。ESLint 集成还使用 Prettier 来强制执行代码格式。

本地运行

可以使用 mach 运行 ESLint 的 mozlint 集成

$ mach lint --linter eslint <file paths>

或者,省略 --linter eslint 并运行所有已配置的代码风格检查工具,其中包括 ESLint。

ESLint 还支持 --fix 选项来自动修复大多数规则引发的错误。

有关更多选项,请参阅 使用指南

自定义配置

我们的 ESLint 配置具有一些自定义配置,根据文件路径和名称模式为各种代码定义全局变量和规则。

使用正确的模式可以帮助 ESLint 了解正确的细节,以便您不会收到有关未定义或未使用变量的警告。

  • .mjs - 模块文件。

  • .sys.mjs - 系统模块,这通常是加载它的进程中的单例。

  • .worker.(m)js - web worker 文件。

    • 使用 ctypes 的 worker 应该使用 /* eslint-env mozilla/chrome-worker */

  • 测试文件,请参阅有关 添加测试 的部分

理解规则和错误

  • 仅检查部分文件,有关详细信息,请参阅 配置

    • 根据设计,我们不会检查/格式化 reftests 和 crashtests,因为这些是专门设计的测试。

  • 如果您不理解某个规则,可以在 eslint.org 的规则列表 中查找有关该规则的更多信息。

  • 对于 Mozilla 特定的规则(带有 mozilla/ 前缀),请参阅以下内容以获取更多详细信息

启用新规则和添加插件

请参阅 此页面以启用新规则

常见问题及解决方法

我的编辑器提示 mozilla/whatever 未知

  • 运行 ./mach eslint --setup,然后重新启动编辑器。

我的编辑器无法识别我新添加的全局变量(例如,添加到内容文件或 head.js 文件中)

  • 这是一个限制,它与我们的 ESLint 设置以及我们如何在文件之间共享全局变量的方式有关。

  • 重新启动编辑器应该会获取新的全局变量。

  • 您始终可以通过在命令行上运行 ./mach lint --linter eslint <file path> 进行双重检查。

我收到代码风格检查错误“未知的服务成员属性”

确保将所有新的服务添加到 tools/lint/eslint/eslint-plugin-mozilla/lib/services.json 中。例如,在构建后从 <objdir>/xpcom/components/services.json 中复制。

我正在添加测试,如何设置正确的配置?

请注意,我们更喜欢将测试放在命名目录中,因为这使得开发人员更容易识别正在使用的测试类型。此外,如果不进行构建步骤(这会破坏编辑器)或代价高昂的加载周期,则无法根据 .ini 文件将 ESLint 规则的范围限定到单个文件。

  • 如果测试的目录路径是 已知路径 之一,则 ESLint 将对该测试类型执行正确的操作。这是首选选项。

    • 例如,将 xpcshell-tests 放置在 browser/components/foo/test/unit/ 中将正确设置 ESLint。

  • 如果您确实无法匹配目录名称,例如 browser/base/content/tests/*,则需要在 .eslintrc-test-paths.js 中添加一个新条目。

请勿在单个目录中添加多种类型的测试的新情况,这 难以由 ESLint 处理。目前这可能会导致

  • 规则错误地应用于错误类型的测试文件。

  • 测试中全局变量的额外定义,这意味着在某些情况下不会触发未定义变量规则。

这段代码不应该被代码风格检查或格式化

这段代码不应该被格式化

绝大多数代码都应该被格式化,但是我们允许一些有限的情况下这样做是有意义的,例如

  • 数组中的表格,以表格形式布局使其更易读。

  • 其他结构或函数调用,在特定格式下布局更易读。

要为类似这样的代码禁用 prettier,可以在您希望禁用它之前的那一行使用 // prettier-ignore。有关更多信息,请参阅 prettier 忽略文档

我的有效代码触发了 no-undef 规则或无法解析

  • 请勿将其添加到 .eslintrc-ignores.js 中。通常可以修复此问题,如果以下提示没有帮助,请 寻求帮助

  • 如果您正在添加新的测试目录,请参阅 上文

  • 如果您正在编写加载到特殊环境(例如,框架脚本)中的脚本,则可能需要告诉 ESLint 使用每个情况的 环境定义

    • /* eslint-env mozilla/frame-script */

  • 我使用 Services.scriptloader.loadSubScript

    • /* import-globals-from relative/path/to/file.js

配置

全局配置文件位于 topsrcdir/.eslintrc 中。可以通过在相应的子目录中包含 .eslintrc 来覆盖此全局配置。有关支持配置的概述,请参阅 ESLint 的文档

请尽量减少树中规则的差异。我们希望保持一致,以便于开发人员使用。

源代码

构建器

Mark Banner (standard8) 负责构建器。您也可以在 Matrix 上的 #lint:mozilla.org 上提出问题。

ESLint (ES)

这是一个一级任务。对于测试失败,应回退导致问题的补丁或修复问题。

可以使用 ./mach eslint --fix path/to/file 修复某些失败。

对于测试工具问题,请在开发者基础设施 :: 代码风格检查和格式化中提交 Bug。

ESLint-build (ES-B)

这是一个二级任务,每天 UTC 午夜通过 cron 作业运行一次。

它目前运行 ESLint 规则以及两个附加规则

这两个规则都需要构建工件。

要手动运行它们,您可以运行

MOZ_OBJDIR=objdir-ff-opt ./mach eslint --rule "mozilla/valid-ci-uses: error" --rule "mozilla/valid-services-property: error" *

对于测试失败,可以通过以下方式找到导致回归的 Bug

  • 确定最近是否更改了报告错误的文件。

  • 查看是否有关联的 .idl 文件被更改。

如果无法轻松找到导致回归的 Bug,请在发生故障的文件的相关产品/组件中提交 Bug,并抄送 :standard8。

对于测试工具问题,请在开发者基础设施 :: 代码风格检查和格式化中提交 Bug。