highso-fe / highso-fe-blog

:books: 嗨学网前端团队技术博客
15 stars 3 forks source link

嗨学网前端开发规范 #3

Open ghost opened 7 years ago

ghost commented 7 years ago

2017-03-18

Golden Rule: “ Every line of code should appear to be written by a single person, no matter the number of contributors. ”

HTML

一丶语法

<!DOCTYPE html>
<html>
  <head>
    <title>Page title</title>
  </head>
  <body>
    <img src="images/company-logo.png" alt="Company">
    <h1 class="hello-world">Hello, world!</h1>
  </body>
</html>

二丶注释

<!-- 新闻列表模块 -->
<div class="news">
...
<!-- /新闻列表模块 -->
<!-- 不要使用结束模块的注释,既丑陋,又加重文件负荷。 -->

<!-- TODO: 待办事项 -->
...

三丶文档

HTML5 DOCTYPE

在每个 HTML 页面开头使用 DOCTYPE 来启用标准模式,使每个浏览器尽可能一致地展现。文档类型声明之前,不允许出现任何非空字符。虽然 DOCTYPE 不区分大小写,但是按照惯例,DOCTYPE 大写。

<!DOCTYPE html>

语言属性

根据 HTML5 规范,强烈建议为 <html> 根元素指定 lang 属性,从而为文档设置正确的语言。这将有助于语音合成工具确定其所应该采用的发音,有助于翻译工具确定其翻译时所应遵守的规则等等。

<html lang="zh-CN">
  <!-- ... -->
</html>

IE 兼容模式

IE 支持通过特定的 <meta> 标签来确定绘制当前页面所应该采用的 IE 版本。除非有强烈的特殊需求,否则最好是设置为 edge mode,从而通知 IE 采用其所支持的最新的模式。

<meta http-equiv="X-UA-Compatible" content="IE=Edge">

字符编码

通过声明一个明确的字符编码,让浏览器轻松、快速地确定适合网页内容的渲染方式。

<meta charset="UTF-8">

引入 CSS 和 JavaScript

根据 HTML5 规范,在引入 CSS 和 JavaScript 文件时一般不需要指定 type 属性,因为 text/csstext/javascript 分别是它们的默认值。尽量避免内部样式表。尽量将 js 文件放在尾部加载。可以使用IE条件注释的方式兼容IE。

<!-- External CSS -->
<link rel="stylesheet" href="code-guide.css">

<!-- In-document CSS -->
<style>
  /* ... */
</style>

<!-- JavaScript -->
<script src="code-guide.js"></script>

四丶标签

语义化标签

比如标题根据重要性用 h*(同一页面只能有一个 h1), 段落标记用 p, 列表用 ul, 内联元素中不可嵌套块级元素等

避免冗余

编写 HTML 代码时,尽量避免多余的父元素。很多时候,这需要迭代和重构来实现。

js 生成的标签

通过 js 生成的标签让内容变得不易查找、编辑,并且降低性能。能避免时尽量避免。

五丶属性

属性顺序

<a id="..." class="..." data-modal="toggle" href="#"> Example link </a>
<input class="form-control" type="text">
<img src="..." alt="...">

布尔属性

根据 HTML5 规范,布尔型属性可以在声明时不赋值。即元素的布尔型属性如果有值,就是 true,如果没有值,就是 false。

<input type="checkbox" value="1" checked>

<select>
  <option value="1" selected>1</option>
</select>

其他规则


CSS

一丶语法

二、注释

注释方式

/* this is a short comment*/

/*
 * this is comment line 1.
 * this is comment line 2.
 */

文件顶部注释(必需)

/*
 * @description: 中文说明
 * @author: name (不建议写作者署名,增加维护成本,且本应该每个模块共同可维护)
 * @todo: ...
 */

三、代码组织

四、选择器

五、命名规范

使用有意义的或通用的 id 和 class 命名:id 和 class 的命名应反映该元素的功能或使用通用名称,而不要用抽象的晦涩的命名。反映元素的使用目的是首选;使用通用名称代表该元素不表特定意义,与其同级元素无异,通常是用于辅助命名;使用功能性或通用的名称可以更适用于文档或模版变化的情况。

