JustFE团队前端代码规范,降本增效,敏感肌可用

news2024/12/24 8:16:06

请添加图片描述

背景 🌏

近年来,接手各个前端的代码,看着前人屎山,深恶痛绝
为了避免自己或者团队,继续添粪,因此经验总结一番~

规范化优点:

  • 容易理解,维护性强
  • 容易编写,扩展性强
  • 精准定位,bug数量减少,容易改
  • 接手难度低,交接容易
    从长远来看,降本增效


做法 🤔

🤔那么我们应该怎么做?

回答:
命名统一,遵循原则,其他细节,编写代码

注:以下均为vue3 例子


命名统一 🤓

命名规则:最好由常见的英文单词组合(1~2个)

  • 注释参半:若选择不常见命名,或又难以理解的流程,需简略注释
// 调用接口
const getData = () =>{ return ... }

// 重置清空
const reset = () => { ... }

// 刷新
const refresh = async() => {
  reset();
  await getData();
  // 接口请求完,的后续流程  
  ...
}

// 初始化
const init =) => {
   refresh();
   // 除了接口的,其他初始化流程
}

// 初次加载,先调用一次
init();

// 导出方法
defineExpose({
  reset,
  refresh,
  init,
})

选用通用名,作为方法和参数,团队固定统一
影响:理解UP↑,低门槛接手


四大原则 😎

代码结构化上的一些规则,个人久经沙场,领悟

1、不超千行

单文件遵循 不超千行原则
解决:代码解构,分离样式 > 常量 > 模块(优先级)

样式分离:

<style lang="scss" scoped>
@import "./index.scss";
</style>

常量分离:

import { SORT_CONFIG, FILTER_CONFIG, OTHER_LABEL, 
DATA_RANGE, PREACH_LABEL, USER_STATUS, HOSPITAL_AREA,
UNUSUAL_LABEL,DATA_STRATEGY } from "./constant";

模块分离:

import videoModel from "./model/video";
import audioModel from "./model/audio";
import lessonModel from "./model/lesson";

// 视频资源
const { videoIndex } = toRefs(videoModel.state)

// 音频资源
const { voiceIndex } = toRefs(audioModel.state)

// 课程资源
const { activeList, activeIndex, actionIndex, actionCount, 
actionContinuityTime, lessonPaused, lessonTime, countDown 
} = toRefs(lessonModel.state)

const toActionDetail = () => {
  const id = actionVO.value.id
  const version = actionVO.value.dataVersion
  uni.navigateTo({
    url: `../actionDetail/index?id=${id}&&v=${version}`,
  })
  // 调用课程模块,课程暂停
  lessonModel.lessonPause()
}

要是超千行,按优先级分离:样式 > 常量 > 模块
影响:避免其他参数影响,理解UP↑,定位UP↑,扩展UP↑

2、注释参考

难以理解,注释参考原则

/**
 * 重要说明:
 * @constant: 配置文件
 * @events: 主要事件
 *   onActivated(页面激活时触发/加载页面)
 *   getkeyItem(取值,塞值)
 *   setFilterType(排序、筛选点击事件)
 *   resetAll(重置所有条件)
 *   handleSearch(回传搜索参数 + 搜索)
 */

使用 copilot , 效果更佳
影响:交接难度DOWN↓,理解UP↑

3、策略模式

超双条件(>= 3种条件),使用策略模式原则

<template>
  <div class="list">
     <div class="item" v-for="key in personKeys">
        <span class="item-value">{{personKeys[key].value}}</span>
        <span class="item-title">{{personKeys[key].title}}</span>
     </div>
  </div>
</template>

<script lang="ts" setup>
import { getPersonList } from "@/api/workbench"

const PERSON_CONFIG: any = {
  preachCount: {
    value: 0,
    title: "宣讲量",
  },
  validPreachCount: {
    value: 0,
    title: "有效宣讲量",
  },
  validPreachSuccessCount: {
    value: 0,
    title: "有效宣讲成功量",
  },
}

const personObject: any = ref(deepClone(PERSON_CONFIG));
const personKeys = computed(() => Object.keys(personObject.value));

// 调用接口
const getData = async() => {
  const res = await getPersonList()
  
  if(res.data){
    for (let key in hospObject.value) {
      personObject.value[key].value = res.data[key] || PERSON_CONFIG[key].value;
    } 
  }
}

</script>

多种条件,使用策略模式,结构配置化,更为清晰
影响:定位UP↑,扩展UP↑

4、变量内嵌

template语法内,内嵌 class/style,采取变量内嵌原则

