关于前端代码规范的问题 请教一下大家

6 天前
 ali233

最近入职了一家公司 领导在 review 代码的时候有一些分歧,我跟他聊了一些问题

  1. 使用最新的 vue3 技术,而用着老旧的 vue2 的写法
  2. 能 1 行代码解决 10 行代码,但是非要用 10 行代码的写法
  3. 长达 1000 行请求(定义请求 url 的)的代码文件,不做任何拆分处理,页面上所有请求都写到这个文件中
  4. 目前我维护的几个前端项目每个项目都是不同的写法

对于以上几点,以下是我跟领导的讨论记录

  1. 使用最新的 vue3 技术,而用着老旧的 vue2 的写法

    xxx: 會沿用像 vue2 的寫法純粹是因為當時我們幾個一致覺得這種寫法比較好,比 vue3 那種自由奔放,全部宣告的變數都放進 view 裡面好 以下是具体代码举例

    <script setup>
      export default defindComponent({
        component: xxx,
        setup:(){
            const listData = ref()
            const handleData = ()=>{xxx}
    
            return buildSetup({
              method:{},
              data:{ listData },
              handles: { handleData }
            })
        },
      })
    <script>
    // 页面上使用需要 
    // {{ data.listData }}  {{ handles.handleData }}
    
    // 还有些页面甚至全是 vue options API 写法
    
  2. 能 1 行代码解决 10 行代码,但是非要用 10 行代码的写法

    我: 当页面要获取请求的 loading 和 data 来展示的时候,老写法需要定义两个 ref 来存储接口的数据和状态,过于繁琐,所以使用了以下写法

    const { data, loading} = useRequest(fetchData)
    

    xxx: 現在項目的最優先考量是沒有必要的話,不要引入新的寫法,就算新寫法比較好用也是一樣, 因為只會造成新舊不一致,哪天你走了以後下個人又來一個寫法,久了就更難維護了 所以有出現 useRequest 的地方,我都會退回

    const data = ref()
    const loading = ref(false)
    
    const getData = ()=>{
        loading.value = true
         await getData(xxx).then(res=>{
              data.ref = res.data
         })
         loading.value = false
    }
    
  3. 长达 1000 行请求(定义请求 url 的)的代码文件,不做任何拆分处理,页面上所有请求都写到这个文件中

    我: 请求文件中代码量已经非常大,快接近 1000 行,继续往里写可读性会越来越差

    export default {
      async getListData = () => {
        return  axios.get(xxx)
      },
    
      async getUser = () => {
        return axios.xxx
      },
    
      xxx...
    }
    

    xxx: 現階段我不覺得這是個問題,我也不覺得可讀性有變差,而且對 reviewer 來說沒有多的心智負擔,只要順順看過去就知道在做什麼了。你可能會問說:「那之後變到 3000 行怎麼辦?」,我會說,到那個規模的時候,這個項目很多寫法都不適用了,那時八成會打掉重做,因此現階段這不是個問題

  4. 目前我维护的几个前端项目每个项目都是不同的写法

    我: 之前前端这块没有前端规范是因为项目都在不同的人手里,每个人开发会有差异,那既然现在项目都是我们自己人在维护了,为什么不统一一下写法和规范呢( PS: 大概 3-4 个项目,每个项目的写法都不一样)

    xxx: 做任何事情都是需要成本的,如果沒有考慮到成本跟帶來的效益,那就只是種自我滿足而已 現在的前端系統不會常出 bug ,代表功能上沒太大問題,那會很難維護嗎?不會,雖然幾個項目彼此的風格可能有差,但盡可能維護項目內的風格是一致的,就算以前沒有一致之後,之後也會盡量一致 再來還需要考量項目之後的發展以及生命週期,之後還有很多新功能嗎?還是已經差不多了?那如果已經進入維護期了,重構的必要性是什麼?有些人只是覺得代碼看起來不順就要重構,沒思考過這個理由是不是合理,是不是符合效益 總結一句話大概是我認為目前沒有制定開發規則的必要性,現有代碼也暫時不需要大規模的重構

最后是领导对于团队规范的总结: 不同階段/規模的項目有不同的做法,1 個人的、10 個人的或是 100 人合作的項目,做法都不同,如果硬要把 A 項目的做法直接套到 B 項目上面,或是直接把以前習慣帶進來覺得這一套之前很好用,現在一定也很好用,那通常是有問題的

我理解这句话的意思一个公司中的团队规范如果在 A 项目中好用,然后套用到 B 项目上还是很好用的话,那么这通常是有问题的

欢迎大家理性讨论,不知是我过于追求代码洁癖了还是什么

