前端开发规范

185 阅读14分钟

前端开发规范

 

 

目录

前端代码规范 3

一.  编程规约 3

(一)  命名规范 3

1.1.1 项目命名 3

1.1.2  目录命名 3

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

1.1.4 命名严谨性 4

(二) HTML  规范  (Vue Template  同样适用) 4

1.2.1 HTML  类型 4

1.2.2  缩进 5

1.2.3  分块注释 5

1.2.4  语义化标签 5

1.2.5  引号 5

(三) CSS  规范 6

1.3.1  命名 6

1.3.2  选择器 6

1.3.3  尽量使用缩写属性 7

1.3.4  每个选择器及属性独占一行 7

1.3.5  省略 0 后面的单位 8

1.3.6  避免使用 ID 选择器及全局标签选择器防止污染全局样式 8

(四) LESS  规范 9

1.4.1  代码组织 9

1.4.2  避免嵌套层级过多 9

(五) Javascript  规范 10

1.5.1  命名 10

1.5.2  代码格式 12

1.5.3  字符串 12

1.5.4  对象声明 13

1.5.5  使用 ES6+ 13

1.5.6  括号 13

1.5.7 undefined  判断 14

1.5.8  条件判断和循环最多三层 14

1.5.9    this  的转换命名 14

1.5.10  慎用 console.log 14

二、  Vue  项目规范 14

(一) Vue  编码基础 14

2.1.1.  组件规范 15

2.1.2.  模板中使用简单的表达式 19

2.1.3  指令都使用缩写形式 19

2.1.4  标签顺序保持一致 20

2.1.5  必须为 v-for  设置键值 key 20

2.1.6 v-show  与 v-if  选择 20

2.1.7 script  标签内部结构顺序 20

2.1.8 Vue Router  规范 20

(二) Vue  项目目录规范 23

2.2.1  基础 23

2.2.2  使用 Vue-cli  脚手架 23

2.2.3   目录说明 23

2.2.4  注释说明 27

2.2.5  其他 27

前端代码规范

 

规范的目的是为了编写高质量的代码,让你的团队成员每天得心情都是愉悦的,大家在一起是快 乐的。

引 自《阿里规约》的开头片段:

- - -- 现代软件架构的复杂性需要协同开发完成,如何高效地协同呢?无规矩不成方圆,无规范难 以协同,比如,制订交通法规表面上是要限制行车权,实际上是保障公 众的人身安全,试想如果 没有限速,没有红绿灯,谁还敢上路行驶。对软件来说,适当的规范和 标准绝不是消灭代码内容  造性、优雅性,而是限制过度个性化,以一种普遍认可的统一方式一起做事,提升协作效率,  降低沟通成本。代码的字里行间流淌的是软件系统的血液,质量的提升 是尽可能少踩坑,杜绝踩 重复的坑,切实提升系统稳定性,码出质

一.编程规约

()     命名规范

 

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 ,此类随意缩写严重 降低了代码的可阅读性。

()     HTML  规范  (Vue Template  同样适用)

 

1.2.1 HTML 类型

 

推荐使用 HTML5  的文档类型申明:

(建 议使用 text/html   格 式 的 HTML 。 避 免使用 XHTML 。 XHTML   以及 它 的属 性 ,  比 如 application/xhtml+xml  在浏览器中的应用支持与优化空间都十分有限) 。

  规定字符编码

      IE  兼容模式

  规定字符编码

      doctype  大写

正例:

 

1 .2.2 缩进

 

缩进使用 2  个空格 ( 一个 tab) ;

嵌套的节点应该缩进。

 

1 .2.3  分块注释

 

在每一个块状元素,列表元素和表格元素后,加上一对 HTML  注释。

 

1.2.4 语义化标签

 

HTML5   中新增很多语义化标签,所以优先使用语义化标签,避免一个页面都是 div  或者 p  标 签。

正例

反例

 

1.2.5  引号

 

使用双引号(" ")  而不是单引号(’ ')   。

正例:<divclass=” box” >

反例:<divclass=’ box’>

 

()     CSS  规范

 

1 .3.1 命名

 

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

      id  采用驼峰式命名

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

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

不推荐:

推荐:

 

1 . 3.2 选择器

 

1)  css  选择器中避免使用标签名

 

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

2)   使用直接子选择器

 

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

不推荐:

推荐:

 

1. 3 .3 尽量使用缩写属性

 

