Skip to content

Latest commit

 

History

History
253 lines (145 loc) · 9.49 KB

File metadata and controls

253 lines (145 loc) · 9.49 KB

前端项目典型问题以及改进方案

参加几个前端项目后,发现了一些能改进的问题,并提出了一些改进方案,希望能帮助提升项目的质量和效率,保证项目的可维护性。

代码风格不统一

代码风格不统一会导致代码难以阅读和维护。不同人可能有不同的编码习惯,导致代码风格混乱。

  1. 大家不敢合并代码,害怕引起冲突。
  2. 他人不在时,你修复一个紧急的 bug,他说风格又变了,自己又不习惯了,引发不必要的协作摩擦。
  3. 不方便追溯 git 历史,因为 commit 里可能有大量格式改动。
  4. 有的成员习惯不好,该缩进的不缩进,该换行的不换行,导致代码可读性差,难以维护。
  5. 代码风格不统一,当需要全局搜索,然后再替换的时候,会非常棘手。

单引号和双引号混用

该有空格的没有空格,单双引号混用。

当需要全局搜索的时候,不方便

优化后

有分号和无分号混用

代码排版混乱,该缩进的不缩进,该对齐的不对齐

优化后

行宽太大

264 列太长了,建议不要超过 100 列。 太长的行宽会导致代码难以阅读,编辑器出现横线滚动条,建议控制在 80-110 列之间。

依赖导入顺序混乱

业务代码和依赖导入混在一起,相互穿插,读起来头大。

更好的方式:

依赖导入放在文件最上方,且对不同来源的依赖进行按照距离远近分组,在依赖导入后才写代码。

美观一致的代码排版是可读性的基础,能有效提高代码可读性,降低认知负担,提高协作效率。

语法错误

团队成员可能水平不同,或者细心程度不同,偶尔写错误语法。

拼写错误

type 拼写成 types

重置内置函数

把 js 数组的内置函数重置了。

props 支持多种类型错误

希望组件 props 支持多种类型的数据,前两种是错误语法,第三种才是对的。

模板错误

多了>

一些代码异味

代码异味虽然不算严重的问题,但是它非常容易引发 bug,也要引起重视,否则会导致代码难以维护。

参数过多

13个参数,导致这个函数难以使用,有一个参数顺序不对,就可能导致 bug。

其他例子不再举例。

意外重置变量导致 bug

forEach 的第一次循序,把 顶部的 key 重置了,导致第二次循环出问题。

这个问题开发登录功能,导致前端后排查了挺久。

改进方案,统一采用 const 声明变量,除非需要再次赋值才使用 let,能避免变量意外重置导致 bug。

js 中需要再次重置变量的场景很少,正因为 let 变量存在这样的风险,很多代码规范都优先使用 const。

比如质量检查工具 eslint -- prefer-const

使用 const 就能有效避免这个问题。

样式重复

在 id 选择器里写很多样式

为何不应该使用 id?

id 选择特异性很高,一旦写了很多样式,哪天需要重置样式,会非常棘手。

如何避免呢?不在项目使用 id,应用挂载使用类名:

// NOTE 不要使用 id 挂载应用,否则有人在 #app 选择器里写了很多样式,导致样式优先级过高,难以重置
// app.mount('#app')
app.mount('.app-mounted-root')

嵌套过深

在四预项目里看到过if 语句和循环语句,嵌套了 7 层,就不贴代码了。

我的改进建议

当发现这些问题时候,我积极寻找解决办法,我建议这样改进:

  1. 项目里加入 prettier,在代码提交前执行 prettier,强制格式化代码,轻松实现统一风格。

新老项目都适用,因为他只会格式化提交的文件,即有修动的文件。对老项目而言,随着文件改动得越来越多,风格不统一的问题就逐渐缓解了。

  1. 新项目加入 eslint 质量检查

eslint 是前端项目常用的质量检查的工具,可以防止不好的编码实践,避免代码异味,从而保证团队的编码质量。

一些常见的代码异味,会自动修复,无法自动修复了,需要手动修复。

老项目也可以加入 eslint,可以设置在提交前对改动的文件进行检查,不会影响不改动的文件。但是可能会增加项目成员负担,因为已经存在的文件,可能有很多代码异味,需要手动修复。

当我提出这些问题和改进方案时,得到反馈非常消极,主要有四种:

  1. 公司代码的风格 10 多年了,熙哥都没统一过,我不能统一,不要自作聪明。
  2. 没必要统一风格,我喜欢自己的风格,各人的代码各人改。但是不可避免要去阅读和修改他人的代码,比如修复紧急bug。
  3. 不了解 prettier 和 eslint 这类保证代码质量的工具,认为统一代码风格和质量检查是无用功。
  4. 公司没要求,就没必要整这么复杂,有人从外面来公司,就是希望躺平,做一天和尚撞一天钟,不能要求别人什么质量怎样。这导致劣币驱逐良币

以上问题在我们前端项目应该说是长久以来普遍存在的,也切切实实影响项目维护和协作,还会导致其他问题。

您作为公司的架构师,对这些问题会有更深入全面的看法,希望能多多帮助推动这些问题的解决。

能让前端团队认识到以上问题的危害,代码风格和质量对协作的重要性,最好能综合前端同事的一些意见,在认知上达成统一,制定前端项目可实施的质量标准,并结合上面我提到的两个工具自动化地落实。

目前没有强制统一风格,文件改动会可能会经历这样的典型过程:

a.js # A 同事编写的 风格A
b.js # B 同事编写的 风格B
c.js # C 同事编写的 风格C

修复一个 bug,B 同事改动了 a.js

a.js  # B 同事改动,风格变成 B,可能有大量格式上的改动

又修复一个 bug , A 同事改动 a.js

a.js  # A 同事改动了,风格又变成 A,可能有大量格式上的改动

新增一个功能,D 同事新增一个文件:

d.js # D 同事新入的代码,风格是 D

修复一个 bug, B 同事去改动了 d.js:

d.js # B 同事改动,风格变成 B

可看到,不强制统一风格,已经存在的文件,会随着代码改动,风格越来越乱;

新增的文件,不同的人也有不同的风格;

所以,风格不一致引发的协作问题,没有解决,反而会越来越严重。

强制统一风格后,不管谁来改动文件,代码风格最多有一次变化,此后谁来改动,都一致

统一风格后,文件改动可能会经历这样的过程:

a.js # A 同事编写的 风格A
b.js # B 同事编写的 风格B
c.js # C 同事编写的 风格C

修复一个 bug,B 同事改动了 a.js

a.js  # B 同事改动,风格变成 W,可能有大量格式上的改动

又修复一个 bug , A 同事改动 a.js

a.js  # A 同事改动,风格还是 W

新增一个功能,D 同事新增一个文件:

d.js # D 同事新入的代码,风格是 W

修复一个 bug, B 同事去改动了 d.js:

d.js # B 同事改动,风格还是 W

统一风格后,代码风格会随着文件的改动,逐渐统一,一个文件最多发生一次风格上的变化,此后风格都一样了,所以代码风格引发的协作摩擦也会越来越少,逐渐消除了。

不会特意去格式化老文件,而是需要修复 bug 了,才去改动,此时改动,会引发一次格式上的变化,但是此后不管谁来改动,格式都是一致。

风格的统一,引入 bug 的可能性非常低。又因为有 bug 才去改动老文件,会经历测试的过程,因此引发 bug,也会发现。

格式化引发 bug,我从来没遇到过,除非像 uniapp ,使用特定的注释,作为条件编译的情况。