Vue相关项目需要强制使用ESlint做代码规范检查,在使用vue-cli创建项目时,选择standard规范,并且开启fix修复功能。
chainWebpack: (config) => { config.module.rule('eslint').use('eslint-loader') .loader('eslint-loader') .tap(options => { options.fix = true return options; }) }
项目开发
前端项目一般会使用git版本控制系统,前后端分离的项目,前端代码会跟服务端代码分开存放。提交测试服或发布正式服的时候,前端将代码编译打包后,默认生成dist文件夹,只将此文件夹上传至后端。
由于网段限制,前端的工程中一般会附带node_modules.7z的依赖压缩包,直接解压出来使用,不需要再通过npm下载,更新依赖后,也需要同步更新node_modules.7z并提交。
所以如果在某些场景下不方便安装node-sass的话,可以使用dart-sass替代。
项目开发前需要向需求方确认好浏览器版本的兼容情况,移动端需要支持到Android和iOS什么版本,是否使用的是软件自带的浏览器,内置浏览器版本是多少。
前端开发在写代码或者使用高级css功能的时候多去MDN上面查一查兼容性的问题,不能想当然地觉得这个代码特性没有兼容性问题。
项目文档
前端项目的说明,需要写道readme.md里面去,包括需要装说明软件环境,执行什么命令,配置什么host,如何打包发布。要达到的目的是,接触项目的人看这个readme就能把前端项目跑起来。
所有的项目必须有完善的readme文档说明,文档内容不做限制,除了一些必要的说明,如:如何启动项目、发版说明,只要能让开发者更好的理解项目的内容都可以加上。
前端校验
前端对所有需要用户进行输入的地方做数据校验,如检查输入长度限制、内容合法限制、xss问题等。校验规则需要跟后端一致,不合法时提示明确的错误信息。
网站字体使用
网站所使用的字体统一设置为:
font-family: PingFangSC, 微软雅黑,Helvetica,Arial,sans-serif;
禁止使用 @font-face 引用其他未被授权的中英文字体,开源免费的字体图标除外。
第三方库使用
使用第三方库时,如果只是用到了其中的少部分功能,需要注意队报进行按需加载,减少依赖体积。
例如在使用element-ui时,在main.js中
全局引入:
import ElementUI from 'element-ui'; Vue.use(ElementUI);
按需引入:
import { Button, Select } from 'element-ui'; Vue.use(Button); Vue.use(Select);
具体引入方式可以参照element-ui官方文档。
Vue相关
Vue项目开发规范参考,Vue官方风格指南
https://cn.vuejs.org/v2/style-guide/index.html
在需要使用Vue的render函数时候,都应该使用JSX语法,不应该直接编写h(createElement)函数,统一语法,并且便于他人维护。
vue变量修改
对于数组或对象类型的数据,不能直接修改其中的元素和属性来达到触发变化的目的,需要对修改的变量复制一个副本,对副本进行修改后,复制给需要触发变化的变量中。
vue组件内的css
css规则(建议使用 css-modules 或者 BEM 命名规则(Bem 是块(block)、元素(element)、修饰符(modifier)的简写)避免样式冲突,不使用 scoped ),除非是单独的封装组件。
css-modules使用示例:
<template> <div class="home"> <div class="item">{{ count }}</div> </div> </template> <style lang="scss"> .home { .item { color: red; } } </style>
BEM 命名约定的模式是:
.block {} .block__element {} .block--modifier {}
block
代表了更高级别的抽象或组件。block__element
代表 .block 的后代,用于形成一个完整的 .block 的整体。block--modifier
代表 .block 的不同状态或不同版本。 使用两个连字符和下划线而不是一个,是为了让你自己的块可以用单个连字符来界定。如:.sub-block__element {} .sub-block--modifier {}
BEM命名法的好处:BEM的关键是,可以获得更多的描述和更加清晰的结构,从其名字可以知道某个标记的含义。于是,通过查看 HTML 代码中的 class 属性,就能知道元素之间的关联。
<div class="article"> <div class="article__body"> <div class="tag"></div> <button class="article__button--primary"></button> <button class="article__button--success"></button> </div> </div>
v-for key的设置
不能使用index来作为key的值,必须是v-for中迭代列表中的唯一值,key的作用主要是为了高效的更新虚拟DOM。添加key之后,列表数据修改的时候,vue会去根据key值判断某个值是否修改,如果修改,则重新渲染,否则复用之前的元素。在列表中间插入一条数据时,如果使用index作为key,则vue判定插入位置到最后数据全部发生了变化,全部需要重新渲染,而如果使用唯一id作为key,则判定只有插入的一条数据发生变化,只需要渲染这一条数据。
路由划分
路由应该按照业务来划分 ,根据实际场景考虑是否按需加载页面,按需加载使用 import() 引入对应的路由组件,同时也要考虑打包形成后 chunk 的情况,chunk 太小且数量较多会导致chunk内webpack-runtime代码量增加,导致整个打包后文件体积增大,这个时候使用一种魔法注释用法
const Foo = () => import(/* webpackChunkName: "group-foo" */ './Foo.vue')
就可以把某个路由下的所有组件都打包在同个异步块 (chunk) 中。只需要使用 命名 chunk,一个特殊的注释语法来提供 chunk name (需要 Webpack > 2.4)。
AJAX请求
发起ajax请求的 url 应该写于业务代码中,而非另开js文件进行管理。不恰当的工程化只会让代码难以维护。
1、axios.get('/test') // yes 2、axios.get(Apis.test.get) // no
公用方法
当出现重复函数时,如果该部分代码无副作用且可分离,可以考虑将其抽离出来放到单独的文件中统一管理,例如helpers、utils。谨慎使用mixins,因其来源不清晰,会极大增加后期维护成本。
git提交规范
提交代码前,对自己修改的文件进行一次检查,只对自己修改的内容进行提交,不要提交多余的文件。
css规范
缩进:使用两个空格;
分号:每个属性声明末尾都要加上分号;
空格:
不需要空格:属性名后、多个规则的分隔符 ',' 前、!important '!' 后、属性值中 '(' 后和 ')' 前、行末不要有多余的空格。
需要空格:属性值前、选择器 '>', '+', '~' 前后、'{' 前、!important '!' 前、@else前后、属性值中的 ',' 后、注释斜杠前后。
需要空行:文件最后、'}' 后最好跟一个空行,包括scss中嵌套的规则、属性之间需要适当的空行。
换行:‘{’ 前不需要换行
需要换行:'{' 后和 '}' 前、每个属性单独占一行、多个规则的分隔符 ',' 后。
命名:类名使用小写字母,以中划线分割、id采用驼峰式命名、scss中的变量、混合、placeholder采用驼峰式命名。
杂项:
不允许有空的规则;
元素选择器用小写字母;
去掉小数点前买的0;
去掉数字中不必要的小数点和后面的0;
属性值 '0' 后面不要加单位;
同个属性不同前缀的写法需要在垂直方向保持对齐;
无前缀的标准属性应该写在有前缀的属性后面;
不要在同个规则里面出现重复的属性,如果重复的属性是连续的则没有关系;
不要再一个文件里出现两个相同的规则;
用 border: 0; 代替 border: none;
选择器不要超过四层(在scss中如果超过四层应该考虑用嵌套的方式来写);
尽量少用 ' * ' 选择器;
html
语法
缩进:两个空格;
嵌套的节点要进行缩进;
在属性上 ,使用双括号,不要使用单括号;
属性名全小写,用中划线做分隔符;
不要在自动闭合标签结尾处使用斜线(HTML5 规范 指出他们是可选的);
不要忽略可选的关闭标签
HTML5 doctype
在页面开头使用这个简单的doctype来启用标准模式,使其在每个浏览器中尽可能一致的展示;虽然doctype不区分大小写,但是按照惯例,doctype大写(关于html属性,大写还是小写)。
<!DOCTYPE html> <html> ... </html>
lang属性
根据html5规范:应在html标签上加上lang属性,这会给语音工具和翻译工具帮助,告诉它们应该怎么去发音和翻译。
<!DOCTYPE html> <html lang="zh-cn"> ... </html>
字符编码
通过声明一个明确的字符编码,让浏览器轻松、快速的确定适合网页内容的渲染方式,通常指定为 'UTF-8'。
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> </head> ... </html>
IE兼容模式
用标签可以指定页面应该用什么版本的IE来渲染,不同doctype在不同浏览器下会触发不同的渲染模式
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8" http-equiv="X-UA-Compatible" content="IE=Edge"> </head> ... </html>
引入css、js
根据HTML5规范,通常在引入css和js时不需要指明 type,因为 text/css 和 text/javascript 分别是他们的默认值。
属性顺序
为保证代码易读性,属性应按照特定的顺序出现。
- class
- id
- name
- data-*
- src, for, type, href, value, max-length, max, min, pattern
- placeholder, title, alt
- aria-*, role
- required, readonly, disabled
class 是为高可复用组件设计的,所以应处于第一位;
id 更加具体且应该尽量少使用,所以应该放在第二位;
Boolean属性
Boolean属性指不需要声明取值的属性,xhtml需要每个属性声明取值,但HTML5并不需要;
<input type="text" disabled> <input type="checkbox" value="1" checked> <select> <option value="1" selected></option> </select>
js生成标签
在js文件中生成标签让内容变得更加难查找,更难编辑,性能更差。应该尽量避免这种情况的出现。
减少标签数量
在编写HTML代码时,需要尽量避免多余的父节点;很多时候,需要通过迭代和重构来使HTML变得更少。
js规范
使用standard规范 https://github.com/standard/standard
对应编辑器的配置方法查看上面的 github 链接
一般情况下前端项目工程中会使用ESLint进行JS代码的规范,如果是.js文件可以支持自动修改规范的功能,.vue 文件由于编译原因无法支持。掌握本规范的最好方法是安装并在自己的代码中使用它。