不推荐:

推荐:

 

1. 3 .4 每个选择器及属性独占一行

 

不推荐:

推荐:

 

1 .3.5 省略 0 后面的单位

 

推荐:

 

1.3.6 避免使用 ID 选择器及全局标签选择器防止污染全局样式

 

不推荐:

推荐:

()     LESS  规范

 

1 .4.1 代码组织

 

1)   将公共 less 文件放置在 style/less/common 文件夹

 

例: // color.less,common.less

 

2)   按以下顺序组织

 

1 、@import;

2 、变量声明;

3 、样式声明;

 

1. 4 .2 避免嵌套层级过多

 

将嵌套深度限制在 3 级。对于超过 4 级的嵌套,给予重新评估。这可以避免出现过于详实的 CSS 选择器。避免大量的嵌套规则。当可读性受到影响时,将之打断。推荐避免出现多于 20 行的嵌 套规则出现。

不推荐:

 

()     Javascript  规范

 

1 .5.1 命名

 

1)   采用小写驼峰命名 lowerCamelCase,代码中的命名均不能以下划线,

也不能以下划线或美元符号结束

 

反例:name/name/name$

 

2)   方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase  风

格,必须遵从驼峰形式

 

正例:localValue/ getHttpMessage()/inputUserId

***** 其中 method  方法命名必须是 动词 或者 动词 + 名词 形式 *****

正例:saveShopCarData/openShopCarInfoDialog

反例:save/open/show/go

***** 特此说明,增删查改,详情统一使用如下 5  个单词,不得使用其他 ( 目的是为了统一各个端)

3)   常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,

不要嫌名字长

 

正例:  MAX_STOCK_COUNT

反例:MAX_COUNT

 

1 .5.2 代码格式

 

1)   使用 2  个空格进行缩进

 

正例:

 

2 )   不同逻辑、不同语义、不同业务的代码之间插入一个空行分隔开来以

提升可读性

 

说明:任何情形,没有必要插入多个空行进行隔开。

 

1 . 5.3  字符串

 

统一使用单引号(‘ ) ,不使用双引号(“ ) 。这在创建 HTML  字符串非常有好处:

正例:

反例:

1 .5.4 对象声明

 

1)   使用字面值创建对象

 

正例:  letuser={};

反例:letuser=newObject();

 

2)   使用字面量来代替对象构造器

 

正例:

反例:

 

1.5.5 使用 ES 6 +

 

必须优先使用 ES6+  中新增的语法糖和函数。这将简化你的程序,并让你的代码更加灵活和可复 用。比如箭头函数、await/async  ,  解构,  let  ,  for …of  等等。

 

1 .5.6 括号

 

下列关键字后必须有大括号(即使代码块的内容只有一行):if, else, for, while, do, switch, try, catch, finally, with。

正例:

反例:

 

1 . 5.7 undefined 判断

 

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

正例:

反例:

 

1.5.8 条件判断和循环最多三层

 

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

1.5.9   this  的转换命名

 

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

 

1.5.10 慎用 console . log

 

因 console.log  大量使用会有性能问题,所以在非 webpack  项目中谨慎使用 log  功能。

 

二、Vue 项目规范

 

()  Vue  编码基础

 

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

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

 

 

 

 

2 .1.1.  组件规范

 

1)   组件名为多个单词

 

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

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

正例:

反例:

 

2)   组件文件名为 pascal - case  格式

 

正例:

 

components/my-component.vue 
反例: 
components/myComponent.vueMyComponent.vue 
 3)   基础组件文件名为 base  开头, 正例: 使用完整单词而不是缩写
components/base-button.vue 

 

 

 

 

 

反例:

 

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

 

正例:

反例:

 

5)   在 Template  模版中使用组件,应使用 PascalCase  模式,并且使用

自闭合组件

 

正例:

反例:

 

6)   组件的 data  必须是一个函数

 

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

 

 

 

 

正例:

反例:

 

7)  Prop  定义应该尽量详细

 

  必须使用 camelCase  驼峰命名

  必须指定类型

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

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

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

正例:

 

 

 

 

 

8 )   为组件样式设置作用域

 

正例:

反例:

 

9)   如果特性元素较多,应该主动换行

 

正例:

反例:

<MyComponent foo="a"  bar=" b"  baz="c" foo="a"  bar=" b"  baz="c" foo="a"  bar="b"  baz="c" foo="a" bar=" b" baz="c"/>

 

 

 

 

