Skip to content
chris edited this page Jul 21, 2016 · 15 revisions

FECS 自有规则

为了更准确的匹配到百度的前端代码规范,有部分规则是定制,或者修改官方的规则。

fecs-camelcase

在官方 camelcase 项目上的增强:

  • 允许标识符前后的 --(比如 __dirname);
  • 允许通过 quote 配置项对 Property 类型的标识符作豁免;
  • 允许配置 ignore 数组来作豁免,支持前后使用 / 标识为正则的匹配;
  • 允许使用文档注释的 @private 对单个下划线前缀的方法作豁免。

fecs-eol-last

增加一个配置项 disallowMultiBlankLine,用于设置是否允许文件末尾连续空白行的情况。

fecs-indent

基于 Nodeca Team 的插件,当时 eslint 还没有 indent 的实现。目前功能除了与官方一致外(配置参数有区别),还针对数组拼接 HTML 时的缩进作了处理。

对于数组拼接字符串,通过枚举每项的类型,如果在字符串项中先找到 < 再找到 >,就以拼接 HTML 对待,允许前后行之间缩进相差一个缩进级别。 如果由于特殊原因导致自动识别失败,也可以在数组前使用注释 // html 来标识。

fecs-valid-jsdoc

在官方 valid-jsdoc 基本上增强:

  • 文档注释前面要有一个空行;
  • 检查 @file 和 @author;
  • 针对 RestElement 参数的注释类型检查;
  • 内置类型的大小写严格检查;
  • 不同的错误信息有不同的标识,便于 reporter 归类到不同的错误;
  • 所有错误信息包含具体的行列位置,包含异常(来自 doctrine2,对 doctrine 的 hack)。

[建议] 避免使用 /*...*/ 这样的多行注释。有多行注释内容时,使用多个单行注释。 [强制] 为了便于代码阅读和自文档化,以下内容必须包含以 /**...*/ 形式的块注释中。

fecs-max-statements

在官方的基础上,针对 AMD 模块的 factory 作豁免。虽然 eslint 的 max-statements 有类似考虑,但是只是简单的豁免顶层 function (即没有上一级 function scope 的),范围太宽泛不理想。

fecs-max-statements 使用配置项独自指定是否豁免 AMD 或 IIFE 的 function。

fecs-key-spacing

在配置冒号前不允许空格情况下,识别并允许基于冒号对齐情况。

已经移除,使用 eslint 的 key-spacing。需要基于冒号对齐时可参考 eslint 文档 自己指定配置。

fecs-space-infix-ops

fecs-dot-notation

fecs-no-reserved-keys

以上三个规则全部基于官方的基础上,是作了更准备的报错位置调整,见 issue 46。 2016-03-29 已移除。

fecs-properties-quote

根据百度前端代码规则实现:

[强制] 对象创建时,如果一个对象的所有 属性 均可以不添加引号,则所有 属性 不得添加引号。 [强制] 对象创建时,如果任何一个 属性 需要添加引号,则所有 属性 必须添加 '

fecs-no-eval

在官方规则的增加了 window.eval 的使用检查。

[建议] 尽量避免使用 eval 函数。

fecs-no-forin-array

[强制] 遍历数组不使用 for in

fecs-no-global-require

[强制] 模块定义中只允许使用 local require,不允许使用 global require

fecs-valid-amd-id

[强制] 模块 id 必须符合标准。

fecs-jsx-var

根据 jsx 的特点,对 jsx 中出现的标签名或属性将作用域中的同名变量标记为已使用。

fecs-esnext-ext

[建议] ESNext 语法的 JavaScript 文件使用 .js 扩展名。 [强制] 当文件无法使用 .js 扩展名时,使用 .es 扩展名。

默认只允许使用 .js.es 作扩展名。

fecs-imports-on-top

[强制] 所有 import 语句写在模块开始处。

import 语句之前如果有语句,只允许 import

fecs-no-extra-semi

[强制] 函数定义结束不允许添加分号。 [强制] 类声明结束不允许添加分号。 [强制] 类成员定义中,方法定义后不允许添加分号,成员属性定义后必须添加分号。 [强制] export 语句后,不允许出现表示空语句的分号。 [强制] 属性装饰器后,可以不加分号的场景,不允许加分号。

eslint 的 no-extra-semi 本身不支持以上区分多个场景的识别,因此作了扩展。

fecs-no-arguments

[强制] 不要使用 arguments 对象,应使用 ...args 代替。

fecs@0.7.1 版本之后移除,使用 prefer-rest-params 代替。

fecs-prefer-class

[强制] 使用 class 关键字定义一个类。

fecs-prefer-super

[强制] 使用 super 访问父类成员,而非父类的 prototype

