目录文章目录一、命名规范1.1 项目文件命名1.1.1 项目名1.1.2 目录名1.1.3 图像文件名1.1.4 HTML 文件名1.1.5 CSS 文件名1.1.6 JavaScript 文件名1.2 Vue 组件命名1.2.1 单文件组件名1.2.2 单例组件名1.2.3 基础组件名1.2.4 业务组件1.2.5 紧密耦合的组件名1.2.6 组件名中单词顺序1.2.7 完整单词的组件名1.3 代码参数命名1.3.1 name1.3.2 prop1.3.3 router1.3.4 模板中组件1.3.5 自闭合组件1.3.6 变量1.3.7 常量1.3.8 方法1.3.9 自定义事件1.3.10 事件方法二、代码规范2.1 Vue2.1.1 代码结构2.1.2 data2.1.3 prop2.1.4 computed2.1.5 为 v-for 设置键值2.1.6 v-if 和 v-for 互斥2.1.7 多个 attribute 的元素2.1.8 模板中简单的表达式2.1.9 带引号的 attribute 值2.1.10 指令缩写2.2 HTML2.2.1 文件模板2.2.2 元素及标签闭合2.2.3 代码嵌套2.3 CSS2.3.1 样式文件2.3.2 代码格式化2.3.3 代码大小写2.3.4 代码易读性2.3.5 属性值引号2.3.6 属性书写建议3.3.7 CSS3 浏览器私有前缀2.4 JavaScript2.4.1 单行代码块2.4.2 大括号风格2.4.3 代码中的空格三、注释规范3.1 HTML 文件注释3.1.1 单行注释3.1.2 模块注释3.1.3 嵌套模块注释3.2 CSS 文件注释3.2.1 单行注释3.2.2 模块注释3.2.3 文件注释3.3 JavaScript 文件注释3.3.1 单行注释3.3.2 多行注释3.3.3 注释空格3.3.4 特殊标记3.3.5 文档类注释3.3.6 注释工具四、其它 2.1.8 模板中简单的表达式 组件模板应该只包含简单的表达式,复杂的表达式则应该重构为计算属性或方法。 复杂表达式会让你的模板变得不那么声明式。我们应该尽量描述应该出现的是什么,而非如何计算那个值。而且计算属性和方法使得代码可以重用。 // bad {{ fullName.split(' ').map((word) => { return word[0].toUpperCase() + word.slice(1) }).join(' ') }} 更好的做法: {{ normalizedFullName }} // 复杂表达式已经移入一个计算属性 computed: { normalizedFullName: function () { return this.fullName.split(' ').map(function (word) { return word[0].toUpperCase() + word.slice(1) }).join(' ') } } 2.1.9 带引号的 attribute 值 非空 HTML 特性值应该始终带双引号。 <!-- bad --> <input type=text> <AppSidebar :style={width:sidebarWidth+'px'}> <!-- good --> <input type="text"> <AppSidebar :style="{ width: sidebarWidth + 'px' }"> 2.1.10 指令缩写 用 : 表示 v-bind: 用 @ 表示 v-on: 用 # 表示 v-slot: <input :value="newTodoText" :placeholder="newTodoInstructions"> <input @input="onInput" @focus="onFocus"> <template #header> <h1>Here might be a page title</h1> </template> <template #footer> <p>Here's some contact info</p> </template> 2.2 HTML 2.2.1 文件模板 HTML5 文件模板: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>HTML5 标准模版</title> </head> <body> </body> </html> 移动端: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, shrink-to-fit=no"> <meta name="format-detection" content="telephone=no"> <title>移动端 HTML 模版</title> <!-- S DNS 预解析 --> <link rel="dns-prefetch" href=""> <!-- E DNS 预解析 --> <!-- S 线上样式页面片,开发请直接取消注释引用 --> <!-- #include virtual="" --> <!-- E 线上样式页面片 --> <!-- S 本地调试,根据开发模式选择调试方式,请开发删除 --> <link rel="stylesheet" href="css/index.css"> <!-- /本地调试方式 --> <link rel="stylesheet" rel="nofollow" href="/links?url=aHR0cDovL3NyY1BhdGgvaW5kZXguY3Nz"> <!-- /开发机调试方式 --> <!-- E 本地调试 --> </head> <body> </body> </html> PC 端: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="keywords" content="your keywords"> <meta name="description" content="your description"> <meta name="author" content="author,email address"> <meta name="robots" content="index,follow"> <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"> <meta name="renderer" content="ie-stand"> <title>PC 端 HTML 模版</title> <!-- S DNS 预解析 --> <link rel="dns-prefetch" href=""> <!-- E DNS 预解析 --> <!-- S 线上样式页面片,开发请直接取消注释引用 --> <!-- #include virtual="" --> <!-- E 线上样式页面片 --> <!-- S 本地调试,根据开发模式选择调试方式,请开发删除 --> <link rel="stylesheet" href="css/index.css"> <!-- /本地调试方式 --> <link rel="stylesheet" rel="nofollow" href="/links?url=aHR0cDovL3NyY1BhdGgvaW5kZXguY3Nz"> <!-- /开发机调试方式 --> <!-- E 本地调试 --> </head> <body> </body> </html> 2.2.2 元素及标签闭合 HTML 元素共有以下 5 种: 空元素:area、base、br、col、command、embed、hr、img、input、keygen、link、meta、param、source、track、wbr 原始文本元素:script、style RCDATA 元素:textarea、title 外来元素:来自 MathML 命名空间和 SVG 命名空间的元素 常规元素:其他 HTML 允许的元素都称为常规元素 为了能让浏览器更好的解析代码以及能让代码具有更好的可读性,有如下约定: 所有具有开始标签和结束标签的元素都要写上起止标签,某些允许省略开始标签或和束标签的元素亦都要写上。 空元素标签都不加 “/” 字符。 <!-- good --> <div> <h1>我是 h1 标题</h1> <p>我是一段文字,我有始有终,浏览器能正确解析</p> </div> <br data-tomark-pass> <!-- bad --> <div> <h1>我是 h1 标题</h1> <p>我是一段文字,我有始无终,浏览器亦能正确解析 </div> <br/> 2.2.3 代码嵌套 元素嵌套规范,每个块状元素独立一行,内联元素可选。 <!-- good --> <div> <h1></h1> <p></p> </div> <p><span></span><span></span></p> <!-- bad --> <div> <h1></h1><p></p> </div> <p> <span></span> <span></span> </p> 段落元素与标题元素只能嵌套内联元素。 <!-- good --> <h1><span></span></h1> <p><span></span><span></span></p> <!-- bad --> <h1><div></div></h1> <p><div></div><div></div></p> 2.3 CSS 2.3.1 样式文件 样式文件必须写上 @charset 规则,并且一定要在样式文件的第一行首个字符位置开始写,编码名用 “UTF-8”。 推荐: @charset "UTF-8"; .jdc {} 不推荐: /* @charset 规则不在文件首行首个字符开始 */ @charset "UTF-8"; .jdc {} /* @charset 规则没有用小写 */ @CHARSET "UTF-8"; .jdc {} /* 无@charset 规则 */ .jdc {} 2.3.2 代码格式化 样式书写一般有两种:一种是紧凑格式 (Compact),一种是展开格式(Expanded)。 推荐:展开格式(Expanded) .jdc { display: block; width: 50px; } 不推荐:紧凑格式 (Compact) .jdc { display: block; width: 50px;} 2.3.3 代码大小写 样式选择器,属性名,属性值关键字全部使用小写字母书写,属性字符串允许使用大小写。 推荐: .jdc { display: block; } 不推荐: .JDC { DISPLAY: BLOCK; } 2.3.4 代码易读性 (1)左括号与类名之间一个空格,冒号与属性值之间一个空格。 推荐: .jdc { width: 100%; } 不推荐: .jdc{ width:100%; } (2)逗号分隔的取值,逗号之后一个空格。 推荐: .jdc { box-shadow: 1px 1px 1px #333, 2px 2px 2px #ccc; } 不推荐: .jdc { box-shadow: 1px 1px 1px #333,2px 2px 2px #ccc; } (3)为单个 CSS 选择器或新声明开启新行。 推荐: .jdc, .jdc_logo, .jdc_hd { color: #ff0; } .nav{ color: #fff; } 不推荐: .jdc, .jdc_logo, .jdc_hd { color: #ff0; }.nav{ color: #fff; } (4)颜色值 rgb() rgba() hsl() hsla() rect() 中不需有空格,且取值不要带有不必要的 0。 推荐: .jdc { color: rgba(255,255,255,.5); } 不推荐: .jdc { color: rgba( 255, 255, 255, 0.5 ); } (5)属性值十六进制数值能用简写的尽量用简写。 推荐: .jdc { color: #fff; } 不推荐: .jdc { color: #ffffff; } (6)不要为 0 指明单位。 推荐: .jdc { margin: 0 10px; } 不推荐: .jdc { margin: 0px 10px; } 2.3.5 属性值引号 CSS 属性值需要用到引号时,统一使用单引号。 推荐: .jdc { font-family: 'Hiragino Sans GB'; } 不推荐: .jdc { font-family: "Hiragino Sans GB"; } 2.3.6 属性书写建议 建议遵循以下顺序: 布局定位属性:display / position / float / clear / visibility / overflow 自身属性:width / height / margin / padding / border / background 文本属性:color / font / text-decoration / text-align / vertical-align / white- space / break-word 其他属性(CSS3):content / cursor / border-radius / box-shadow / text-shadow / background: linear-gradient … .jdc { display: block; position: relative; float: left; width: 100px; height: 100px; margin: 0 10px; padding: 20px 0; font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif; color: #333; background: rgba(0,0,0,.5); -webkit-border-radius: 10px; -moz-border-radius: 10px; -o-border-radius: 10px; -ms-border-radius: 10px; border-radius: 10px; } 3.3.7 CSS3 浏览器私有前缀 CSS3 浏览器私有前缀在前,标准前缀在后。 .jdc { -webkit-border-radius: 10px; -moz-border-radius: 10px; -o-border-radius: 10px; -ms-border-radius: 10px; border-radius: 10px; } 2.4 JavaScript 2.4.1 单行代码块 在单行代码块中使用空格。 不推荐: function foo () {return true} if (foo) {bar = 0} 推荐: function foo () { return true } if (foo) { bar = 0 } 2.4.2 大括号风格 在编程过程中,大括号风格与缩进风格紧密联系,用来描述大括号相对代码块位置的方法有很多。在 JavaScript 中,主要有三种风格,如下: 【推荐】One True Brace Style: if (foo) { bar() } else { baz() } Stroustrup: if (foo) { bar() } else { baz() } Allman: if (foo) { bar() } else { baz() } 2.4.3 代码中的空格 逗号前后的空格可以提高代码的可读性,团队约定在逗号后面使用空格,逗号前面不加空格。 推荐: var foo = 1, bar = 2 不推荐: var foo = 1,bar = 2 var foo = 1 , bar = 2 var foo = 1 ,bar = 2 对象字面量的键和值之间不能存在空格,且要求对象字面量的冒号和值之间存在一个空格。 推荐: var obj = { 'foo': 'haha' } 不推荐: var obj = { 'foo' : 'haha' } 代码块前要添加空格。 推荐: if (a) { b() } function a () {} 不推荐: if (a){ b() } function a (){} 函数声明括号前要加空格。 推荐: function func (x) { // ... } 不推荐: function func(x) { // ... } 在函数调用时,禁止使用空格。 推荐: fn() 不推荐: fn () fn () 在操作符前后都需要添加空格。 推荐: var sum = 1 + 2 不推荐: var sum = 1+2 三、注释规范 注释的目的: 提高代码的可读性,从而提高代码的可维护性 注释的原则: 如无必要,勿增注释 ( As short as possible ) 如有必要,尽量详尽 ( As long as necessary ) 3.1 HTML 文件注释 3.1.1 单行注释 一般用于简单的描述,如某些状态描述、属性描述等。 注释内容前后各一个空格字符,注释位于要注释代码的上面,单独占一行。 推荐: <!-- Comment Text --> <div>...</div> 不推荐: <div>...</div><!-- Comment Text --> <div><!-- Comment Text --> ... </div> 3.1.2 模块注释 一般用于描述模块的名称以及模块开始与结束的位置。 注释内容前后各一个空格字符, <!-- S Comment Text -->表示模块开始, <!-- E Comment Text -->表示模块结束,模块与模块之间相隔一行。 推荐: <!-- S Comment Text A --> <div > ... </div> <!-- E Comment Text A --> <!-- S Comment Text B --> <div > ... </div> <!-- E Comment Text B --> 不推荐: <!-- S Comment Text A --> <div > ... </div> <!-- E Comment Text A --> <!-- S Comment Text B --> <div > ... </div> <!-- E Comment Text B --> 3.1.3 嵌套模块注释 当模块注释内再出现模块注释的时候,为了突出主要模块,嵌套模块不再使用。 <!-- S Comment Text --> <!-- E Comment Text --> 而改用 <!-- /Comment Text --> 注释写在模块结尾标签底部,单独一行。 <!-- S Comment Text A --> <div > <div > ... </div> <!-- /mod_b --> <div > ... </div> <!-- /mod_c --> </div> <!-- E Comment Text A --> 3.2 CSS 文件注释 3.2.1 单行注释 注释内容第一个字符和最后一个字符都是一个空格字符,单独占一行,行与行之间相隔一行。 推荐: /* Comment Text */ .jdc {} /* Comment Text */ .jdc {} 不推荐: /*Comment Text*/ .jdc { display: block; } .jdc { display: block;/*Comment Text*/ } 3.2.2 模块注释 注释内容第一个字符和最后一个字符都是一个空格字符,/* 与 模块信息描述占一行,多个横线分隔符 - 与 */ 占一行,行与行之间相隔两行。 推荐: /* Module A ---------------------------------------------------------------- */ .mod_a {} /* Module B ---------------------------------------------------------------- */ .mod_b {} 不推荐: /* Module A ---------------------------------------------------- */ .mod_a {} /* Module B ---------------------------------------------------- */ .mod_b {} 3.2.3 文件注释 在样式文件编码声明 @charset 语句下面注明页面名称、作者、创建日期等信息。 @charset "UTF-8"; /** * @desc File Info * @author Author Name * @date 2021-08-09 */ 3.3 JavaScript 文件注释 3.3.1 单行注释 单行注释使用 //,注释应单独一行写在被注释对象的上方,不要追加在某条语句的后面。 推荐: // is current tab const active = true 不推荐: const active = true // is current tab 注释行的上方需要有一个空行(除非注释行上方是一个块的顶部),以增加可读性。 推荐: function getType () { console.log('fetching type...') // set the default type to 'no type' const type = this.type || 'no type' return type } // 注释行上面是一个块的顶部时不需要空行 function getType () { // set the default type to 'no type' const type = this.type || 'no type' return type } 不推荐: function getType () { console.log('fetching type...') // set the default type to 'no type' const type = this.type || 'no type' return type } 3.3.2 多行注释 多行注释使用 /** ... */,而不是多行的 //。 推荐: /** * make() returns a new element * based on the passed-in tag name */ function make (tag) { // ... return element } 不推荐: // make() returns a new element // based on the passed in tag name function make (tag) { // ... return element } 3.3.3 注释空格 注释内容和注释符之间需要有一个空格,以增加可读性。eslint: spaced-comment。 推荐: // is current tab const active = true /** * make() returns a new element * based on the passed-in tag name */ function make(tag) { // ... return element } 不推荐: //is current tab const active = true /** *make() returns a new element *based on the passed-in tag name */ function make(tag) { // ... return element } 3.3.4 特殊标记 有时我们发现某个可能的 bug,但因为一些原因还没法修复;或者某个地方还有一些待完成的功能,这时我们需要使用相应的特殊标记注释来告知未来的自己或合作者。常用的特殊标记有两种: // FIXME : 说明问题是什么 // TODO : 说明还要做什么或者问题的解决方案 class Calculator extends Abacus { constructor () { super () // FIXME: shouldn’t use a global here total = 0 // TODO: total should be configurable by an options param this.total = 0 } } 3.3.5 文档类注释 文档类注释,如函数、类、文件、事件等;都使用 jsdoc 规范。 /** * Book 类,代表一个书本. * @constructor * @param {string} title - 书本的标题. * @param {string} author - 书本的作者. */ function Book (title, author) { this.title = title this.author = author } Book.prototype = { /** * 获取书本的标题 * @returns {string|*} */ getTitle: function () { return this.title }, /** * 设置书本的页数 * @param pageNum {number} 页数 */ setPageNum: function (pageNum) { this.pageNum=pageNum } } 3.3.6 注释工具 ESLint 是当下最流行的 JS 代码检查工具,ESLint 中有一些注释相关的规则,用户可选择开启: valid-jsdoc require-jsdoc no-warning-comments capitalized-comments line-comment-position lines-around-comment multiline-comment-style no-inline-comments spaced-comment 四、其它 缩进换行请使用两个空格。 大型团队多人协作项目推荐 JavaScript 代码末尾加分号。 小型个人创新练手项目可尝试使用 JavaScript 代码末尾不加分号的风格,更加清爽简练。