前端开发规范v1.0

最后一次修订日期:2021/04/12

前言

随着前端工作小组不断有新同事加入,项目开发过程中因个人的编程习惯而产生许多杂乱的、不统一格式的代码,造成项目代码可读性变差,对后期代码的维护和更新造成一定的困难。
为解决以上问题,提高个人和团队的开发效率,共同制定以下开发规范,望大家共同遵守,共同进步。

1. 开发工具和版本规范

针对Vue项目开发,推荐以下工具:

  • VSCode(日常使用)
  • HBuilder X (APP和小程序开发时使用)
/* VSCode 推荐插件名称,有其他推荐工具时请共享出来 */
// 中文简体语言包
Chinese (Simplified) Language Pack for Visual Studio Code 

// 使用 Element UI 时推荐使用
Element UI Snippets 

// 快捷工具,使用ctrl+单击 可以快速查找定义的变量和方法,也可以打开文件
vue-helper

// mardown 预览
Markdown Preview Enhanced

// Vue扩展
Vetur
  
//  引入的文件  ctrl+单击 可快捷打开文件
file-jump
  • 开发版本方面,使用Vue2.x,使用vue-cli来便捷创建项目即可。一般使用 vue, vue-router, Vuex全家桶来进行开发。
2. 项目目录规范
  • 依照vue正常的项目目录即可。依赖的本地资源比较大时,需要上传至服务器,异步获取。
  • 请在项目目录中创建readme.md文件,使用此文件来填写项目简介、描述,以及注意事项和一些说明文字,以便于其他同事直观了解本项目内容。【如修改了本地的某个依赖文件,其他同事拉取代码后打包时可能会忽略这个问题,导致生产环境出现问题】
3. 文件命名规范
  • 文件统一使用英文字母命名,统一使用小写字母不使用复数形式,特殊情况下可使用下划线连接符来命名。
  • 文件夹命名时可以使用复数,代表模块时不使用复数。(如 user,views, pages, wallet 文件夹)
  • 首页使用 index, 表单使用 form,详情使用 view来命名,编辑和创建分开时,编辑使用edit,列表优先使用index,也可以使用list/record等。概览或统计图表使用overview。回收站 recycle
// 例子
|--- views
  |--- goods  // 商城模块
    |--- index.vue  // 商品列表、首页
    |--- cart.vue  // 购物车页面
    |--- view.vue  // 详情

  |--- user  // 用户模块文件夹
    |--- home.vue  // 用户主页页面
    |--- userinfo.vue  // 用户资料页面
    |--- password.vue  // 修改密码页面
    |--- forget.vue  // 找回密码页面
    |--- pay.vue  // 订单支付(收银台)页面
    |--- result.vue  // 支付结果回调页面

  |--- order // 订单模块文件夹
    |--- index.vue  // 订单列表页面
    |--- view.vue  // 订单详情页面
    |--- evaluation.vue  // 订单评价页面
    |--- refund.vue  // 退款申请页面

  |--- common  // 通用模块文件夹
    |--- feedback.vue  // 意见反馈页面
    |--- login.vue  // 登录页面
4. HTML 规范
  • 代码v-forv-if 不要同时在同一个dom上使用,v-if尽量使用在<template>虚拟标签上。
<!-- bad -->
<h3 v-if="show" class="mb-md c3">注册协议</h3> 

<!-- goods-->
<template v-if="show">
  <h3 class="mb-md c3">注册协议</h3>
