您所在的位置:首页 / 知识分享

Vue 开发规范

2020.09.02

1537

Vue 开发规范

开启 ESLint

  • 前广泛使用的有三种有google标准、airbnb标准、standard标准
  • 安装
    • 用 vue 脚手架初始化文件时,通过 vue-cli 的问答初始化 ESLint 的配置(推荐)
  • 自动修复
    • 简单的代码风格 eslint 可以直接修复,比如我们希望 eslint 修复 src 文件夹下的 js 文件,那么在 package.json 中添加一条自定义命令
安装eslint模块
`$ npm install eslint --save-dev`
 复制代码# 添加eslint修复命令
"lint-fix": "eslint --fix --ext .js src/" 复制代码
  • 执行npm run lint-fix将自动修复。无法修复的将在控制台给出提示。

git 预检查

  • 原则上每次git commit前我们都需要先执行一下 lint-fix命令的,避免遗忘或者偷懒,我们使用预检查工具进行处理。

  • husky 是一个 npm 模块,可以在 git 提交前做拦截,如果拦截返回异常信息,将取消提交。

  • 安装husky

    $ npm install husky --save-dev 复制代码
    • 添加拦截事件precommit
    # package.json
      "precommit": "npm run lint-fix" 复制代码
    • 在提交前自动执行 eslint 修复命令,如果成功全部修复就可以正常提交,如果没有全部修复,将取消提交。

使用Babel

  • 我们的 javascript 代码中经常会写 ES6 代码,而这些代码在旧版本浏览器上是不被识别的,需要转换成 ES5。
  • 在项目根目录创建 .babelrc 文件
/* 根目录 .babelrc 文件 */
{
  // 此项指明,转码的规则
  "presets": [
    // env项是借助插件babel-preset-env,下面这个配置说的是babel对es6,es7,es8进行转码,并且设置amd,commonjs这样的模块化文件,不进行转码
    ["env", {
      "modules": false,
      "targets": {
        "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
      }
    }],
    // 下面这个是不同阶段出现的es语法,包含不同的转码插件
    "stage-2"
  ],
  // 下面这个选项是引用插件来处理代码的转换,transform-runtime用来处理全局函数和优化babel编译
  "plugins": ["transform-vue-jsx", "transform-runtime"],
  // 下面指的是在生成的文件中,保留注释
  "comments": true,
  // 下面这段是在特定的环境中所执行的转码规则,当环境变量是下面的test就会覆盖上面的设置
  "env": {
    "test": {
      "presets": ["env", "stage-2"],
      "plugins": ["transform-vue-jsx", "istanbul"]
    }
  }
} 复制代码
  • 使用 babel-polyfill 兼容 ES6
  1. 安装 $ npm install babel-polyfill --save-dev
  2. 找到 webpack.base.conf.js(基础配置,全局生效) 文件,修改入口如下
module.exports = {
  entry: {
      app: ['babel-polyfill', './src/main.js'],
  },
} 复制代码

结构化规范(webpack)