<template>
   <!-- 排序筛选 按钮 -->
  <div class="others">
    <div :class="filterTypeClass('sort')" @click="setFilterType('sort')">
      <span class="icon shuliao icon-L-zhengxu font-14"></span>
      <span class="font-10">排序</span>
    </div>
    <div :class="filterTypeClass('filter')" @click="setFilterType('filter')">
      <span class="icon shuliao icon-L-shaixuan font-14"></span>
      <span class="font-10">筛选</span>
    </div>
  </div>
</template>

<script lang="ts" setup>
 // 选中类型 class
const filterTypeClass = (type: string) => {
  const activeHide = [1, 2].includes(active.value) || (!openBedSort.value && active.value === 0)
  // 排序按钮,显示规则
  const btnHide = type == 'sort' &&  props.pageType === 'yxyyPatient' && activeHide

  return {
    'active': filterType.value === type,
    'hide': btnHide ,
    'pdr-16 others-btn': true,
  }
}  
</script>

尽量避免template语法内,出现多条件判断内嵌class,或者style
抽离至script里,配合注释,标明,更为清晰
影响:交接难度DOWN↓,理解UP↑


其他总结 🤭

在这里插入图片描述


感慨 ❤️‍🔥

不知不觉,入行前端,已经有4年半了
从当初一只小菜鸡,慢慢成长(当然现在还是小菜鸡😄)
看着一直以来的职业道路,道虽曲折,但也有收获
晋升成功后,经历疫情的最后裁员风波,忙于pad端的医疗开发,实在是抽不出时间更新。
看着还是上半年更新的博客,熟悉如往常,我又双叒叕来打破僵局了💪
再提一嘴,copilot是真的好用😍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/509021.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优化营商环境:打造政策精准服务平台,提高惠政策落实落地时效性

近年来&#xff0c;各级政府部门及产业园区不断加强对于惠企政策的宣传和落实&#xff0c;努力打造优质的营商环境&#xff0c;加大助企纾困力度&#xff0c;以推动经济高质量发展。为了更好地实现这一目标&#xff0c;搭建惠企政策精准服务平台成为了一个非常重要的举措。 搭建…

Apache Zeppelin系列教程第四篇——Interpreter原理分析

Interpreter 其实就是整个项目的核心&#xff0c;代码运行都是在里面进行执行的&#xff0c;首先来看下Interpreter的抽象类 以jdbc-Interpreter为例&#xff0c;可以参考下测试代码(这个代码里面可以直接测试jdbc的sql执行过程和数据返回过程) 参数和介绍可以参考官方文档&am…

CH9329双头线使用说明

1.介绍说明 CH9329双头线是集成了CH9329CH340芯片的成品线&#xff0c;主要作用是使用主控电脑发送串口指令数据来控制被控电脑的键盘以及鼠标的功能。主控电脑和被控电脑可以是同一台电脑&#xff0c;就是能够自己控制自己。支持自定义修改USB的硬件信息&#xff0c;如PID、V…

FTP-HTTP-HTTPS的学习总结

FTP协议的学习 一&#xff0c;学习的要点 ftp的掌握总体架构、了解状态机 请求响应的格式、常用操作码及响应的含义 PORT与PASV的区别、断点续传 上传、下载文件的基本流程 1&#xff0c;FTP的架构主要有两种形式 UserPI&#xff08;用户解释器&#xff09;和ServerPI&…

『面试篇』之网络知识串联(一):DNS域名解析、TCP的建立与关闭

趁着马上就要面试的这个机会&#xff0c;将网络相关的知识进行一个串联复习。前端网络会在面试中遇到的问题其实并不是很多&#xff0c;核心的内容主要是TCP建立的的三次握手、TCP断开的四次挥手、DNS解析的过程、以及前端跨域等。话不多说&#xff0c;我们直接进入正题。 一、…

【STL十八】算法——不修改序列的操作(for_each、count、find、equal、search)

【STL十八】算法——不修改序列的操作&#xff08;for_each、count、find、equal、search&#xff09; 一、简介二、头文件三、分类四、不修改序列的操作1、for_each2、count、count_if3、find、find_if4、euqal5、search 前言&#xff1a;在前面我们讲解容器和函数对象时&…

X.25,帧中继(FR),ATM三种分组交换系统

X.25、帧中继&#xff08;FR&#xff09;、ATM 是流行的三种分组交换系统&#xff0c;它们具有不同的特点。 两个术语&#xff1a; DTE(Data Terminal Equipment) &#xff0c;数据终端设备&#xff0c;如我们的个人电脑、手机。 DCE(Data Circuit Equipment) &#xff0c;数据…

【STM32】基础知识 第十二课 GPIO

