Open cssmagic opened 6 years ago
前言 ESLint 是目前最主流、最强大的 JS 代码校验工具。当我们的代码触发了 ESLint 的报警规则时,ESLint 就会提示错误。 本系列文章将详细讲解那些需要手工介入修复的 ESLint 规则,帮助你顺利地把既有代码迁移到 ESLint 的保护之中。
ESLint 是目前最主流、最强大的 JS 代码校验工具。当我们的代码触发了 ESLint 的报警规则时,ESLint 就会提示错误。
本系列文章将详细讲解那些需要手工介入修复的 ESLint 规则,帮助你顺利地把既有代码迁移到 ESLint 的保护之中。
no-fallthrough
禁止在 switch/case 语句中使用穿透特性。
switch
case
我们在 JS(以及大多数类 C 语言)里写 switch/case 往往会踩的一个坑就是 “穿透”。简单解释一下,在 swithc 的执行过程中,匹配了一个 case 并执行完这个 case 的代码之后,如果没有遇到 break 语句,则会继续执行后续所有 case 的代码。
break
这是一个非常反直觉的设计,也是 bug 的温床。因此 ESLint 提供了 no-fallthrough 这条规则,避免无意中踩到穿透特性的坑。
但如果在某些场景下,你真的需要这个特性怎么办?ESLint 允许你通过注释来说明你是真的在利用穿透特性,只要注释符合特定格式就可以抑制报警:
switch (foobar) { case 1: doSomething() // fall through case 2: doSomethingElse() }
no-undef
禁止使用未定义的变量。
当我们在使用一个变量之前忘了声明它,这条规则就会报警提醒我们。不过大多数触发报警的代码是在引用一个全局变量,而 ESLint 并未理解。
比如有以下代码:
// namespace window.Auth = { /* ... */ } // ... // init if (page && Auth[page]) { Auth[page]() }
在后面这个 if 语句中有对 Auth 的引用。虽然我们在第一行已经定义了 Auth 这个全局变量(window.Auth = ...),但 ESLint 无法识别,这条规则会报警。
if
Auth
window.Auth = ...
有两种方式可以修复这个问题。
在引用全局变量时,先把它存到一个局部变量中:
// init const Auth = window.Auth if (page && Auth[page]) { Auth[page]() }
ESLint 可以识别文件顶部的一些特定注释,我们可以用注释来告诉 ESLint 当前环境有哪些全局变量。比如我们在文件顶部写出这一行注释:
/* global Auth */
就可以声明 Auth 是一个全局变量。如果有多个全局变量需要声明,可以以逗号分隔。
一般来说,我会推荐以后一种方式来修复报警。它的好处有以下一些:
我们团队很早就开始采用 ESLint 作为 JS 代码的质量保障工具了,去年我又在此基础上开始梳理相关的规范和文档、总结相关的经验和收获。
在落地 ESLint 的过程中,最棘手的可能就是老代码的迁移了。我们团队也不例外,曾专门组织 “集体行动” 去消灭老代码的报警问题。我把团队在这个过程中遇到的实际问题和处理方法提炼出来,形成了这个系列的四篇文章,希望能为你提供参考价值。
ESLint 是个好东西,希望每个团队都能用起来。未来如果有机会,我还会跟大家继续分享这方面的心得:“如何在团队中顺利推行 ESLint”,“如何选择真正适合自己的 ESLint 规则” 等等。欢迎继续关注,下次再见!
本文在 “CSS魔法” 微信公众号首发,扫码立即订阅:
© Creative Commons BY-NC-ND 4.0 | 我要订阅 | 我要打赏
no-fallthrough
我们在 JS(以及大多数类 C 语言)里写 switch/case 往往会踩的一个坑就是 “穿透”。简单解释一下,在 swithc 的执行过程中,匹配了一个 case 并执行完这个 case 的代码之后,如果没有遇到
break
语句,则会继续执行后续所有 case 的代码。这是一个非常反直觉的设计,也是 bug 的温床。因此 ESLint 提供了
no-fallthrough
这条规则,避免无意中踩到穿透特性的坑。但如果在某些场景下,你真的需要这个特性怎么办?ESLint 允许你通过注释来说明你是真的在利用穿透特性,只要注释符合特定格式就可以抑制报警:
no-undef
当我们在使用一个变量之前忘了声明它,这条规则就会报警提醒我们。不过大多数触发报警的代码是在引用一个全局变量,而 ESLint 并未理解。
比如有以下代码:
在后面这个
if
语句中有对Auth
的引用。虽然我们在第一行已经定义了Auth
这个全局变量(window.Auth = ...
),但 ESLint 无法识别,这条规则会报警。有两种方式可以修复这个问题。
改成局部变量
在引用全局变量时,先把它存到一个局部变量中:
通过注释声明全局变量
ESLint 可以识别文件顶部的一些特定注释,我们可以用注释来告诉 ESLint 当前环境有哪些全局变量。比如我们在文件顶部写出这一行注释:
就可以声明
Auth
是一个全局变量。如果有多个全局变量需要声明,可以以逗号分隔。一般来说,我会推荐以后一种方式来修复报警。它的好处有以下一些:
结语
我们团队很早就开始采用 ESLint 作为 JS 代码的质量保障工具了,去年我又在此基础上开始梳理相关的规范和文档、总结相关的经验和收获。
在落地 ESLint 的过程中,最棘手的可能就是老代码的迁移了。我们团队也不例外,曾专门组织 “集体行动” 去消灭老代码的报警问题。我把团队在这个过程中遇到的实际问题和处理方法提炼出来,形成了这个系列的四篇文章,希望能为你提供参考价值。
ESLint 是个好东西,希望每个团队都能用起来。未来如果有机会,我还会跟大家继续分享这方面的心得:“如何在团队中顺利推行 ESLint”,“如何选择真正适合自己的 ESLint 规则” 等等。欢迎继续关注,下次再见!
© Creative Commons BY-NC-ND 4.0 | 我要订阅 | 我要打赏