2.1 . 2.  模板中使用简单的表达式

 

组件模板应该只包含简单的表达式,复杂的表达式则应该重构为计算属性或方法。复杂表达式会 让你的模板变得不那么声明式。我们应该尽量描述应该出现的是什么,而非如何计算那个值。而 且计算属性和方法使得代码可以重用。

正例:

反例:

 

2 . 1.3 指令都使用缩写形式

 

指令推荐都使用缩写形式,(用 :  表示 v-bind :  、用 @  表示 v-on:  和用 #  表示 v-slot :)

正例:

反例:

 

 

 

 

 

2 . 1.4 标签顺序保持一致

 

单文件组件应该总是让标签顺序保持为 `

正例:

反例:

 

2 .1.5 必须为 v - for 设置键值 key

 

2.1.6 v - show  与 v - if 选择

 

如果运行时,需要非常频繁地切换,使用 v-show  ;如果在运行时,条件很少改变,使用 v-if。

 

2 .1.7 script 标签内部结构顺序

 

name > components > mixins > props > data > computed > watch > filter >  钩子函数 (钩子函数按其 执行顺序)  > methods

2 . 1.8 Vue Router 规范

 

1)   页面跳转数据传递使用路由参数

 

页面跳转,例如 A  页面跳转到 B  页面,需要将 A  页面的数据传递到 B  页面,推荐使用 路由 参数进行传参,而不是将需要传递的数据保存 vuex ,然后在 B  页面取出 vuex  的数据,因为如 果在 B  页面刷新会导致 vuex  数据丢失,导致 B  页面无法正常显示数据。

 

 

 

 

正例:

 

2)   使用路由懒加载 (延迟加载) 机制

 

 

3)  router  中的命名规范

 

path 、childrenPoints  命名规范采用 kebab-case 命名规范 (尽量 vue 文件的目录结构保持一致, 因为目录、文件名都是 kebab-case ,这样很方便找到对应的文件)

name  命名规范采用 kebab-case 命名规范且和 component 组件名保持一致!  (因为要保持

keep-alive 特性,keep-alive 按照 component 的 name 进行缓存,所以两者必须高度保持一致)

 

 

 

 

 

4)  router  中的 path  命名规范

 

path 除了采用 kebab-case 命名规范以外,必须以 /  开头,即使是 children 里的 path 也要以 /  开 头。

目的:

经常有这样的场景:某个页面有问题,要立刻找到这个 vue 文件,如果不用以/开头,path 为 parent 和 children 组成的,可能经常需要在 router 文件里搜索多次才能找到,而如果以/开头,则能立

刻搜索到对应的组件。

 

 

 

 

 

()  Vue  项目目录规范

 

2 .2.1 基础

 

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

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

 

2.2.2 使用 Vue - cli 脚手架

 

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

 

2.2.3  目录说明

 

目录名按照上面的命名规范,其中 components  组件用大写驼峰,其余除 components  组件目

录外的所有目录均使用 kebab-case  命名。

 

 

 

 

 

1 )  api   目录

 

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

  此目录对应后端 API  接口,按照后端一个 controller  一个 api.js  文件。若项目较大时,可

以按照业务划分子目录,并与后端保持一致。

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

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

正例:

 

 

 

 

2 )  assets   目录

 

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

 

3)  components   目录

 

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

 

4)  constants   目录

 

此 目 录 存 放 项 目 所 有 常 量 ,  如 果 常 量 在  vue    中 使 用 ,  请 使 用  vue-enum   插 件

(www.npmjs.com/package/vue…)

 

 

 

 

 

5)  router  与 store   目录

 

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

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

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

 

6)  view s   目录

 

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

 

 

 

 

components  中组件要使用 PascalCase  规则

 

2.2.4 注释说明

 

整理必须加注释的地方

  公共组件使用说明

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

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

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

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

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

 

2 .2.5 其他

 

1)   尽量不要手动操作 DOM

 

因使用 vue  框架,所以在项目开发中尽量使用 vue  的数据驱动更新 DOM ,尽量 (不到万不得 已) 不要手动操作 DOM ,包括:增删改 dom  元素、以及更改样式、添加事件等。

2)   删除无用代码

 

因使用了 git/svn  等代码版本工具,对于无用代码必须及时删除,例如:一些调试的 console  语 句、无用的弃用功能代码。