【STM32】基础知识 第十二课 GPIO 概述GPIO 简介GPIO 模式GPIO 特点GPIO 配置GPIO 操作施密特触发器案例 概述 本文小白我将来介绍通用输入与输出, GPIO (General-Purpose Input/Output) 在单片机中的应用, 以及如何配合和食用 GPIO 来实现各种功能. GPIO 简介 GPIO 是单片机…

十三、共享内存

文章目录 一、什么是共享内存&#xff08;一&#xff09;共享内存的定义&#xff08;二&#xff09;共享内存的原理&#xff08;三&#xff09;共享内存的理解 二、为什么要有共享内存三、共享内存怎么进行&#xff08;一&#xff09; 共享内存的数据结构&#xff08;二&#x…

【Redis系列】Redis布隆过滤之8亿大数据集实战

序言 即便平凡的日子仿佛毫无波澜&#xff0c;但在某个特定的时刻&#xff0c;执着的努力便会显现出它的价值和意义。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级重要蓝色&#xff1a;用来标记二级重要 …

SPC Control Chart Tools for WPF 3.1 Crack

使用 WPF 的 SPC 控制图工具&#xff0c;将变量控制图&#xff08;X-Bar R、X-Bar Sigma、单个范围、中值范围、EWMA、MA、MAMR、MAMS 和 CuSum 控制图&#xff09;、属性控制图&#xff08;p、np、c、u 和 DPMO 控制图&#xff09;、频率直方图和帕累托图添加到 WPF 和 WPF We…

物理机:显卡3080 环境Centos7.9 如何检查及安装显卡驱动

环境&#xff1a; 硬件服务器&#xff1a;I5处理器&#xff0c; 显卡&#xff1a;3080 12G 等。 目标&#xff1a; 测试是否安装显卡。 如何找到正确的驱动版本。 安装显卡正确的显卡驱动。 一、检查是否正确安装显卡&#xff1a; # 检查使用什么型号的显卡&#xff1a; yum…

淄博烧烤,怎么就“出圈”了-也是机器视觉行业职场中的态度:少一点套路,多一些真诚,少一点计较,多一些宽容

我认为淄博烧烤之所以火爆&#xff0c;是因为它代表了一种淄博人的态度&#xff0c;一种对生活的热爱和对客人的真诚。 我认为淄博烧烤之所以火爆&#xff0c;是因为它代表了一种淄博人的态度&#xff0c;一种对生活的热爱和对客人的真诚。 我想更重要的一点&#xff0c;淄博烧…

使用NineData定制企业级数据库规范

1. 为什么需要数据库规范&#xff1f; 在企业级应用中&#xff0c;数据库是非常重要的一部分&#xff0c;它们存储着公司的核心数据&#xff0c;包括客户信息、订单、产品信息等等。如果这些数据没有得到妥善的管理&#xff0c;那么就会导致数据不一致、数据丢失、数据泄露等问…

涨知识!细数银行卡三要素 API 的 N 种验证方法

引言 银行卡三要素验证 API 是一种基于姓名、身份证号码和银行卡号等三种信息的验证服务&#xff0c;主要用于绑定银行卡时校验银行卡是否为该身份信息所有、手机号是否为银行卡绑定手机号。 银行卡三要素 API 的验证方法 银行卡三要素 API 的验证原理是通过与银行或银联网络…

k8s二进制搭建|ETCD + Flannel | 单节点部署 | 多节点的部署|dashbord的部署

k8s二进制搭建|ETCD Flannel | 单节点部署 | 多节点的部署|dashbord的部署 二进制搭建 Kubernetes v1.201 初始化环境2 部署 docker引擎3 在mster 192.168.10.10上操作4 在 node01 192.168.10.20节点上操作5 在 node02 192.168.10.30节点上操作6 检查etcd群集状态7 部署 Maste…

SpringBoot——入门程序的简单介绍

简单介绍&#xff1a; 在之前我们创建了一个基础的SpringBoot的程序&#xff0c;可以看到&#xff0c;我们只是启动了一个Java程序&#xff0c;但是它启动了一个Tomcat的服务器。其实在这里面他还启动了很多的服务&#xff0c;只不过这些服务我们都没有用到&#xff0c;我们就…

基于氢储能的热电联供型微电网优化调度方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【Slack+Claude保姆级安装教程】

&#x1f680; AI破局先行者 &#x1f680; &#x1f332; AI工具、AI绘图、AI专栏 &#x1f340; &#x1f332; 如果你想学到最前沿、最火爆的技术&#xff0c;赶快加入吧✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域优质创作者&#x1f3c6;&am…

探究问答系统的实现原理及其应用

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…