美文网首页
前端编码规范篇

前端编码规范篇

作者: LI_4058 | 来源:发表于2019-04-17 12:03 被阅读0次

JS

[强制] 变量名使用有意义的英文单词组成,不得使用拼音

// bad
const xiangmuming = 'test'

// good
const projectName = 'test'

[强制] 类采用大驼峰式命名,方法、函数、变量使用小驼峰式命名

class Person {
  makeMoney(money){
    const computedMoney = money * 1000000;
  }
}

[强制] 常量使用大写单词加下划线

const MAX_THRESHOLD = 10

[强制] 私有方法或者属性使用下划线开头

class Person {
  constructor() {
    this._money = 0;
  }

  _getBalance() {
    return 0;
  }
}

[强制] 函数开头必须是有意义的动词或动词短语

[强制] 布尔值变量或者返回值为布尔值的函数使用 is、can、has、should 开头

const isTrue = true;
const hasEven = function() {}

[强制] 使用两个空格缩进

[强制] 变量尽量使用 const 定义,需要改变的变量使用 let,不要使用 var 定义变量

[强制] { 前不要换行

// bad
function f() 
{
  ...  
}

if () 
{
  ...
} 

// good
function f() {
  ...
}
if () {
  ...
}

[强制] 一元运算符与操作对象之间不允许有空格,二元操作符与操作对象之间必须有空格

// bad
const a = '1';
const b = + a;
const c = b ++;
const d = 1+2*3;

// good
const a = '1';
const b = +a;
const c = b++;
const d = 1 + 2 * 3;

[建议] 对同一变量的多种值进行判断时,可以将 if 语句、switch 语句改为使用对象

function f(a) {
  let b;
  ...
  if(a === 1) {
    b = c;
  } else if(a === 2) {
    b = d;
  } else if(a === 3) {
    b = e;
  } else {
    b = a;
  }
}

function f(a) {
  let b;
  ...
  switch (a) {
    case 1: 
      b = c; break;
    case 2: 
      b = d; break;
    case 3: 
      b = e; break;
    default:
      b = a; break;
  }
}

// better
function f(a) {
  let b;
  ...
  const map = {
    1: c,
    2: d,
    3: e,
    default: a
  };
  b = map[a] || map.default;
}

[强制] switch 语句不要穿透,case 后一定要跟 break,必须要有 default

[强制] 用作代码块起始的 { 前必须有空格

// bad
function f(){
  ...
}
if (){
  ...
}

// good
function f() {
  ...
}

if () {
  ...
}

[强制] if、else、for、while、function(非匿名函数)、switch、do、try、catch、finally 关键字后,必须有一个空格

if ()
else {}
while ()
for ()
function f(){}
const f = function() {}
switch () {}
do {}
try {} catch () {} finally {}

[强制] else、else if 不要换行

// bad
if() {
  ...
}
else {
  ...
}

// good
if() {
  ...
} else {
  ...
}

[强制] 函数不要过长,尽量控制在 60 行以内

[强制] 使用字面量来创建对象或者数组

//bad
const obj = new Object();
const arr = new Array(5);

// good
const obj = {};
const arr = [];

[强制] 对象和数组最后一项之后不允许有逗号

// bad
const obj = {
  a: 1,
  b: 2,
};

const arr = [1, 2,];

// good
const obj = {
  a: 1,
  b: 2
};

const arr = [1, 2];

[强制] 对象、数组、函数形参列表每项的逗号后面都要有空格

// bad
const arr = [1,2,3];
const obj = { a: 1,b: 2 };
function f(a,b,c) {
  ...
}
f(a,b,c);

// good
const arr = [1, 2, 3];
const obj = { a: 1, b: 2 };
function f(a, b, c) {
  ...
}
f(a, b, c);

[强制] 对象键后面不允许有空格,值前面要有空格

// bad
const obj = {
  a :1,
  b : 2
};

// good
const obj = {
  a: 1,
  b: 2
};

[强制] 写在一行时,对象的括号与键值对之间要有空格

// bad
const obj = {a: 1, b: 2};

// good
const obj = { a: 1, b: 2 };

[强制] 写在一行时,数组、对象的属性引用、函数形参列表与括号之间不允许有空格

// bad
const arr = [ 1, 2, 3 ];
const attr = obj[ 'test' ];
function f( a, b, c ) {
  ...
}
f( a, b, c );

// good
const arr = [1, 2, 3];
const attr = obj['test'];
function f(a, b, c) {
  ...
}
f(a, b, c);

[建议] 浅拷贝数组或者对象使用 ... 展开运算符

const a = [1, 2, 3];
const o = { a: 1, b: 2 };
const arr = a.slice();
const obj = Object.assign({}, o, { c: 3 });

// better
const arr = [...a];
const obj = { ...o, { c: 3 } };

[建议] 转换为数组时,可迭代对象使用 ... 展开运算符,不可迭代的类数组对象使用 Array.from

// 可迭代对象指可以使用 for...of 循环遍历的对象( 实现了Symbol.iterator 函数的对象 )
const arrLike = {
  0: 1,
  1: 2,
  length: 2
};
const s = new Set([1, 2, 3]);
const nodes = document.querySelectorAll('div');
const sets = [...s];
const nodesArr = [...nodes];
const arr = Array.from(arrLike);

[建议] 尽量使用数组的高级函数来遍历数组(map、filter…),对象使用Object.keys()、Object.values()、Object. entries () 生成的数组来进行遍历

const even = [1, 2, 3].filter(num => num%2 === 0);
const keys = Object.keys({ a: 1, b: 2 });
for (let key of keys) {
  ...
}

[强制] 不要使用关键字或者保留字作为函数形参名

// bad
function f(a, arguments) {
  ...
}

[强制] 使用剩余参数语法代替 arguments

// bad
function f(a) {
  const rest = Array.prototype.slice.call(arguments, 1);
  ...
}

// good
function f(a, ...rest) {
  ...
}

[强制] 使用函数的默认参数,默认参数在后面

// bad
function f(a) {
  a = a || 'default';
}

// good
function f(b, a = 'default') {
  ...
}

[强制] 使用解构赋值获取对象属性

// bad
const firstName = obj.firstName;
const lastName = obj.lastName;

// good
const { firstName, lastName } = obj;

[强制] 当一行过长时,适当换行,换行时运算符必须在行首,逗号不允许换行在行首

// bad
function f(
  aaaaaaaaaaaa
  , bbbbbbbbbbbb
  , cccccccccccc
) {
  if(
    aaaaaaaaaaa &&
    bbbbbbbbbbb &&
    ccccccccccc
  ) {
    const computed = aaaa + bbbb + ccccc +
      dddd + eeee;
    const larger = computed + 1000000000000 > 10000 ?
      10 : 20; 
  }
}

// good
function f(
  aaaaaaaaaaaa,
  bbbbbbbbbbbb,
  cccccccccccc
) {
  if(
    aaaaaaaaaaa 
    && bbbbbbbbbbb
    && ccccccccccc
  ) {
    const computed = aaaa + bbbb + ccccc 
      + dddd + eeee;
    const larger = computed + 1000000000000 > 10000 
      ? 10 : 20; 
  }
}

[强制] 在 if、else、for、do、while 语句中,即使只有一行,也不得省略块 {…}

// bad
if () a += 1;
for () a += 1;

// good
if () {
  a += 1;
}
for () {
  a += 1;
}

[强制] 字符串都必须使用单引号

// bad
const a = "test";

// good
const a = 'test';

[强制] 使用模板字符串代替字符串拼接

// bad
const str = 'test' + a;

// good
const str = `test${a}`;

[强制] 禁止使用链式赋值

// bad
let a = b = c = 10;

[强制] 禁止使用 ==、!=,使用 ===、!==

[强制] 基本类型检测使用 typeof,对象使用 instanceof,null、undefined使用 === 与自身判断

[强制] 三目运算符不允许嵌套

[强制] 多个逻辑运算符使用圆括号表明逻辑

// bad
const a = a && b || c && d;

// good
const a = (a && b) || (c && d);

[强制] 不要使用逻辑运算符控制代码执行

// bad
!a && b()

// good
if (!a) {
  b();
}

[强制] 使用 Number.isNaN 代替 isNaN

[强制] 使用 Math.floor 等方法将小数化整,不要使用 parseInt

[强制] parseInt 必须传第二个参数

[强制] 如果常量的意图不明显,使用变量命名常量

// bad
const average = total / 300;

// good
const fiveMinutes = 300;
const average = total / fiveMinutes;

[强制] 除非必要,否则使用箭头函数来绑定 this

[强制] import 语句后必须有分号

[强制] import 语句过长时,必须格式化

[强制] 非行首单行注释前必须空行,单行注释必须独占一行,不可以写在语句后面,双斜线后必须有空格

// bad
function f() {
  ...
  // comment
  const a = 1; // comment
}

// good
function f() {
  ...

  // comment
  const a = 1;
}

HTML

[强制] 使用两个空格缩进

[强制] 嵌套代码必须缩进

[强制] 特性使用双引号

<div class="test"></div>

[强制] 属性名小写,多个单词使用中划线 - 分隔

[强制] 不要在自闭合标签末尾使用反斜线

// bad
<img src="" />

// good
<img src="">

[强制] 特性声明顺序

class
id
name
data-*
src,  href,  type, value, for, max-length, max, min, pattern
placeholder, title, alt
required, readonly, disabled

[强制] boolean 类型特性不需要指定所取值

// bad
<input disabled="disabled">

// good
<input disabled>

[强制] 避免多余的父节点元素,减少文档中的元素数量

CSS

[强制] 使用两个空格缩进

[强制] 选择器、规则块起始花括号后要有空格

// bad
.test,.test1,test2{
  ...
}

.test>.test1 {
  ...
}

.test+.test1 {
  ...
}

.test~.test1 {
  ...
}

// good
.test, .test1, .test2 {
  ...
}

.test > .test1 {
  ...
}

.test + .test1 {
  ...
}

.test ~ .test1 {
  ...
}

[强制] 每个规则块后要有换行

// bad
.test {
  ...
}
.test1 {
  ...
}

// good
.test {
  ...
}

.test1 {
  ...
}

[强制] 需要使用引号的地方使用双引号

[强制] 使用 /* */ 注释

[强制] 规则声明顺序

布局类:box-sizing, display、float、position、left、top、right、bottom、overflow

盒模型类:width、height、margin、border、padding 等

文本类: font-*、line-height、text-align、word-wrap 等

显示类:color、background-*、transition、animation、list-style、opacity 等

[强制] 颜色使用十六进制小写,能简写必须简写,不允许使用具名颜色

[建议] font属性尽量不要使用属性简写

[强制] scss 中选择器嵌套不能超过 5 层

[建议] 当值为小于 1 的小数时,省略整数部分

transition: 0.5s   =>   transition: .5s

[强制] 长度为 0 时,省略单位

Vue

[强制] 组件名必须使用大驼峰式命名,引入组件时也必须使用大驼峰式命名引入

[强制] 单文件组件模板中使用中划线命名,当组件没有 slot 需要传入时,使用单闭合标签写法

<my-component />

[强制] 除了根实例,组件的 data 选项必须是函数,并且返回一个对象

[强制] prop 定义尽量详细

// bad
prop: ['count']

// better
prop: {
  count: Number
}

// better
prop: {
  count: {
    type: Number,
    required: true
  }
}

[强制] 模板中绑定 prop 使用中划线 - 分隔,定义时使用小驼峰式定义

// 定义
prop: {
  myProp: {
    type: Boolean,
    required: true
  }
}

// 绑定
<MyComponent :my-prop="true"/>

[强制] 不要传入复合 prop,尽量传入单值 prop

// bad
<MyComponent :my-props="{ count: 1, show: true }"/>

// good
<MyComponent :count="1" :show="true"/>

[强制] v-for 必须指定 key

[强烈建议] v-for 与 v-if 不允许同时出现,使用计算属性过滤数据 https://cn.vuejs.org/v2/style-guide/#%E9%81%BF%E5%85%8D-v-if-%E5%92%8C-v-for-%E7%94%A8%E5%9C%A8%E4%B8%80%E8%B5%B7-%E5%BF%85%E8%A6%81

[强制] 模板中,组件有多个特性或者绑定多个 prop、事件时,每个特性都需要换行

<MyComponent 
  :count="1"
  :show="true"
/>

[强制] 模板中不应该包含逻辑,逻辑放到计算属性或者方法中

[强制] 组件实例选项声明顺序

el
name
directives
filters
mixins
props
data
computed
watch
生命周期钩子函数
methods
template/render

[强制] 模板中特性声明顺序

is
v-for
v-if、v-else、vielse-if、v-show
v-once
class
id
ref、key、slot
v-model
其他特性
v-on
v-html、v-text

[强制] 单文件组件标签顺序:template、script、style

[强制] 不允许在子组件中更改父组件的状态

[强烈建议] 尽量不要在组件方法中进行 DOM 操作

[强制] 目录结构

+ build: webpack 相关
+ src
    + assets
        + css
        + img
        + js: 三方库、工具方法
    + components
    + router
    + store
        index.js
        actions.js: 全局 action
        mutations.js: 全局 mutation
        + modules
    + api
    + mixins
    + filters
    + directives
    App.vue
    main.js
.babelrc
pacaage.json
index.html

编辑器

推荐使用 Visual Studio Code

推荐插件:
Auto Rename Tag
Bracket Pair Colorizer
Chinese(Simplified)
Javascript(ES6) code snippets
open in browser
Prettier
Vetur

相关文章

  • 前端开发规范(实验室版)

    前端编码规范—— HTML 篇 前端编码规范—— CSS 篇 前端编码规范—— JavaScript 篇 这几天和...

  • 前端编码规范篇

    JS [强制] 变量名使用有意义的英文单词组成,不得使用拼音 [强制] 类采用大驼峰式命名,方法、函数、变量使用小...

  • 雷铭大前端组件库

    雷铭大前端组件库 包含《雷铭前端开发规范》、《雷铭Android编码规范》、《雷铭iOS编码规范》以及不同技术分类...

  • 前端编码规范

    前端编码规范参考链接 go!!

  • Eslint搭建及使用

    内容 本文将讲解如何在 VSCode 中配合 ESLint 扩展来实践团队内部的前端编码规范。 前端编码规范 ES...

  • 我的前端规范——CSS篇

    相关文章 博客原文我的前端规范——开篇我的前端规范——HTML篇我的前端规范——CSS篇我的前端规范——JavaS...

  • 我的前端规范——HTML篇

    相关文章 博客原文我的前端规范——开篇我的前端规范——HTML篇我的前端规范——CSS篇我的前端规范——JavaS...

  • 我的前端规范——JavaScript篇

    相关文章 博客原文我的前端规范——开篇我的前端规范——HTML篇我的前端规范——CSS篇我的前端规范——JavaS...

  • 我的前端规范——开篇

    相关文章 博客原文我的前端规范——开篇我的前端规范——HTML篇我的前端规范——CSS篇我的前端规范——JavaS...

  • 无标题文章

    # CSS 编码规范 此为前端开发团队遵循和约定的 CSS 编码规范,意在提高代码的规范性和可维护性。 ## 代码...

网友评论

      本文标题:前端编码规范篇

      本文链接:https://www.haomeiwen.com/subject/mzwgwqtx.html