├── index.html                      入口页面
   ├── favicon.ico                     页面图标
   ├── .babelrc                        babel规则
   ├── .editorconfig                   编辑器配置
   ├── .eslintignore                   eslint忽略规律
   ├── .eslintrc.js                    eslint规则
   ├── .gitignore                      git忽略规则
   ├── build                           构建脚本目录
   │   ├── build-server.js                 运行本地构建服务器,可以访问构后的页面
   │   ├── build.js                        生产环境构建脚本
   │   ├── dev-client.js                   开发服务器热重载脚本,主要用来实现开发阶段的页面自动刷新
   │   ├── dev-server.js                   运行本地开发服务器
   │   ├── utils.js                        构建相关工具方法
   │   ├── webpack.base.conf.js            wabpack基础配置
   │   ├── webpack.dev.conf.js             wabpack开发环境配置
   │   └── webpack.prod.conf.js            wabpack生产环境配置
   │   └── webpack.cdn.conf.js             wabpack cdn配置
   │   └── webpack.dll.conf.js             wabpack dll配置
   ├── config                          项目配置
   │   ├── dev.env.js                      开发环境变量
   │   ├── index.js                        项目配置文件
   │   ├── prod.env.js                     生产环境变量
   │   └── test.env.js                     测试环境变量
   ├── mock                            mock数据目录
   │   └── hello.js
   ├── package.json                    npm包配置文件,里面定义了项目的npm脚本,依赖包等信息
   ├── readmd.md                       项目描述文件
   ├── src                                项目源码目录
   │   ├── main.js                            入口js文件
   │   ├── App.vue                            根组件
   │   ├── components                         公共组件目录
   │   │   └── title.vue
   │   ├── assets                         静态资源目录,这里的资源会被wabpack构建
   │   │   ├── css                            公共样式文件目录
   │   │   ├── js                             公共js文件目录(如帮助方法)
   │   │   └── img                            图片存放目录
   |   |── lib                            外部引用的插件存放及修改文件
   |   |—— datas                          模拟数据,临时存放
   │   ├── routes                         前端路由
   │   │   └── index.js
   │   ├── api                            接口,统一管理
   │   │   └── index.js
   │   ├── store                          vuex, 统一管理
   │   │   └── index.js
   │   └── views                          视图模块名
   │       ├── hello.vue
   │       └── notfound.vue
   ├── static                             纯静态资源,不会被wabpack构建。
   └── test                               测试文件目录(unit&e2e)
       └── unit                               单元测试
           ├── index.js                           入口脚本
           ├── karma.conf.js                      karma配置文件
           └── specs                           单测case目录
               └── Hello.spec.js 复制代码

vue 文件

基本结构

<template> <div></div> </template> <script> export default { components: {},
    data() { return {};
    }, methods: {},
    mounted() {}
  }; </script> <!-- 声明语言,并且添加scoped --> <style lang="less" scoped></style> 复制代码

vue 文件方法声明顺序

- components
- props
- data
- computed
- created
- mounted
- activited
- update
- beforeRouteUpdate
- metods
- watch 复制代码

标签属性自动换行

  • 对除第一个属性外的其他每个属性进行换行,并保持对齐
<!-- 推荐 --> <a :href="item.onestore_url" target="_blank" @click="goToDownload()"> <img src="../images/one_downloadbadge_red_black.png" alt="download-icon"> </a> <!-- 不推荐 --> <a :href="item.onestore_url" target="_blank" @click="goToDownload()"> <img src="../images/one_downloadbadge_red_black.png" alt=""> </a> 复制代码

组件命名规范

  • 组件名应该始终是多个单词的,根组件 App 除外

  • 有意义的名词、简短、具有可读性

  • 命名遵循 PascalCase(单词首字母大写命名) 约定

  • 公用组件以 Abcd (公司名缩写简称) 开头,如(AbcdDatePicker,AbcdTable)

  • 页面内部组件以组件模块名简写为开头,Item 为结尾,如(StaffBenchToChargeItem,StaffBenchAppNotArrItem)

  • 使用遵循 kebab-case(短横线分隔命名) 约定

  • 在页面中使用组件需要前后闭合,并以短线分隔,如(,)

  • 导入及注册组件时,遵循 PascalCase(单词首字母大写命名) 约定

  • 同时还需要注意:必须符合自定义元素规范: 切勿使用保留字

props 命名规范

  • 在声明 prop 的时候,其命名应该始终使用 camelCase,而在模板中应该始终使用 kebab-case
<!-- 推荐 --> <script> props: { greetingText: String;
  } </script> <welcome-message greeting-text="hi"></welcome-message> <!-- 不推荐 --> <script> props: { 'greeting-text': String } </script> <welcome-message greetingText="hi"></welcome-message> 复制代码

注释规范

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

1.公共组件使用说明
2.各组件中重要函数或者类说明
3.复杂的业务逻辑处理说明
4.特殊情况的代码处理说明,对于代码中特殊用途的变量、存在临界值、函数中使用的hack、使用了某种算法或思路等需要进行注释描述
5.注释块必须以/**(至少两个星号)开头**/;
6.单行注释使用//;
7.多重 if 判断语句 复制代码

编码规范

