前端开发规范

一、编程规范

(一)命名规范

1.1.1 项目命名

全部采用小写方式, 以中划线分隔。

正例:mall-management-system

反例:mall_management-system / mallManagementSystem

1.1.2 目录命名

全部采用小写方式, 以中划线分隔,有复数结构时,要采用复数命名法, 缩写不用复数

正例: scripts / styles / components / images / utils / layouts / demo-styles / demo-scripts / img / doc

反例: script / style / demo_scripts / demoStyles / imgs / docs

【特殊】VUE 的项目中的 components 中的组件目录,使用 kebab-case 命名

正例: head-search / page-loading / authorized / notice-icon

反例: HeadSearch / PageLoading

【特殊】VUE 的项目中的除 components 组件目录外的所有目录也使用 kebab-case 命名

正例: page-one / shopping-car / user-management

反例: ShoppingCar / UserManagement

1.1.3 JS、CSS、SCSS、HTML、PNG 文件命名

全部采用小写方式, 以中划线分隔

正例: render-dom.js / signup.css / index.html / company-logo.png

反例: renderDom.js / UserManagement.html

1.1.4 命名严谨性

代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。 说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式也要避免采用

正例:henan / luoyang / rmb 等国际通用的名称,可视同英文。

反例:DaZhePromotion [打折] / getPingfenByName() [评分] / int 某变量 = 3

杜绝完全不规范的缩写,避免望文不知义:

反例:AbstractClass“缩写”命名成 AbsClass;condition“缩写”命名成 condi,此类随意缩写严重降低了代码的可阅读性。

(二) CSS 规范

1.2.1 命名

类名使用小写字母,以中划线分隔

id 采用驼峰式命名

scss 中的变量、函数、混合、placeholder 采用驼峰式命名

ID 和 class 的名称总是使用可以反应元素目的和用途的名称,或其他通用的名称,代替表象和晦涩难懂的名称

不推荐:

.fw-800 {

  font-weight: 800;

}

.red {

  color: red;

}

推荐:

.heavy {

  font-weight: 800;

}

.important {

  color: red;

}

1.2.2 选择器

1、css 选择器中避免使用标签名从结构、表现、行为分离的原则来看,应该尽量避免 css 中出现 HTML 标签,并且在 css 选择器中出现标签名会存在潜在的问题。

2、很多前端开发人员写选择器链的时候不使用 直接子选择器(注:直接子选择器和后代选择器的区别)。有时,这可能会导致疼痛的设计问题并且有时候可能会很耗性能。然而,在任何情况下,这是一个非常不好的做法。如果你不写很通用的,需要匹配到 DOM 末端的选择器, 你应该总是考虑直接子选择器。

不推荐:

.content .title {

  font-size: 2rem;

}

推荐:

.content > .title {

  font-size: 2rem;

}

1.2.3 省略0后面的单位

不推荐:

div{

  padding-bottom: 0px;

  margin: 0em;

}

推荐:

div{

  padding-bottom: 0;

  margin: 0;

}

(三) js 规范

1、条件判断和循环最多三层

条件判断能使用三目运算符和逻辑运算符解决的,就不要使用条件判断,但是谨记不要写太长的三目运算符。如果超过 3 层请抽成函数,并写清楚注释。

2、this 的转换命名

对上下文 this 的引用只能使用'self'来命名

3、undefined 判断

永远不要直接使用 undefined 进行变量判断;使用 typeof 和字符串'undefined'对变量进行判断。

正例:

if (typeof person === 'undefined') {

    ...

}

反例:

if (person === undefined) {

    ...

}


二、Vue 项目规范

(一) Vue 编码基础

