导语: 随着业务的增加和开发团队的成员快速增长,其中不少新人来自于五湖四海各大门派,在编码的风格和习惯中也出现各异。 一般在相互 codereview 时发现不少代码上的问题,长此以往代码出现了代码难以维护的问题,甚至还会出现低级错误。 所以,我尝试在前端代码质量的管控上作了些探索,也总结了一些经验分享给你们。
做者:郑振波css
在一些老项目里咱们常会遇到如下问题:html
如何制定编码规范?这是一个永恒的话题,甚至出现过开发者按照本身的习惯和想法不停的去修改 eslint rules,没错,主观性很是强的开发者就会这么干,最后发现 eslint rules 成了一锅粥。前端
若是你能从以上三个方法中取得成果,那说明你是老板,这一切就会变得太简单了。但不管如何,每个被扩展的 rule 都能找到具支持点和反驳点,在制定规范时同窗们一般每每会在几个点去发表他的意见:node
有没有办法能够解决这些争论?怎样取得平衡?开源社区各团队开源出的 eslint rules 能够说是遍地开花,prettier,eslint-config-standard,airbnb 等等,在编码规范选型时应该考虑如下几点:webpack
基于以上标准,咱们选择了超过 8w + 由 airbnb 前端团队维护的 eslint rules。 标准制定后, 如何让团队成员快速适应起来?git
这样 eslint 规范就初步落地了。github
定制好规范并落地后,如何对于祖传代码怎么办?因而咱们又遇到不一样的声音:web
如下是咱们对祖传代码的整改之路: 首先要看看问题有多严重:npm
npx eslint src
复制代码
但通过排查发现,这里面大部分报错是来自于第三方库,但又不是 npm 包,这些文件每每是不能知足当前的编码规范的,而且有部分是通过代码压缩,更不该该走 eslint 检查。屏蔽掉第三方文件的检测后,剩下的 eslint errors 还有 2w+,错误归类: json
在文本处理中,各操做系统也是有本身的一套标准:
Dos 和 windows 采用“回车+换行,CR/LF”表示下一行; UNIX/Linux 采用“换行符,LF”表示下一行; 苹果机(MAC OS 系统)则采用“回车符,CR”表示下一行。
因此,若是团队中还有 windows 玩家那么建立文件的换行符就是 CRLF,这也谈不上是什么很大的缺点,但在若是赶上了 Vim 或 Emacs 玩家打开文件就会看到这样的状况:
\n
#Unix-style newlines with a newline ending every file [*] end_of_line = lf insert_final_newline = true
git config core.autocrlf
,也许你会见过这个配置,但不必定正确使用,其实他有3个值可配置:ture: git pull 时会把 LF 结尾转为 CRLF false: git pull 时不作任何转换 input: git pull 时会把 CRLF 转换为 LF
那么这里应该使用的是 git conifg core.autocrlf input
以上任何一条均可以解决你的换行符问题。
解决好这一切以后,能够尝试让 ESLint 自动修复一波了: npx eslint src --fix
800+ 的错误分布在各个页面,能够给团队成员每人分配几个页面修复并分批上线,这样大规模的修复最重要的是发布后的监控:
也许你会认为 ESLint 没有报错那就 O**K了,其实坑每每没那么容易被发现,就像下面这个例子:
绝对路径的引入
应写在
相对路径引入
的前面,因而快速改他一波:
咱们通过制定规范,代码整改,接下来须要守住规则,不然一切徒劳
--no-verify
来关闭检测。以上提到的是关于 JS 代码规范的内容,对于 CSS 也可使用 stylelint
来作规范检测,但这些更多的是对代码的格式作规范,若是想把代码写好 ESLint 之类的并非全能的,好比代码的整洁之道,这里列举了很多能够参考的范式,恰又是 ESLint 没法帮你 hold 住的点,因此 ESLint 并非万能的。
也许你会认为冗余文件是一个问题,但他不是一个很关键的痛点,若是你的团队追求极致,有很是的代码洁癖,那么冗余文件也应该重视起来。即便你是一名老鸟,也有可能产生冗余文件。
在代码的迭代过程当中,每每容易忽略删除相应的文件,大概有两种场景: 一、删除 JS 代码中的 require,却忘记删除相应的文件(img/css/js/etc.)。 二、删除 CSS 中的 background ,忘记删除相应的图片文件。 删除代码很痛快,只要页面刷新一波没有报错就以为 o**k 了,日积月累的冗余文件慢慢让整个仓库愈来愈大。
若是使用 webpack 构建,那就能够很方便地分析出整个项目的依赖关系。 第一步:在根目录跑命令,把文件的依赖关系导到 stats.json 中,这个步骤耗时略长,我在项目中跑了一次,1420 个文件耗时 35s。
webpack --json > ./stats.json
复制代码
第二步:使用 glob 获取目录下的全部文件路径:
glob('!(node_modules)/**/*.*') 复制代码
结合第一步生成的 stats.json 能够过滤出未被引用的文件。
要分析项目中冗余的CSS,实际上是比较困难的,主要缘由有 3 个方面: 一、页面的元素或组件的嵌套:致使没法只从静态分析的层面上判断样式是否有做用于对应的元素上。 二、样式的全局做域:a.css 中声明一个样式,他能够做用于页面上的任何一个 dom,这样分析起来要遍历项目中全部的 dom 和 css,一个样式的声明须要检查全部的 dom,若是有N个样式声明那将会有很是大的计算量。 三、css 没有约束: 多个 css 文件的样式也能够做用于一个 dom 元素上,由于每每会用到开源的 ui 库,会根据设计的要求对相应的 dom 元素作样式覆盖,因此这种过于灵活的特性带来的不可控形成难以管理。
CSS Modules 能够把 css 做用域收敛,能够显式声明哪一个 class 样式做用于 dom 上,能够保证某个组件的样式不会影响到其余组件:
在代码迭代中,颇有可能删除掉一些方法的使用,那么会在 Class 留下一些多余的方法,这些也是难以经过 eslint 来检测到的,由于没办法判断这些方法在实例化后,是否会在某个时刻被使用到。若是要找出这些冗余的方法,也须要从整个项目开始分析全部 JS 的依赖关系,那么计算量就会很是大,而且很耗时。
目前没有什么好的办法来解决这个问题,或许能够经过两种方式来分析出来: 一、命名约定: 好比如下划线开头的方法是私有方法,那么就能够只针对本文件全部的私有方法是否被使用来作分析了。 二、注释标记:若是不喜欢下划线的方式,那么也能够考虑添加注释来标记。
一、删除代码要留心 二、分析冗余 三、合理运用工具 四、发布后监控