fecs-use-method-definition

[强制] 定义方法时使用 MethodDefinition 语法,不使用 PropertyName: FunctionExpression 语法。 [建议] 定义对象的方法不应使用箭头函数。

fecs-use-property-shorthand

[建议] 定义对象时,如果所有键均指向同名变量,则所有键都使用缩写;如果有一个键无法指向同名变量,则所有键都不使用缩写。

fecs-valid-super

检查不恰当的 super 使用场景,比如没有父类,在非构造函数中直接使用 super() 等。

fecs-export-on-declare

[强制] export 与内容定义放在一起。

fecs-arrow-body-style

[建议] 箭头函数的函数体只有一个非 Object Literal 的单行表达式语句,且作为返回值时,省略 {}return。 [强制] 箭头函数的函数体只有一个 Object Literal,且作为返回值时,不得省略 {}return

在 eslint 的 arrow-body-style 基础上增加了一项配置,允许特定 AST 类型节点单行时加 return(或者特定类型节点必须加 return),默认配置是对 ObjectExpression 类型的节点允许加 return

fecs-max-destructure-depth

[强制] 不要使用3层及以上的解构。

fecs-min-vars-per-destructure

[强制] 仅定义一个变量时不允许使用解构。

fecs-one-var-per-line

[强制] 解构多个变量时,如果超过行长度限制,每个解构的变量必须单独一行。

fecs-no-anonymous-before-rest

[强制] 使用剩余运算符时,剩余运算符之前的所有元素必需具名。

fecs-max-calls-in-template

[强制] 字符串内变量替换时,不要使用 2 次及以上的函数调用。

fecs-no-extra-destructure

[强制] 如果不节省编写时产生的中间变量,解构表达式 = 号右边不允许是 ObjectLiteralArrayLiteral

fecs-use-standard-promise

[强制] 使用标准的 Promise API。

fecs-use-for-of

[建议] 使用 Object.keys 进行对象遍历。 [建议] 尽可能使用 for .. of 进行遍历。

fecs-prefer-spread-element

[建议] 对数组进行连接操作时,使用数组展开语法。 [建议] 不要使用数组展开进行数组的复制操作。

配置项中 copy 为 true 时表明允许使用 SpreadElement 复制数组,默认为 false。

fecs-prefer-async-await

[强制] 不得为了编写的方便,将可以并行的IO过程串行化。 [建议] 使用 async/await 代替 generator + co

fecs-shim-promise

[强制] 在运行环境中没有 Promise 时,将 Promise 的实现 shimglobal 中。

fecs-no-this-arrow

[强制] 一个函数被设计为需要 callapply 的时候,不能是箭头函数。

fecs-valid-map-set

[强制] 当键值有可能不是字符串时,必须使用 Map;当元素有可能不是字符串时,必须使用 Set。 [建议] 需要一个不可重复的集合时,应使用 Set。 [建议] 当需要遍历功能时,使用 MapSet。 [建议] 程序运行过程中有添加或移除元素的操作时,使用 MapSet

fecs-prefer-destructure

[建议] 使用解构减少中间变量。

fecs-prefer-assign-pattern

[建议] 使用变量默认语法代替基于条件判断的默认值声明。

fecs-use-computed-property

[建议] 尽量使用计算属性键在一个完整的字面量中完整地定义一个对象,避免对象定义后直接增加对象属性。

fecs-valid-var-jsdoc

主要根据变量定义及文档注释来相互检验。

[强制] 常量 使用 全部字母大写,单词间下划线分隔 的命名方式。 [强制] 枚举变量 使用 Pascal命名法枚举的属性 使用 全部字母大写,单词间下划线分隔 的命名方式。 [强制] 命名空间 使用 Camel命名法。 [强制] 常量必须使用 @const 标记,并包含说明和类型信息。 [建议] boolean 类型的变量使用 ishas 开头。

fecs-valid-class-jsdoc

[建议] 使用 @class 标记类或构造函数。 [建议] 使用 @extends 标记类的继承信息。 [强制] 使用包装方式扩展类成员时, 必须通过 @lends 进行重新指向。 [强制] 类的属性或方法等成员信息使用 @public / @protected / @private 中的任意一个,指明可访问性。

fecs-valid-constructor

[强制] 类的继承方案,实现时需要修正 constructor。 [建议] 声明类时,保证 constructor 的正确性。

fecs-valid-dom-style

[建议] 尽可能通过为元素添加预定义的 className 来改变元素样式,避免直接操作 style 设置。 [强制] 通过 style 对象设置元素样式时,对于带单位非 0 值的属性,不允许省略单位。

fecs-use-async-require

[强制] 全局运行环境中,require 必须以 async require 形式调用。