使用 ES6 风格编码源码

  • 定义变量使用 let ,定义常量使用 const
  • 静态字符串一律使用单引号或反引号,动态字符串使用反引号
// 推荐js
const a = 'foobar';
const b = `foo${a}bar`;
const c = 'foobar';

// 不推荐
const a = 'foobar';
const b = 'foo' + a + 'bar'; 复制代码

解构赋值

// 数组解构赋值 const arr = [1, 2, 3, 4]; // 推荐 const [first, second] = arr; // 不推荐 const first = arr[0]; const second = arr[1]; // 对象解构赋值 // 推荐 function getFullName(obj) { const { firstName, lastName } = obj;
} // best function getFullName({ firstName, lastName }) {} // 不推荐 function getFullName(user) { const firstName = user.firstName; const lastName = user.lastName;
} 复制代码

拷贝数组

- 使用扩展运算符(...)拷贝数组。
```js
  const items = [1, 2, 3, 4, 5];
  // 推荐
  const itemsCopy = [...items];
  // 不推荐
  const itemsCopy = items;
``` 复制代码

箭头函数

  • 需要使用函数表达式的场合,尽量用箭头函数代替。因为这样更简洁,而且绑定了 this
    // 推荐 const boundMethod = (...params) => method.apply(this, params); // 不推荐 const self = this; const boundMethod = function(...params) { return method.apply(self, params);
          }; 复制代码

模块

  • 如果模块只有一个输出值,就使用 export default,如果模块有多个输出值,就不使用 export default,export default 与普通的 export 不要同时使用

    // 推荐 import myObject from './importModule'; // 不推荐 import * as myObject from './importModule'; 复制代码
  • 如果模块默认输出一个函数,函数名的首字母应该小写

    function makeStyleGuide() {} export default makeStyleGuide; ``` 复制代码
  • 如果模块默认输出一个对象,对象名的首字母应该大写

    const StyleGuide = { es6: {}
      }; export default StyleGuide; 复制代码

指令规范

指令有缩写一律采用缩写形式

// 推荐
:class="{'show-left':true}"
@click="getListData"

// 不推荐
v-bind:class="{'show-left':true}"
v-on:click="getListData" 复制代码

v-for 循环必须加上 key 属性,在整个 for 循环中 key 需要唯一

<!-- 推荐 -->
<ul>
  <li v-for="todo in todos" :key="todo.id">
    {{ todo.text }}
  </li>
</ul>

<!-- 不推荐 -->
<ul>
  <li v-for="todo in todos">
    {{ todo.text }}
  </li>
</ul> 复制代码

Props 规范

  • 组件 props 原子化
  • 提供默认值
  • 使用 type 属性校验类型
  • 使用 props 之前先检查该 prop 是否存在
// bad 这样做只有开发原型系统时可以接受
props: ['status']

// good
props: {
  status: {
    type: String,
    required: true,
    validator: function (value) {
      return [
        'syncing',
        'synced',
        'version-conflict',
        'error'
      ].indexOf(value) !== -1
    }
  }
} 复制代码

其他

  • 避免 this.$parent
  • 调试信息 console.log() debugger 使用完及时删除
  • 除了三目运算,if,else 等禁止简写
// bad
if (true) alert(name);
console.log(name);

// good
if (true) {
  alert(name);
}
console.log(name); 复制代码
  • 全局变量的位置
    • 如无特殊情况,变量统一放到 data 内,避免组件重用时代码不被执行
      // 推荐
        export default {
          data() {
            return {
              today: new Date()
            };
          }
        };
      // 不推荐
      const today = new Date();
      export default {
        data() {
          return {
            t: today
          };
        }
      }; 复制代码

相关新闻

小程序用户登录如何做?

2018.10.02

5202

哪些信息是敏感信息呢? 手机号, openId, unionId, 可以看出这些值都可以唯一定位一个用户, 而昵称, 头像这些不能定位用户的都不是敏感信息

从ES6到ES10的新特性万字大总结(不得不收藏)

2019.12.19

1392

ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会)在标准ECMA-262中定义的脚本语言规范。这种语言在万维网上应用广泛,它往往被称为JavaScript或JScript,但实际上后两者是ECMA-262标准的实现和扩展。