</template>
  • 属性顺序:
    1. 绑定 (v-modelv-ifv-for
    2. 参数props ( id=1:data="v":key="k" )
    3. 事件、行为 (@clicked@changed
    // HTML例子
    <img v-lazy="v.thumb" class="img" @click="bannerClicked('top', k)" /> 
    
  • v-ifv-for使用规范
    1. v-ifv-for必须使用template包含。
    2. 循环时统一使用v作为值,k作为键使用。如果有多层,第二层循环体使用vvkk作为键值使用
    <template v-for="(v, k) in navList">
      <li :key="k" class="item flex-column p-t-s" @click="navPageTo(v)">
        <template v-for="(vv, kk) in v">
          <span :key="kk">{{vv}}</span>
        </template>
      </li>
    </template>
    
5. CSS 规范
  • 主旨

    1. 统一使用"-"连字符
    2. 省略值为 0 时的单位。如0.5s设置为.5s
    3. 如果 CSS 可以做到,就不要使用 JS
    4. 属性使用缩写 border, background
    5. 优先使用scss,并使用scoped属性,防止局部样式污染全局。
    6. 优先使用flex布局,尽量不使用float布局方式。
    7. 使用 x , s, m, l 分布代表 最小,小,中, 大
  • 属性顺序

    1. 位置属性 ( position top right z-index display float 等)
    2. 大小 ( width height padding margin 等)
    3. 文字系列 ( font line-height letter-spacing color text-align 等)
    4. 背景 ( background border 等)
    5. 其他 ( animation transition 等)
    .header-user-top {
      position: fixed;
      height: 40px;
      font-size: 14px;
      background-color: rgba(255, 255, 255, .7);
    }
    
  • 全局样式的封装与统一使用
    会根据公众号H5、小程序端、PC等有不同的common.scss文件。PC端常用10px, 15px, 20px 作为间隔间距。移动端与设计统一,暂定为8px16px 作为间隔间距,设计稿宽750px。默认字体为14号大小。

      @each $direction in row, column {
        .flex-#{$direction} {
          display: flex;
          flex-direction: $direction;
          align-items: center;
          &.flex-start {
            justify-content: flex-start;
          }
          &.flex-end {
            justify-content: flex-end;
          }
          &.flex-center {
            justify-content: center;
          }
          &.flex-around {
            justify-content: space-around;
          }
          &.flex-align-start {
            align-items: flex-start;
          }
          &.flex-align-end {
            align-items: flex-end;
          }
        }
      }
    
    // 定义flex等分  flex-1 == flex: 1;
    @for $i from 0 through 12 {
      .flex-#{$i} {
          flex: $i;
      }
    }
    
    // 定义字体(px)单位,小于20都为px单位字体 font-14 == font-size: 14px
    @for $i from 9 to 20 {
      .font-#{$i} {
          font-size: $i + px;
      }
    }
    
    // 定义超出截断显示...
    .overflow {
      white-space: nowrap;
      text-overflow: ellipsis;
      -o-text-overflow: ellipsis;
      overflow: hidden;
    }
    
    // 定义段落最大显示多少行
    @for $i from 2 to 10 {
      .clamp-#{$i} {
        display: -webkit-box;
        -webkit-line-clamp: $i;
        -webkit-box-orient: vertical;
        overflow: hidden;
      }
    }
    
    $sizes: (
      x: 5,
      s: 10,
      m: 15,
      l: 20
    );
    
    @each $key,$val in $sizes {
      .m-#{$key} {
          margin: $val + Px!important;
      }
      .p-#{$key} {
          padding: $val + Px!important;
      }
      @each $short, $long in l left, t top, r right, b bottom {
          .m-#{$short}-#{$key} {
              margin-#{$long}: $val + Px!important;
          }
          .p-#{$short}-#{$key} {
              padding-#{$long}: $val + Px!important;
          }
      }
    }
    

按照以上规范,class命名后,可以直接使用:
m-t-x m-t-l p-s p-b-m m-m
font-14 flex-1 clamp-2
color-primary color-danger color-success
bg-white bg-red bg-warning bg-gray
flex-row flex-column flex-start

6. JS 规范
  • 变量命名
    1. 声明变量时,用let代替之前的var,常量务必在<script>下方使用const声明。
    2. 常量必须使用大写,用下划线分割。例如:
const USER_KEY = 'CIM_USER'
  • 方法命名
    1. 方法要简介,有合适的语义化。统一使用驼峰或下划线分割,不能直接使用单个英文单词作为方法名。
    2. 同一个文件中方法名命名格式应统一(即个人可以有自己的习惯,但应保持一致,维护他人代码时也应按照他人之前的格式)。
// 合适的例子
pageToView() {
},
loadData() {
},
reloadData() {
},

// 不合适的例子
page(url) {
},