六、声明顺序

相关的属性声明应当归为一组,并按照下面的顺序排列:

  1. Positioning
  2. Box model
  3. Typographic
  4. Visual

由于定位(positioning)可以从正常的文档流中移除元素,并且还能覆盖盒模型(box model)相关的样式,因此排在首位。盒模型排在第二位,因为它决定了组件的尺寸和位置。

其他属性只是影响组件的内部(inside)或者是不影响前两组属性,因此排在后面。

.declaration-order {
  /* Positioning */
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: 100;

  /* Box-model */
  display: block;
  float: right;
  width: 100px;
  height: 100px;

  /* Typography */
  font: normal 13px "Helvetica Neue", sans-serif;
  line-height: 1.5;
  color: #333;
  text-align: center;

  /* Visual */
  background-color: #f5f5f5;
  border: 1px solid #e5e5e5;
  border-radius: 3px;

  /* Misc */
  opacity: 1;
}

七、属性简写

在需要显示地设置所有值的情况下,应当尽量限制使用简写形式的属性声明。常见的滥用简写属性声明的情况如下:

大部分情况下,我们不需要为简写形式的属性声明指定所有值。例如,HTML 的 heading 元素只需要设置上、下边距(margin)的值,因此,在必要的时候,只需覆盖这两个值就可以。过度使用简写形式的属性声明会导致代码混乱,并且会对属性值带来不必要的覆盖从而引起意外的副作用。

/* Not so great */
.element {
  margin: 0 0 10px;
  background: red;
  background: url("image.jpg");
  border-radius: 3px 3px 0 0;
}

/* Better */
.element {
  margin-bottom: 10px;
  background-color: red;
  background-image: url("image.jpg");
  border-top-left-radius: 3px;
  border-top-right-radius: 3px;
}

JavaScript(ES5)

一丶基本的格式化

空行

if (wl && wl.length) {

    for (i = 0, l = wl.length; i < l; i++) {
        p = wl[i];
        type = Y.Lang.type(r[p]);

        if (s.hasOwnProperty(p)) {

            if (merge && type == 'object') {
                Y.mix(r[p], s[p]);
            } else if (ov || !(p in r)) {
                r[p] = s[p];
            }
        }
    }
}

命名-变量和函数

对于函数和方法命名来说,第一个单词应该是动词,这里有一些使用动词常见的约定:

命名-常量

var MAX_COUNT = 10;
var URL = "http://www.nczonline.net/";

if (count < MAX_COUNT) {
    doSomething();
}

其他命名

直接量-数字

直接量-null

把 null 当做对象的占位符,在下列场景中应当使用 null:

以下场景不应当使用 null:

二丶注释

单行注释

// 好的写法
if (condition) {

    // 如果代码执行到这里,则表明通过了所有安全性检查
    allowed();
}

// 好的写法
var result = something + somethingElse; // somethingElse 不应当取值为null

// 好的写法
// if (condition) {
//     doSomething();
//     thenDoSomethingElse();
// }

多行注释

// 好的写法
if (condition) {

    /*
     * 如果代码执行到这里
     * 说明通过了所有的安全性检测
     */
    allowed();
}

使用注释

三丶语句和表达式

var prop;

for (prop in object) {
    if (object.hasOwnProperty(prop)) {
        console.log("Property name is " + prop);
        console.log("Property value is " + object[prop]);
    }
}

四丶变量、函数和运算符

变量声明

函数声明

立即调用的函数

var value = (function() {

    // 函数体

    return {
        message: "Hi"
    }
} ());

其他


同样应遵守的其他规范

ghost commented 7 years ago

撰写本规范主要参考了 Nicholas Zakas 的《编写可维护的 JavaScript》、Airbnb 团队规范及个人工作以来的项目实践经验。

作为团队成员,应从意识上重视该规范。更重要的是,阅读时应当多思考为什么。

另外,随着语言标准的更新迭代,规范的条目内容也必然应当随之更新。希望团队成员提出质疑、积极讨论。