项目开发规范--前端
通用规范
基本原则:
编译器统一设置编码为UTF-8;换行符为LF。
源文件编码格式(包括注释)必须是 UTF-8
命名必须使用英文单词,不可出现拼音
命名缩写,行业约定俗称的缩写可以直接使用
命名缩写时,要么全大写要么全小写。
命名太长(超过20)可考虑缩写,可采用去掉元音字母的方法来缩写
不可用注释来记录修改日志,不可用注释来保留废弃代码。
一个目录下文件数之和不要超过 25
文件长度不超过1000行
每行代码不超过80个字符,除了一些特殊情况,如:URL、shell 命令、导入模块名,其他任何超出此限制的行都应该被换行。
方法长度不超过80 行
圈复杂度不超过 20
圈复杂度数量上表现为覆盖所有代码的独立现行路径条数。为了代码的可读性,圈复杂度建 议不要超过 20。
块语句的最大嵌套深度不要超过 4 层
命名方法说明:
驼峰:除首字母外,每个单词的首字母大写,其他字母小写的。
大驼峰:首字母大写的驼峰命名法。例如 MyName
小驼峰:首字母小写的驼峰命名法。例如 myName
短横线分隔命名法:单词全小写,单词间使用短横线分割。例如:my-name
HTML编码规范
1. 命名
目录和文件
使用短横线分隔命名法
login-time.html
HTML标签名、类名、id名、标签属性
使用短横线分隔命名法
<a href="/">Home</a> <div class="demo"></div> <a href="#" style="color:red;" rel="nofollow">只能使用"内联"方式</a>
2. 代码风格
使用HTML5文档声明
<!DOCTYPE html>
页面语言LANG
<html lang="zh-CN">
编码
UTF-8
<meta charset="UTF-8">
缩进
使用2个空格,嵌套的节点应该缩进
<ul><li>111</li> </ul>
元素属性值使用双引号
<div class="app-container"></div>
标签
所有标签都需要开始和结束标签,且空元素标签都不加"/"字符
<div><h1>我是h1标题</h1><p>我是一段文字,我有始有终,浏览器能正确解析</p> </div><br>
3. 注释
单行注释
在每一个块状元素,列元素和表格元素后,加一对HTML注释。
<body><!-- 注释 --><header><div class="container"><a href="#"><!-- 图片会把a标签给撑开,所以不用设置a标签的大小 --><img src="data:images/header.jpg" /></a></div></header> </body>
多行注释
多行注释时,采用两个单行注释包围代码。格式如下:
<!-- Comment Text A Begin --> <div class="mod_a">... </div> <!-- Comment Text A End -->
TODO
使用TODO来标记待做的事情,便于后期搜索
在TODO后面添加姓名来表示分类
<!-- TODO(yuliwen): remove duplicate tag --> <p><span>2</span></p>
CSS编码规范
1. 命名
目录和文件
采用短横线分隔命名法
man-style.css
选择器、属性名
采用短横线分隔命名法
.abc-a1 {display-man: block;man-width: 50px; }
2. 代码风格
文件组织顺序
必须写上 @charset 规则,并且一定要在样式文件的第一行首个字符位置开始写,编码名用 “UTF-8”
@charset "UTF-8";.abc {}
格式化
统一使用展开格式书写样式
.abc {display: block;width: 50px; }
缩进
两个空格
分号
使用分号结束单个属性的定义
.test {display: block;height: 100px; }
进制的颜色值表示
尽可能使用6个字符的16进制颜色值
color: #337ab7;
空格
属性和属性值间空一格;选择器和{
中间空一格。
.abc { width: 100%; }
空行
两个选择器间空一行
.abc {color: #337ab7; }.acd {color: #337ac7; }
属性值引号
css属性值需要用到引号时,统一使用单引号
/* 推荐 */ .abc { font-family: 'Hiragino Sans GB'; }
多选择器
多个选择器之间以行分割
h1, h2, h3 {line-height: 30px; }
3. 注释
单行注释
/* html标签为统一使用的标签 */ html {background: #fff; }
多行注释
/* * 具体描述 */ body {margin: auto;width: 50%; }
文件注释
@charset "UTF-8";/*** 具体描述* @author lwx* @date 2015-10-10*/
TODO
使用一行注释来描述TODO
/* TODO body的还需要重新优化调整 */ body {margin: auto;width: 50%; }
SCSS编码规范
Sass 是一个 CSS 预处理器,Sass 是 CSS 扩展语言,可以帮助我们减少 CSS 重复的代码,节省开发时间。Sass 文件后缀为 .scss。
1. 命名
目录和文件
短横线分隔命名法
man-style.scss
选择器、属性名
采用短横线分隔命名法
.abc-a1 {display-man: block;man-width: 50px; }
变量
以$
开头,后面使用小驼峰命名法
$myFont: Helvetica, sans-serif; $myColor: red; $myFontSize: 18px; $myWidth: 680px;
2. 代码风格
遵循CSS的代码风格
文件组织顺序
必须写上 @charset 规则,并且一定要在样式文件的第一行首个字符位置开始写,编码名用 “UTF-8”
@charset
@import
变量声明
样式声明
@charset "UTF-8"; @import "mixins/size.less";$default-text-color: #333;.page {$border-width:1px;width: 960px;margin: 0 auto;border: $border-width solid $default-text-color; }
格式化
统一使用展开格式书写样式,不可写在一行。
.abc {display: block;width: 50px; }
缩进
两个空格
分号
使用分号结束单个属性的定义
.test {display: block;height: 100px; }
进制的颜色值表示
尽可能使用6个字符的16进制颜色值
color: #337ab7;
空格
属性和属性值间空一格;选择器和{
中间空一格。
.abc { width: 100%; }
空行
两个选择器间空一行
.abc {color: #337ab7; }.acd {color: #337ac7; }
属性值引号
css属性值需要用到引号时,统一使用单引号
/* 推荐 */ .abc { font-family: 'Hiragino Sans GB'; }
多选择器
多个选择器之间以行分割
h1, h2, h3 {line-height: 30px; }
3. 注释
与CSS规范保持一致。
单行注释
/* html标签为统一使用的标签 */ html {background: #fff; }
多行注释
/* * 具体描述 */ body {margin: auto;width: 50%; }
文件注释
@charset "UTF-8";/*** 具体描述* @author lwx* @date 2015-10-10*/
TODO
使用一行注释来描述TODO
/* TODO body的还需要重新优化调整 */ body {margin: auto;width: 50%; }
4. SCSS嵌套顺序
当前选择器的样式属性
父级选择器的伪类选择器 (:first-letter, :hover, :active etc)
伪类元素 (::before, ::after, ::first-line)
父级选择器的声明样式 (.selected, .active, .enlarged etc.)
用 SCSS的上下文媒体查询
子选择器作为最后的部分
.product-teaser {// 1. 当前选择器的样式属性display: inline-block;background-color: whitesmoke;color: grey;// 2. 父级选择器的伪类选择器&:hover {color: black;}// 3. 带有父选择器的伪元素&::before {content: "";display: block;border-top: 1px solid grey;}&::after {content: "";display: block;border-top: 1px solid grey;}// 4. 用父选择器声明类&.active {background-color: pink;color: red;// 4.2. 状态类中的伪类选择器&:hover {color: darkred;}}// 5. 用 SCSS的上下文媒体查询@media screen and (max-width: 640px) {display: block;font-size: 2em;}// 6. 子选择器> .content > .title {font-size: 1.2em;// 6.5. 上下文媒体查询在子选择器@media screen and (max-width: 640px) {letter-spacing: 0.2em;text-transform: uppercase;}} }
JavaScript编码规范
1. 命名
目录
短横线分隔命名法
log-manage
文件
短横线分隔命名法
monitor-task.js
类、构造函数
大驼峰命名法
function MyClass() {} const myClass = new MyClass();
方法
方法的命名用动词、动宾结构,并遵循小驼峰命名法。
get + 非布尔属性名()
is + 布尔属性名()
set + 属性名()
has + 名词/形容词()
add + 名词()
delete + 名词()
update + 名词()
动词()
动词 + 宾语()
function getType() {} function isFinished() {} function setVisible() {} function draw() {} function addKeyListener(listener) {}
变量、类属性、方法参数
小驼峰命名法
const firstName = 'xiaoming';
注意:当使用逻辑非运算符,并出现双重否定时,会出现理解问题。如:!isNotError 意味着什么, 不是很直白。布尔型的局部变量建议加上表达是非意义的前缀,包括常用的 is,也可以是 has、can、 should 等。
const isError = false; const isFound = false; const hasLicense = false; const canEvaluate = false; const shouldAbort = false
私有属性、私有方法
以下划线 "_" 开头,并遵循小驼峰命名法。
class Foo {constructor() {// 私有属性this._bar = computeBar();// 不是私有属性,可以通过实例访问this.baz = computeBaz();} }
临时变量
作用域不大的临时的变量可以简写,比如:str,num,bol,obj,fun,arr
循环变量可以简写,比如:i,j,k 等。
常量
全大写,单词以下划线分隔
const HOTEL_GET_URL = 'http://map.baidu.com/detail'; const MAX_USER_NUM = 200; const APPLICATION_NAME = 'Launcher';
2. 注释
注释应该是解释代码的意图,而不是描述代码怎么做
需要注释的地方
类说明
方法说明
变量、属性说明
复杂的业务逻辑处理说明
复杂代码逻辑处理说明
单行注释
单行注释 // 后先跟一个空格再跟具体内容。
// 姓名 let name = '上官'
类、组件注释
使用 /** */
/*** 组件或类描述* @author 组件作者* @date 2017年12月05日17:22:43* @example 调用示例* <hbTable :title="title" :columns="columns" :tableData="tableData"></hbTable> */
方法注释
使用 /** */
/*** 方法描述名称* @param {Object} [title] - 参数说明* @param {String} [columns] - 参数说明* @example 调用示例* <hbTable :title="title" :columns="columns" :tableData="tableData"></hbTable> */
多行注释
使用/* */
/* xxxx begin */ 代码 /* xxxx end */
TODO
使用 // TODO
// TODO 该方法具体实现 function getUserName(){}
3. 代码风格
使用ESLint默认风格进行统一排版。VSCODE安装prettier-eslint插件并设置成默认格式化工具。
排版都使用了ESLint默认设置,下面的具体内容可以不看。
缩进
两个空格
换行
代码每行最长80字符。
空行
逻辑相对独立的代码块之间增加一行空行
方法体、块语句和类的开始或末尾不要有空行
class 成员之间、代码块之间使用空行分隔
不要使用连续空行
空格
在保留字(例如 if、for 或 catch)与左括号 ( 之间增加空格
在保留字(例如 else 或 catch)与该行之前的花括号 } 之间增加空格。
在任何打开花括号 { 之前增加空格,有两个例外:a. 在作为函数的第一个参数或数组中的第一个元素时,对象之前不用加空格,例如:foo({ name: [{ bar:baz }] })。 b. 在模板中,不用加空格,例如:abc${name}。
单行的{}内侧要有空格
数组的括号内不要有空格
禁止出现多个连续空格
花括号
给 if、for、do、while 等语句的执行体加花括号 {}
花括号 { 和语句在同一行
function foo() {//... }
逗号、分号
使用拖尾逗号
强制在逗号之后使用空格
每行结束不使用分号
4. 变量
const 或 let 而不是 var
在需要时候声明变量,并且尽快初始化
每行声明一个变量
禁止连续赋值
变量不需要用 undefined 初始化
使用基本类型的字面量而不是其封装类型
禁止同一作用域里,局部变量和全局变量同名
5. 方法
方法设计应遵循单一职责原则(SRP),一个方法仅完成一个功能
多段代码重复做同一件事情,那么在方法的划分上可能存在问题,应将重复部分提取为 一个方法。
方法设计应遵循单一抽象层次原则(SLAP)
SLAP 原则,是指让一个方法中所有的操作处于相同的抽象层。代码抽象层次的跳跃会破坏 了代码的流畅性。
不好示例
function compute() {input();const height = 100;output(); }
推荐示例
function compute() {input();process();output(); }
方法的参数个数不宜超过 5 个
如果参数超过 5 个,则维护的难度很大,建议减少参数个数。如果多个参数同时多次出现在 多个方法中,说明这些参数紧密相关,可以将它们封装到一个对象中。
给函数的参数指定默认值
function handleThings(opts = {}) {// ... }
不要把方法的入参当作工作变量/临时变量
对函数参数中的变量进行赋值可能会误导读者,导致混乱,也会改变 arguments 对象。
1) 每个变量/参数都有自己独特的功用,让一个变量承担多个职责,变量名无法清晰表达其功能, 会使程序难以理解。
2) 如果参数是传引用方式的,在方法内对参数的更改,会传递到方法外,可能会造成意外的错误。 所以也不建议对参数的属性进行修改。
不好示例
function sample(inputVal) {inputVal = inputVal * CurrentMuiniplier(inputVal);inputVal = inputVal * CurrentAdder(inputVal);return inputVal; }
推荐示例
function sample (inputVal) {let workingVal = inputVal;workingVal = workingVal * CurrentMuiniplier(workingVal);workingVal = workingVal * CurrentAdder(workingVal);return workingVal; }
总是将默认参数放在最后
将默认参数放在最后,在调用方法时,若默认参数没有值,就可以不传入这个参数,让调用代码更简单
不要使用 arguments,可以选择 rest 语法替代
rest 参数是一个真正的数组,而 arguments 是一个类数组。rest 参数必须是列表中的最后 一个参数。
不好示例
function concatenateAll() {const args = Array.prototype.slice.call(arguments);return args.join(''); }
推荐示例
function concatenateAll(...args) {return args.join(''); }
实现对外 API 时,应该对外部传入参数的合法性进行判断
用到匿名函数时优先使用箭头函数(或 Function#bind),别保存 this 的引用
不好示例
function foo() {const self = this;return function() {console.log(self);}; }
推荐示例
function foo() {return () => {console.log(this);}; }
箭头函数的简写
如果一个箭头函数适合用一行写出,并且只有一个参数,那就把花括号、圆括号和 return 都 省略掉。如果不是,那就不要省略。
// 省略了那就把花括号、圆括号和return [1, 2, 3].map(num => num * num); // 有两个参数,不能省略 [1, 2, 3].reduce((total, num) => {return total + num; }, 0);
要求使用一致的 return 语句
不像静态类型语言强制要求函数返回一个指定类型的值,JavaScript 允许在一个函数中不同 的代码路径返回不同类的值。 JavaScript 中令人感到困惑的一面是:在以下情况下函数返回 undefined :
1) 在退出之前没有执行 return 语句
2) 执行 return 语句,但没有显式地指定一个值
3) 执行 return undefined
4) 执行 return void,其后跟着一个表达式 (例如,一个函数调用)
5) 执行 return,其后跟着其它等于 undefined 的表达式
在一个函数中,如果任何代码路径显式的返回一个值,但一些代码路径不显式返回一个值,那么这 种情况可能是个书写错误,尤其是在一个较大的函数里。
推荐示例
// 保证所有路径都返回相同类型的值 function doSomething(condition) {if (condition) {return true;} else {return false;} }function doSomething(condition) {if (condition) {return true;}return false; }
函数返回多个值时,应该使用对象解构,而不是数组解构
不好示例
function processInput() {return [left, right, top, bottom]; } // 需要考虑返回数据的顺序 const [left, , top] = processInput();
推荐示例
function processInput() {return { left, right, top, bottom }; } // 只要选择需要的数据 const { left, right } = processInput();
6. 类与对象
class 关键字定义类
采用 extends 关键字实现继承
class PeekableQueue extends Queue {peek() {return this._queue[0];} }
在构造函数中禁止在调用 super()之前使用 this 或 super
class ClassA extends ClassB {constructor() {super();// 在”super()”之后.this.age = 0; } }
在构造函数中设置所有对象的属性(不包括方法)
在构造函数完成后,不应将属性添加到对象或从对象中删除属性,因为它会阻碍 VM 的优化 能力。在构造函数中设置所有的属性,也有利于看代码时,对代码整体功能的理解。如有必要,对 于稍后初始化的字段,也应在构造函数中显示设置为 null。
字符串使用单引号
单引号优于双引号,当你创建一个包含 HTML 代码的字符串时就知道它的好处了。
使用模板字符串(`)实现字符串拼接
说明:在 ECMAScript 6 中,如果模板字符串跨越多行,或者有变量的拼接,则需要使用模板字符 串。
function sayHi(name) {return `How are you, ${name}?`; } // 利用模板字符串处理多行字符串 function arithmetic(a, b) {return `Here is a table of arithmetic operations:${a} + ${b} = ${a + b}${a} - ${b} = ${a - b}${a} * ${b} = ${a * b}${a} / ${b} = ${a / b}`; }
向数组添加元素时使用 Arrary#push 替代直接赋值
const someStack = []; someStack.push('abracadabra');
不要在 forEach 循环里进行元素的 remove/add 操作
在 forEach 循环中删除、增加元素,会破坏原本的遍历顺序,可能导致意料之外的结果。
使用数组解构
ECMAScript 6 允许按照一定的模式,从数组和对象中提取值,对变量进行赋值,这被称之为 解构(Destructuring)。解构赋值避免了临时变量或对象,给 JavaScript 书写带来了很大的便利性,同 时也提高了代码的可读性。
1) 可以在赋值的左侧使用数组字面量来执行解构,最后元素可以是 rest。
2) 数组解构也可以用于函数参数。如果数组参数是可选的,则始终需要将[]指定为默认值,并在 左侧提供默认值。
const [age, bee, cat, ...rest] = generateResults(); const [,bee,, dog] = someArray; function optionalDestructuring([age = 4, bee = 2] = []) {};
尽量在一个地方定义对象的所有属性
getter 和 setter 应该成对出现在对象中
禁止在对象实例上直接使用 Object.prototypes 的内置属性
对象实例可以具有属性,这些属性可以将 Object.prototype 的内建函数隐藏,可能导致意外 行为或拒绝服务安全漏洞。例如,web 服务器解析来自客户机的 JSON 输入并直接在结果对象上调 用 hasOwnProperty 是不安全的,因为恶意客户机可能发送一个 JSON 值,如 { hasOwnProperty: 1 }, 并导致服务器崩溃。
用 Object.keys()替代 for-in 进行遍历。
在使用 for-in 遍历对象时,会把从原型链继承来的属性也包括进来。这样会导致意想不到的 项出现。因此,应该在 for-in 循环中使用 Object.prototype.hasOwnProperty 来排除不需要的原型属性。
7. 运算与表达式
条件表达式
在条件判断中,应该变量在先,字面量在第二的位置
if (color === 'red') { // ... }
判断相等时使用 === 和 !== ,而不是 == 和 !=
JavaScript 中使用双等 == 做相等判断时会自动做类型转换,如:[] == false、[] == ![]、3 == '03'都是 true,当类型确定时使用全等 === 可以提高效率
使用简写的条件表达式
对于条件表达式,例如 if 语句,JavaScript 引擎会强制计算它们的表达式为布尔值,规则如 下:
1) 对象 被计算为 true;
2) undefined 被计算为 false;
3) null 被计算为 false;
4) 布尔值 被计算为 布尔的值;
5) 数字 如果是 +0、-0、或 NaN 被计算为 false, 否则为 true;
if (isValid) {// ... } const collection = [1, 2, 3]; if (collection.length) {// ... } // name是字符串 if (name !== '') {// ... }
禁止使用嵌套的三元表达式
嵌套的三元表达式使代码更加难以理解。
控制语句
每个 switch 语句都包含一个 default 语句,即使它不包含任何代码
在 switch 语句的每一个有内容的 case 中都放置一条 break 语句
遗漏 break,可能导致程序误入下一个 case 分支,执行了预期之外的代码,导致异常。而且, 不推荐做出有意不写 break 的设计。
case 语句中需要声明词法时, 花括号{}不能省略
词法声明在整个 switch 语句块中是可见的,但是它只有在运行到它定义的 case 语句时, 才会进行初始化操作。为了保证词法声明语句只在当前 case 语句中有效,应该将语句包裹在块中。
// switch 语句之外的声明是有效的 const num = 0; switch (foo) {// 下面的 case 子句使用括号包装成块case 1: {let age = 1;break;}case 2: {const bar = 2;break;}case 3:// 由于函数声明提升特性,不带括号是可以的function fun() {}break;case 4:// 由于 var 变量的声明提升特性,不带括号是可以的var dog = 4;break;default: {class ClassA {}} }
对于 if-else if(有多个 else if)类型的条件判断,最后必须包含一个 else 分支
正则表达式
禁止正则表达式字面量中出现多个空格
正则表达式可以很复杂和难以理解,这就是为什么要保持它们尽可能的简单,以避免出现错 误。在使用正则表达式时使用了多个空格很容易出错。
const re = /foo {3}bar/; const re = new RegExp('foo {3}bar');
建议在正则表达式中使用命名捕获组
const foo = /(?<id>ba[rz])/; const bar = new RegExp('(?<id>ba[rz])'); const baz = RegExp('(?<id>ba[rz])'); foo.exec('bar').groups.id;
8. 模块
如果模块只有一个输出值,就使用 export default,如果模块有多个输出值,则使用 export,export default与export不要同时使用
import myObject from './importModule'
如果默认输出一个函数,函数名采用小写驼峰命名
function getUerList() {}export default getUerList;
如果模块默认输出一个对象,大驼峰命名
const UserDetail={name: '上官';age: 18 }export default UserDetail
Vue项目规范
1. 命名
1.1 目录和文件
短横线分隔命名法,有复数结构时,要采用复数命名法,缩写不用复数
除通用的缩写,不自定义缩写
src/components/images/utils/styles/img/views/components-demo
1.2 项目名
短横线分隔命名法
management-system
1.3 组件命名
组件名:采用大驼峰命名法
导入及注册主键:采用大驼峰命名法
使用规范:html中使用时采用短横线分隔命名法
示例如下:组件名称为AvatarUploadCustom
,导入注册是使用AvatarUploadCustom
,html使用时用avatar-upload-custom
// 组件名 @Component({ name: 'AvatarUploadCustom', components: { AvatarUpload, PanThumb } }) // 导入注册 @Component({ name: 'PersonalCenter', components: { AvatarUploadCustom } }) // 使用 <avatar-upload-custom />
1.4 方法命名
小驼峰命名法
1.5 Prop命名
Prop名字:小写驼峰命名法
Prop使用:而在模板中使用短横线分隔命名法引用
// 子 props: {greetingText: String } // 父 <WelcomeMessage greeting-text="hi"/>
2. 代码风格
使用ESLint默认配置,统一代码风格。
文件组织顺序
VUE文件和TS/JS文件分别写。
模板
script
import
组件选项
style
示例如下:
<template> <div><!--必须在div中编写页面--></div> </template> <script lang="ts">import { Component, Vue, Watch } from 'vue-property-decorator'export default {components : {},data () {return {}},mounted() {},methods: {}} </script> <!--声明语言,并且添加scoped--> <style lang="scss" scoped> </style>
组件选项顺序
- components- props- data- computed- created- mounted- metods- filter- watch
多元素写法
多个特性的元素应该分多行撰写,每个一下单独一行(增强可读性)
<el-treeref="tree"highlight-currentexpand-on-click-nodenode-key="id":data="treeData":filter-node-method="filterNode":props="defaultProps":current-node-key="selectNodeId" @node-click="handleNodeClick"/>
元素特性的顺序
原生属性放在前面,指令放在后面
- class - id,ref - name - data-* - src, for, type, href,value,max-length,max,min,pattern - title, alt,placeholder - aria-*, role - required,readonly,disabled - is - v-for - key - v-if - v-else-if - v-else - v-show - v-cloak - v-pre - v-once - v-model - v-bind,: - v-on,@ - v-html - v-text
Prop
定义应尽量详细,必须制定其类型
必须加上注释,表明其含义
必须加上 required 或者 default,两者二选其一
@Prop({ required: true }) private id!: string @Prop({ required: true }) private url!: string @Prop({ default: 200 }) private thumbnailHeight!: number @Prop({ default: 200 }) private thumbnailWidth!: number
3. 注释
注释要求
api 目录的接口 ts 文件必须加注释
store中的 state,mutation,action等必须加注释
vue文件的 methods,每个方法必须加注释
vue文件中的 data,非常见单词要加注释
单行注释
使用//
// Active state:&.material--active {.material-label {color: $color-blue;}}
多行注释
/*** 点击tab标签切换刷新当前页面* @param tab<obj> 当前tab的所有信息*/private handleClick(tab: any, event: Event) {let queryType: anylet name = tab.name}
TODO
使用TODO来标记待做的事情,便于后期搜索
在TODO后面添加姓名来表示分类
// TODO 这个后面再写&.material--active {.material-label {color: $color-blue;}}
TypeScript编码规范
命名、注释、排版与JavaScript一致,并使用Eslint默认配置统一风格
项目开发规范--前端相关推荐
- 前端规范 - 前端项目开发规范
0 前言 好好做业务,提高自己的工程能力 [强制] 1 开启eslint 根据团队的习惯,制定适合自己的rules 比如 no-console no-debugger可以关闭 [强制] 2 新项目使用 ...
- Laravel 项目开发规范
一. 说明 以下内容大部分引用Laravel China社区的文章 - 分享下团队的开发规范 --<Laravel 项目开发规范>. 相对而言,上面引用的文章的规范更加严格,但考虑到目前的 ...
- 项目开发SOP前端执行SOP
项目开发SOP&前端执行SOP 项目开发SOP 1.产品经理输出原型图以及进行评审 2.UI设计师跟进原型输出UI图 3.前端根据UI图进行前端界面开发 4.根据后端swagger进行字段填充 ...
- Java后台项目开发规范
Java后台项目开发规范 写在前边 1.目标 2. 原则 一.命名规范 1.包命名规范 2.类命名规范[**UpperCamelCase命名法**] 2.1==如果在模块或者接口,类,方法中使用了设计 ...
- 【项目总结】项目开发规范
目录 背景 后端规范 一.接口api规范 1.接口风格接口风格统一采用restful规范 2.接口api命名规范 3.接口参数规范 4.接口响应数据/状态码规范 4.1响应数据结构 4.2Http状态 ...
- java服务端项目开发规范
更新内容 2015-03-13 (请先更新svn的mybatis.xml.BaseMapper.java.Pager.java文件) 加入测试类规范 加入事物控制规范 加入mapper接口规则 ...
- web项目开发 之 前端规范 --- JSON数据传输规范
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 此文严格 ...
- web项目开发 之 前端规范 --- CSS编码规范
此文严格按照W3C规范和部分实际项目可读性,浏览器加载,性能等众多属性权衡,做出平时前端编码规范 文档.供广大web工作者参考并实施,对维护和项目扩展升级都能省时省力. 转载请注明出处:JS前端实用开 ...
- web项目开发 之 前端规范 --- HTML编码规范
此文严格按照W3C规范和部分实际项目可读性,浏览器加载,性能等众多属性权衡,做出平时前端编码规范文 档.供广大web工作者参考并实施,对维护和项目扩展升级都能省时省力. 转载请注明出处,JS前端实用开 ...
最新文章
- Go 知识点(15)— 切片长度和容量
- Java中常见数据结构:list与map
- php如何检查图片是否一样,图片检测 - PHP判断真实图片
- [转载] 用pandas进行数据分析实战
- python3 性能提升_5个提升Python性能的项目
- 数字 三位一节(逗号隔开)表示
- 数字电路基础知识——数字IC中的进制问题(原码,反码,补码以及各进制的转换)
- 中国剩余定理与韩信点兵问题原理
- 喜欢游戏的人,福利来啦,这个岗位可以边打游戏边工作
- LeetCode 1348. 推文计数
- C++之pow()函数
- There was an error while executing `VBoxManage`, a CLI used by Vagrant for controlling VirtualBox.错误
- 《笨方法学PYTHON》——fourteenthlesson
- svn提交怎么全选_SVN 一次性提交多个目录中文件
- Discuz!NT 代码阅读笔记(8)--DNT的几个分页存储过程解析
- STM32CubeIDE导入机智云生成基于MDK的STM32工程
- 顺丰打印电子运单报500问题解决
- k8s之Secret详细理解及使用
- ClickHouse免费送书福利
- PDF水印工具正式推出