url(name) {
},

  • async awaitpromise 的使用规范

    1. 默认使用promise封装的axios,包括全局的状态拦截,请求拦截器。返回正常时变量使用res,返回异常时使用变量err
    this.$axios.get(this.api.village.detail, { params }).then(res => {
      if (res.code == 1) {
        this.villageInfo = res.data;
        this.manager = res.manager;
      }
    }, err => {
      console.log(err);
    });
    
    1. 特殊情况时可使用await,如上传图片时,使用await写法可能更清晰易懂。但应统一按照规范,写好注释。
  • 接口方法名的规范

     // 注释写清楚用途
      vote: {
          user: {
              index: baseUrl + 'vote/user/index', //投票首页,
              join: baseUrl + 'vote/user/join', //报名参与投票
              view: baseUrl + 'vote/user/view', //投票活动详情页
              player: baseUrl + 'vote/user/player',
              vote: baseUrl + 'vote/user/vote',
              rank: baseUrl + 'vote/user/rank',
          }
      },
    
  • 组件引入和注册
    如果仅部分页面引用的插件,不要使用全局注册的方式注册使用。此处列出部分组件,请选择使用:

  1. 图片上传压缩组件 (设置图片的上传和压缩,图片方向调整等)compressed.js

  2. 节流防抖组件 (设置一定时间内按钮的响应间隔时间,防止多次触发事件)Throttle.vue

  3. 页面分享组件 (设置History路由模式下。页面的分享和微信JS-SDK的签名功能) history_share.js

  4. 设置标题组件 (设置公众号网页标题) title.js

  5. 处理时间(短时间显示,时间戳转换)time.js

  • 其他
    1. Vue中,应尽量少的使用变量,如果变量比较多,可以合并后使用对象或组合。
    2. 不涉及双向绑定的变量,应放到data外部,提升性能。例如:
      <template v-if="backTop">
        <div class="back-top" @click.prevent="goTop">
          <i class="el-icon-caret-top"></i>
        </div>
      </template>
    
      <script>
        let localCartData = {}; //不涉及dom渲染,只涉及变量临时存储。
        export default {
          name: "AppMain",
          data() {
            return {
              backTop: false,
              form: {
                name: "", 
                phone: ""
              }
            }
          }
        }
      </script>
    
7. 代码注释规范
  • 注释格式

JS中统一使用 /**/ 或者 // 来进行注释。
JS、HTML 和 CSS规范如下:

  1. HTML注释
    for循环体循环层,需要加注释
  <!-- user-header begin -->

  <!-- user-header end -->
  1. JS 注释

  1. CSS 注释

生成JSDoc的快捷操作是敲 /** 回车 */


快捷方式输入后

@description
使用@description可以在代码提示时显示被描述变量或者函数的描述信息。
例子:


/**  
 * @description 这是一个构造函数  
 */  
function Animal(name,weight){  
    this.name = name;  
    this.weight = weight;  
}

效果:


使用效果

@example
使用@example可以提示代码示例。
例子:

 /**
 * @description 这是一个构造函数  
 * @example   
 * var animal = new Animal('恐龙',1000);  
 * @constructor  
 */  
function Animal(name,weight){  
    this.name = name;  
    this.weight = weight;  
}

效果:


使用效果

@param
使用@param可以描述一个函数的参数以及参数类型

8. 打包规范
  • 项目打包务必注意关闭SourceMap,并设置 Vue.config.productionTip = false
  • dist文件夹体积尽量不超过3Mb,如果资源比较大,考虑将资源文件放置CDN服务器,页面使用链接引入。
  • 全局引用和局部引用的组件要规范。局部使用的组件和类库,不允许放到main.js里引入。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 一、企业项目开发流程 产品提需求 交互设计出原型设计 视觉设计出UI设计图 前端开发出页面模板 server端存取...
    Eric_V阅读 1,731评论 0 3
  • 一、框架 / Vue 1.组件名 组件名为多个单词,并且用连接线(-)连接,避免与 HTML 标签冲突,并且结构更...
    流浪的代码阅读 1,445评论 0 0
  • 前端开发规范 规范目的 命名规范 结构化规范 注释规范 编码规范 CSS 规范 规范目的 为提高团队协作效率 便于...
    妹妹十六阅读 170评论 0 0
  • 一、概述 本规范旨在为前端程序的开发者提供规范化最新的指导,可用于程序员个人编译环境以及研发团队集成环境等场合的代...
    flyinskybiu阅读 3,070评论 0 2
  • 前端代码规范 Front Standard Guide 前端 JS 项目开发规范 规范的目的是为了编写高质量的代码...
    养樂多_566c阅读 306评论 0 0