vue 项目规范以 Vue 官方规范 ( https://cn.vuejs.org/v2/style-guide/ ) 中的 A 规范为基础,在其上面进行项目开发,故所有代码均遵守该规范。

请仔仔细细阅读 Vue 官方规范,切记,此为第一步。

2.1.1、 组件名为多个单词。

组件名应该始终是多个单词组成(大于等于 2),且命名规范为KebabCase格式。

这样做可以避免跟现有的以及未来的 HTML 元素相冲突,因为所有的 HTML 元素名称都是单个单词的。

正例:

export default {

  name: 'TodoItem'

  // ...

};

反例:

export default {

  name: 'Todo',

  // ...

}

export default {

  name: 'todo-item',

  // ...

}

2.1.2、组件文件名为 pascal-case 格式

正例:

components/

|- my-component.vue

反例:

components/

|- myComponent.vue

|- MyComponent.vue

2.1.3、基础组件文件名为 base 开头,使用完整单词而不是缩写。

正例:

components/

|- base-button.vue

|- base-table.vue

|- base-icon.vue

反例:

components/

|- MyButton.vue

|- VueTable.vue

|- Icon.vue

2.1.4、和父组件紧密耦合的子组件应该以父组件名作为前缀命名

正例:

components/

|- todo-list.vue

|- todo-list-item.vue

|- todo-list-item-button.vue

|- user-profile-options.vue (完整单词)

反例:

components/

|- TodoList.vue

|- TodoItem.vue

|- TodoButton.vue

|- UProfOpts.vue (使用了缩写)

2.1.5、在 Template 模版中使用组件,应使用 PascalCase 模式,并且使用自闭合组件。

正例:

<!-- 在单文件组件、字符串模板和 JSX 中 -->

<MyComponent />

<Row><table :column="data"/></Row>

反例:

<my-component /> <row><table :column="data"/></row>

2.1.6、组件的 data 必须是一个函数

当在组件中使用 data 属性的时候 (除了 new Vue 外的任何地方),它的值必须是返回一个对象的函数。 因为如果直接是一个对象的话,子组件之间的属性值会互相影响。

正例:

export default {

  data () {

    return {

      name: 'jack'

    }

  }

}

反例:

export default {

  data: {

    name: 'jack'

  }

}

2.1.7、 Prop 定义应该尽量详细

· 必须使用 camelCase 驼峰命名

· 必须指定类型

· 必须加上注释,表明其含义

· 必须加上 required 或者 default,两者二选其一

· 如果有业务需要,必须加上 validator 验证

正例:

props: {

  // 组件状态,用于控制组件的颜色

  status: {

    type: String,

    required: true,

    validator: function (value) {

      return [

        'succ',

        'info',

        'error'

      ].indexOf(value) !== -1

    }

  },

    // 用户级别,用于显示皇冠个数

  userLevel:{

      type: String,

      required: true

  }

}

2.1.8、为组件样式设置作用域

正例:

<template>

  <button class="btn btn-close">X</button>

</template>

<!-- 使用 `scoped` 特性 -->

<style scoped>

  .btn-close {

    background-color: red;

  }

</style>

反例:

<template>

  <button class="btn btn-close">X</button>

</template>

<!-- 没有使用 `scoped` 特性 -->

<style>

  .btn-close {

    background-color: red;

  }

</style>

(二) Vue

2.2.1 基础

vue 项目中的所有命名一定要与后端命名统一。

比如权限:后端 privilege, 前端无论 router , store, api 等都必须使用 privielege 单词!

2.2.2 使用 Vue-cli 脚手架

使用 vue-cli3 来初始化项目,项目名按照上面的命名规范。

2.2.3 目录说明

目录名按照上面的命名规范,其中 components 组件用大写驼峰,其余除 components 组件目录外的所有目录均使用 kebab-case 命名。

src                              源码目录

|-- api                              所有api接口

|-- assets                          静态资源,images, icons, styles等

|-- components                      公用组件

|-- config                          配置信息

|-- constants                        常量信息,项目所有Enum, 全局常量等

|-- directives                      自定义指令

|-- filters                          过滤器,全局工具

|-- datas                            模拟数据,临时存放

|-- lib                              外部引用的插件存放及修改文件

|-- mock                            模拟接口,临时存放

|-- plugins                          插件,全局使用

|-- router                          路由,统一管理

|-- store                            vuex, 统一管理

|-- themes                          自定义样式主题

|-- views                            视图目录

|  |-- role                            role模块名

|  |-- |-- role-list.vue                    role列表页面

|  |-- |-- role-add.vue                    role新建页面

|  |-- |-- role-update.vue                  role更新页面

|  |-- |-- index.less                      role模块样式

|  |-- |-- components                      role模块通用组件文件夹

|  |-- employee                        employee模块

1、api 目录

· 文件、变量命名要与后端保持一致。

· 此目录对应后端 API 接口,按照后端一个 controller 一个 api js 文件。若项目较大时,可以按照业务划分子目录,并与后端保持一致。

· api 中的方法名字要与后端 api url 尽量保持语义高度一致性。

· 对于 api 中的每个方法要添加注释,注释与后端 swagger 文档保持一致。

正例:

后端 url: EmployeeController.java

/employee/add

/employee/delete/{id}

/employee/update

前端: employee.js

  // 添加员工

  addEmployee: (data) => {

    return postAxios('/employee/add', data)

  },

  // 更新员工信息

  updateEmployee: (data) => {

    return postAxios('/employee/update', data)

  },

    // 删除员工

  deleteEmployee: (employeeId) => {

    return postAxios('/employee/delete/' + employeeId)

  }

2、 assets 目录

assets 为静态资源,里面存放 images, styles, icons 等静态资源,静态资源命名格式为 kebab-case

|assets

|-- icons

|-- images

|  |-- background-color.png

|  |-- upload-header.png

|-- styles

3、 components 目录

此目录应按照组件进行目录划分,目录命名为 KebabCase,组件命名规则也为 KebabCase

|components

|-- error-log

|  |-- index.vue

|  |-- index.less

|-- markdown-editor

|  |-- index.vue

|  |-- index.js

|-- kebab-case

4、 constants 目录

此目录存放项目所有常量,如果常量在 vue 中使用,请使用 vue-enum 插件(https://www.npmjs.com/package/vue-enum)

目录结构:

|constants

|-- index.js

|-- role.js

|-- employee.js

例子: employee.js

export const EMPLOYEE_STATUS = {

  NORMAL: {

    value: 1,

    desc: '正常'

  },

  DISABLED: {

    value: 1,

    desc: '禁用'

  },

  DELETED: {

    value: 2,

    desc: '已删除'

  }

};

export const EMPLOYEE_ACCOUNT_TYPE = {

  QQ: {

    value: 1,

    desc: 'QQ登录'

  },

  WECHAT: {

    value: 2,

    desc: '微信登录'

  },

  DINGDING: {

    value: 3,

    desc: '钉钉登录'

  },

  USERNAME: {

    value: 4,

    desc: '用户名密码登录'

  }

};

export default {

  EMPLOYEE_STATUS,

  EMPLOYEE_ACCOUNT_TYPE

};

5、router 与 store 目录

这两个目录一定要将业务进行拆分,不能放到一个 js 文件里。

router 尽量按照 views 中的结构保持一致

store 按照业务进行拆分不同的 js 文件

6、 views 目录

· 命名要与后端、router、api 等保持一致

· components 中组件要使用 PascalCase 规则

|-- views                            视图目录

|  |-- role                            role模块名

|  |  |-- role-list.vue                    role列表页面

|  |  |-- role-add.vue                    role新建页面

|  |  |-- role-update.vue                  role更新页面

|  |  |-- index.less                      role模块样式

|  |  |-- components                      role模块通用组件文件夹

|  |  |  |-- role-header.vue                        role头部组件

|  |  |  |-- role-modal.vue                        role弹出框组件

|  |-- employee                        employee模块

|  |-- behavior-log                      行为日志log模块

|  |-- code-generator                    代码生成器模块

2.2.4 注释说明

整理必须加注释的地方

公共组件使用说明

· api 目录的接口 js 文件必须加注释

· store 中的 state, mutation, action 等必须加注释

· vue 文件中的 template 必须加注释,若文件较大添加 start end 注释

· vue 文件的 methods,每个 method 必须添加注释

· vue 文件的 data, 非常见单词要加注释

注释规范

代码注释在一个项目的后期维护中显的尤为重要,所以我们要为每一个被复用的组件编写组件使用说明,为组件中每一个方法编写方法说明

务必添加注释列表

1、公共组件使用说明

2、各组件中重要函数或者类说明

3、复杂的业务逻辑处理说明

4、特殊情况的代码处理说明,对于代码中特殊用途的变量、存在临界值、函数中使用的 hack、使用了某种算法或思路等需要进行注释描述

5、多重 if 判断语句

6、注释块必须以/(至少两个星号)开头/

7、单行注释使用 //

单行注释

注释单独一行,不要在代码后的同一行内加注释。例如:

  bad

  var name =”abc”; // 姓名

  good

  // 姓名

  var name = “abc”;

多行注释

组件使用说明,和调用说明

      /**

      * 组件名称

      * @module 组件存放位置

      * @desc 组件描述

      * @author 组件作者

      * @date 2017年12月05日17:22:43

      * @param {Object} [title]    - 参数说明

      * @param {String} [columns] - 参数说明

      * @example 调用示例

      *  <hbTable :title="title" :columns="columns" :tableData="tableData"></hbTable>

      **/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348

推荐阅读更多精彩内容

  • 前端代码规范 Front Standard Guide 前端 JS 项目开发规范 规范的目的是为了编写高质量的代码...
    zlog阅读 2,470评论 1 2
  • 前端代码规范 Front Standard Guide 前端 JS 项目开发规范 规范的目的是为了编写高质量的代码...
    养樂多_566c阅读 310评论 0 0
  • 一、框架 / Vue 1.组件名 组件名为多个单词,并且用连接线(-)连接,避免与 HTML 标签冲突,并且结构更...
    流浪的代码阅读 1,452评论 0 0
  • 一、命名规范 1、项目命名 全部采用小写方式, 以中划线分隔正例:tmall-management-system反...
    秋玄语道阅读 2,399评论 0 12
  • 前端代码规范 Front Standard Guide 前端 JS 项目开发规范 规范的目的是为了编写高质量的代码...
    乞力马扎罗的血阅读 181评论 0 0