3660 次点击
所在节点    职场话题
86 条回复
wusheng0
5 天前
1 不说了,vue3 主推的就是 hook 写法,用了 vue3 又因循守旧

2 见仁见智了

3 在一开始就应该考虑按照功能模块去拆分。再怎么清晰,放在一个文件也不如拆开来清晰

4 我赞同你领导的说法,任何事情都得考虑成本
yeziqing
5 天前
事情都有多面性,每个人看问题(比如成本、产出)的角度不同而已。既然他是领导,那就以他为准,而且客观地说,领导说的也都没问题。
sgiyy
5 天前
1 ,2 ,4 无解,作为领导,考虑项目的稳定性是第一位的,如果改动大组内其他人适应性如何也是一个问题。如果感觉提升不明显,建议跳槽...

3 我倒是想提一下:我觉得问题最大的点不在于上千行,原因在于这个文件没有什么复杂度,其实定位找个接口很容易。问题在于都封装在一个对象里,命名问题很大,到最后起名很麻烦和命名很长。
我习惯于按后端接口模块封装在若干对象里面,比如:
```javascript
export const userAPI = {
update: () => {},
get: () => {},
}
export const todoAPI = {
update: () => {},
get: () => {},
}
```
jackding1208
5 天前
谁维护按谁的习惯来就好...
公司项目除了你自己没人会在意这些
saviorjiang
5 天前
1.如果说你开发的页面,使用了 vue3 写法,后续有新人入职,因为之前的页面开发大部分都是用 vue2 的写法,你又没法约束的情况下,大概率会按照之前的写法去写。如果是项目开始就是 vue3 ,用 vue2 的写法,那确实很难理解。

按照新写法去优化,大概率后续是两种写法会共存,新人接手,我觉得会挺混乱的,就像 jquery 到 vue2 ,再到 vue3 ,三种写法共存(混乱至极)。

问题 2 ,我觉得加了也没啥啊,就当是封装了一个请求,项目里肯定也有各种封装。

问题 3 ,我个人觉得可能就是最开始规范制定的统一存放吧。

问题 4 感觉就是这种情况了,大家都是觉得有更好的写法,在不同项目导致不一样。这个也不能避免,规范也不能预判到技术的发展,从简单 ajax 请求,到封装请求,再到 useRequest ,后面或许有更好的写法也说不定,统一写法,就要对老项目进行重构或者优化,大部分公司都不愿意花时间专门去做的,毕竟收益不能提高

当然我个人更像 op ,更愿意优化。
xz410236056
5 天前
“會沿用像 vue2 的寫法純粹是因為當時我們幾個一致覺得這種寫法比較好,比 vue3 那種自由奔放,全部宣告的變數都放進 view 裡面好”

纯粹懒得学习找的借口罢了,年纪大了后大多数人都懒得学新东西了
aker91
5 天前
@ali233 #35 项目长期维护基本只有两种情况,要么一直在更新,要么一直停留在某个版本,你如果能坚持更新的话,就先选一个项目把相关的某个规范全改掉,然后再去和你领导谈,大概率会通过
dfkjgklfdjg
5 天前
如果做不到固定的开发工作流,确保每一个 MR 都会 review 通过后才会被合并。
那么 OP 你关注于“技术”部分的规范,确实会补充中领导的长远看法一样。

---
关于团队开发规范一般都是开发团队中互相理解认可,最终达成一致的规范。而不是一两个人拍脑袋确定下来的。
至于项目 A 使用,不代表项目 B 也适用。其实和团队 A 认可,不代表团队 B 也会认可一样的。

比如你的举例就很“技术”,并不是一个对于开发流程的规范,更像是 Lint 相关的规范(也就是 Coding Style ),那么确实并不一定适用所有项目。
---

比如你可能会觉得<问题 1>很不爽,但是可能项目开始时期 `script:setup` 并没有实现,所以当时只是使用了 `setup` 并没有使用 `script:setup`。
那么按照你<问题 4>的认定,你多半也不会认可在一个项目中同时出现选项式和组合式两种写法。那么比较合适的情况就是延续旧有的“开发规则”,继续使用 `setup` 开发而不是 `script:setup`,而不是全部重构成 `srcipt:setup`。

至于<问题 2>和<问题 3> 是出于一个中间地带,首先代码量少并不一定就是“好代码”,举个很极端的例子 `const result = condition1 ? condition2 ? 'A' : 'B' : condition3 ? 'C' : 'D';`
虽然示例和 OP 你表达的并不一样,我这样举例有一点抬杠的意味,但想表达的是 代码结构清晰,可以让所有人都可以快速理解的代码,才是真的“好代码”。
不知道你举例的 `useRequest` 是 [VueUse]( https://vueuse.org/core/useFetch/) 这种比较大众的工具类库提供的,还是自己内部实现的工具类库。

API 都声明在一个 `index.js` 文件中,我也觉得会是一个问题,但是可能开发团队已经习惯了直接使用 `import { xx } from '@api' 中引入对应的接口了。
可以贡献一个模块化拆分后 API 维护的 MR ,并且提供和原本一样的聚合后的 `@api/index.js`出口(`export * from './modulesA'`)。
这个 MR 就可以当成首次 review 的一个样例。

---

但是 OP 你得和你的领导确定好,你们想要制定的规范是什么,是开发流程的规范,还是编码风格的规范。
开发流程的规范当形成习惯之后是可以随团队一直延续、传承下去的,但是编码风格的规范会随着不同项目的主导人而不同的。
ali233
5 天前
@dfkjgklfdjg 现在工作流就是这样的 需要 approve 后才可以合并代码进主分支,且团队现在就我跟领导两人开发前端

举例的 useRequest 就是比较大众的工具类库提供的,我是感觉写法会比之前那种写法简洁许多而且也方便阅读

API 声明在文件中并不是用的时候 直接 `import { xx } from '@api' ` 而且在 index.js 中写了一个 class instanceClass ,在各个地方调用接口的时候需要 await instanceClass.getAxios.getData()

我尝试过拆分这个文件,被直接打回了。 最终是全部删掉重写了这块代码
vaporSpace
5 天前
我们团队 vue 的写法就已经有好几种了,用 tsx 、jsx 、composition api 、Options Api ,还有看心情混着用的,再加上不同项目 vue2 、vue3 都有,有的用 vue-cli 有的用 vite ,没点前端基础哪玩得转 vue 呀,还没提开发组件怎么兼容 vue2 、3 呢。哪怕是用 composition api ,有的人是 script setup ,有些人还是保持 component setup 。随便怎么写吧,我已经无所谓了,我自己写就偷偷用 tsx 哈哈
beidounanxizi
5 天前
绝大部分时候 review 是政治斗争 是话语权
先听你领导的
他说了算 除非你觉得那领导 那那都特傻 x
都是打工的 何必呢
刚入行 觉得别人写的 看不顺眼 或者有些轴的人 特别喜欢追求自己心中的
当然也有特傻逼的 绕开走就行了
既然是你领导的 先听他的 让他舒服了 再提些自己的小意见 领导也能接受
你说的这些 何况也不都是你对
Terryx
5 天前
你一来就要重构,还要重新定规范,我感觉你更像领导。
真重构,定了规范,有好处你出头,出了问题你领导背锅,而且你这是在抢领导力,傻叉领导才会同意。
你有本事自己弄个厉害的,让别的同事佩服不已,自愿来找你求教,这才能正道。别对老代码指手划脚,你不知道当年的妥协。
年轻要有敬畏之心。
yanqing07
5 天前
@ivvei #20 我也觉得这领导没水平,而且还“懒”。
明显前后回答就有矛盾。最后那个理由非常没水平,规范定了就要写下来文档,后面进来的人就是要按规范开发,代码审核人也是按规范审核。什么人走了规范就没了,他明显就没“水平”做技术管理。
按他说的,eslint 里面那么多大厂风格大家都不套用呗。基本规范就应该是要有的,具体项目具体分析也是要有的。
这领导就是技术水平不够,全靠一张嘴。
而且,看到 await 再加 then 的写法,就知道没人 review 才出现这种乱七八糟的代码
Garwih
5 天前
看起来你领导好像不知道 ESLint 这种工具的存在。
另外,用 Vue 3 还坚持用 Options API 本质上就是不想学新东西,Composition API 有更好的 TS 支持,关联逻辑可以放到一起,而不用必须分散到各个 option ,会用的话应该写得比 Options API 更清晰易懂。
iidear2015
5 天前
制定规范是为了保持统一,便于交流和协作。大家都觉得简单易懂的代码就是好代码。

对技术有热情,挺好的。布道技术是一件难事。 领导虽然不认同,但还是认真和你讨论,也挺好的。不妨试试和团队其他人聊聊,或者内部做做分享讨论
irisdev
5 天前
老项目就用老写法,不觉得有什么问题
darkengine
4 天前
如果是线上项目,改完之后有测试人员把所有 use case 回归一遍不?
imba97
4 天前
我直接无脑 npm install @antfu/eslint-config
dingyaguang117
3 天前
你们领导说的对,是个实用主义和返璞归真的人
dingyaguang117
3 天前
@Garwih
@xz410236056

Composition API 个人感觉确实没 Option API 清晰, 至于说相同逻辑代码在一起,我觉得大部分情况应该直接抽出去单独文件…

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1072868

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX