mishe / blog

前端碰上的问题或体会
230 stars 39 forks source link

新公司的前端开发规范(初稿) #125

Open mishe opened 8 years ago

mishe commented 8 years ago

前端开发规范文档(初稿)


总体原则


html规范

基本语法

在属性上,使用双引号,不要使用单引号。 不要在自动闭合标签结尾处使用斜线 - HTML5 规范 指出他们是可选的。 不要忽略可选的关闭标签(例如, 和 )。 尽量用class来渲染样式,避免用id来写样式

Doctype

在每个 HTML 页面开头使用这个简单地 doctype 来启用标准模式,使其每个浏览器中尽可能一致的展现。
<!DOCTYPE html>

字符编码

通过声明一个明确的字符编码,让浏览器轻松、快速的确定适合网页内容的渲染方式。这样做之后,需要避免在 HTML 中出现字符实体,直接提供字符与文档一致的编码(通常是 UTF-8)。
<head>
  <meta charset="UTF-8">
</head>

兼容模式

优先使用最新版本的IE 和 Chrome 内核
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

基本的SEO

<meta name="keywords" content="your keywords">
<meta name="description" content="your description">

viewport 设置

<meta name="viewport" content="width=640,user-scalable=no">
<meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no">

favicon

在未指定 favicon 时,大多数浏览器会请求 Web Server 根目录下的 favicon.ico 。为了保证 favicon 可访问,避免404,必须遵循以下两种方法之一:

<link rel="shortcut icon" href="path/to/favicon.ico">

移动端页头推荐配置

    <meta charset="UTF-8">
    <title>title</title>
    <meta name="keywords" content="" />
    <meta name="description" content="" />
    <meta name="viewport" content="width=640,user-scalable=no" />
    <!--<meta name="viewport" content="initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0,user-scalable=no,minimal-ui">-->
    <meta http-equiv="cleartype" content="on">
    <meta name="apple-mobile-web-app-title" content="...">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="format-detection" content="telephone=no">
    <meta http-equiv="x-rim-auto-match" content="none">
    <meta name="apple-touch-fullscreen" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <!-- uc强制竖屏 -->
    <meta name="screen-orientation" content="portrait">
    <!-- QQ强制竖屏 -->
    <meta name="x5-orientation" content="portrait">
    <!-- UC强制全屏 -->
    <meta name="full-screen" content="yes">
    <!-- QQ强制全屏 -->
    <meta name="x5-fullscreen" content="true">

CSS 和 JavaScript 结构、样式、行为分离

尽量确保文档和模板只包含 HTML 结构,样式都放到样式表里,行为都放到脚本里。
根据 HTML5 规范, 通常在引入 CSS 和 JavaScript 时不需要指明 type,因为 text/css 和 text/javascript 分别是他们的默认值。
<link rel="stylesheet" href="code-guide.css">
<script src="code-guide.js"></script>

<style>
  /* ... */
</style>

实用高于完美

尽量遵循 HTML 标准和语义,但是不应该以浪费实用性作为代价。任何时候都要用尽量小的复杂度和尽量少的标签来解决问题。
在编写 HTML 代码时,需要尽量避免多余的父节点。很多时候,需要通过迭代和重构来使 HTML 变得更少。 参考下面的示例:
<!-- Not so great -->
<span class="avatar">
  <img src="...">
</span>

<!-- Better -->
<img class="avatar" src="...">

避免用 document.write 生成标签

用 document.write生成标签让内容变得更难查找,更难编辑,<b>性能更差</b>。应该尽量避免这种情况的出现。

CSS 规范

css代码本身都是全局的,所有应当采用css模块化思想,约束css的规则,尽量减少对全局的污染

属性简写

坚持限制属性取值简写的使用,属性简写需要你必须显式设置所有取值。常见的属性简写滥用包括:
padding
margin
font
background
border
border-radius
大多数情况下,我们并不需要设置属性简写中包含的所有值。例如,HTML 头部只设置上下的 margin,所以如果需要,只设置这两个值。过度使用属性简写往往会导致更混乱的代码,其中包含不必要的重写和意想不到的副作用。

一行还是多行书写?

css实例都是用的多行的格式,每一对属性和值占单独一行。这个是广泛使用的约定,不仅是在css文件中,也多出现在书里和文章里。许多人认为他的可读性很好。
然而在和团队的工作中,尤其是大型的css文件,我是将样式写成一行,并使用css模块化思想:
.alert-window {background: #fff; border: 1px solid #ff0; font-weight: bold; padding: 10px;}
.alert-window .window-title{...}
.alert-window .window-content{...}
.alert-window .window-buttom{...}
就我个人而言,觉得单行的可读性更好。当你查找css时多行样式就变得很麻烦,相比较而言单行查找更容易。

Javascript

命名规范

    '1'+1==2 //false;
    1+1==2 //true

使用简易条件判断方式

if (name !== 0 || name !== '' || name!==null || name!==undefined) {
...
}

if (name) {
...
}

if (collection.length > 0) {
  ...
}

if (collection.length) {
...
}

使用三元表达式来代替简单的if else

    if(a){
        d='b'
    }else{
        d='c'
    }

    d=a?'b':'c';

使用&& 和 || 替代简单的if

     if(a){
        b()
    }

    a && c();

    if(bb){
        a=bb
    }else{
        a=2
    }

    a=bb||2

使用数组或json优化if else

    if(a=='1' || a=='b' || a=='c' || a=='ss'){
        bb();
    }else{
        ...
    }

    var hasData={
        '1':1,
        'b':1,
        'c':1,
        'ss':1
    }

    if(hasData[a]){
        bb()
    }else{
    ...
    }

不要在非函数块中(if, while etc)声明函数

尽管浏览器允许你分配函数给一个变量,但坏消息是,不同的浏览器用不同的方式解析它
如果一定要定义函数,请用函数表达式方式声明;
如:
    function b(){
    ...
    }

    if(a){
        function b(){
            ...
        }
    }

    var b=function(){
    ...
    }
    if(a){
        b=function(){
            ....
        }
    }

有else的if都要有{}

    if(a)
        b()
    else
        c();

    if(a){
        b();
    }else{
        c();
    }

不要有多余逗号

这会在IE6、IE7和IE9的怪异模式中导致一些问题;同时,在ES3的一些实现中,多余的逗号会增加数组的长度。在ES5中已经澄清
 var hero = {
    firstName: 'Kevin',
    lastName: 'Flynn',
  };

  var heroes = [
    'Batman',
    'Superman',
  ];

  var hero = {
    firstName: 'Kevin',
    lastName: 'Flynn'
  };

  var heroes = [
    'Batman',
    'Superman'
  ];

使用事件代理

在分配低调(unobtrusive)的事件监听器时,通常可接受的做法是把事件监听器直接分派给那些会触发某个结果动作的元素。不过,偶尔也会有多个元素同时符合触发条件,给每个元素都分配事件监听器可能会对性能有负面影响。这种情况下,你就应该改用事件代理了

图片

尽量使用png8替代gif图片

不要在移动端手机使用gif动画图片

使用雪碧图,减少css背景图的加载

使用第三方工具压缩png24的图片,可以有非常高的压缩率

fenglinzeng commented 8 years ago

不要在移动端手机也没使用gif动画图片

最后一句话的描述没看懂。

mishe commented 8 years ago

谢谢指出,已改

monkey65535 commented 8 years ago

不太明白 为什么不能再移动端使用gif动画图片? 朋友圈不是满地gif么?

orionorth commented 8 years ago

您好,CSS的选择器的排列结构和属性的顺序有什么讲究吗? 比如: margin font background 顺序是怎么样的会比较舒服一点 能否添加一点这些内容?

DeepenLau commented 8 years ago

用位运算符效率不是更高吗?用了会有什么隐患吗

mishe commented 8 years ago

前端团队很少有科班出身的,位运算符效率不见得会有太高的性能,优势非常不明显,出发是高强度的算法需要,否则还是不要有位运算;它会造成代码的苦涩难懂,不利于后续的维护

DeepenLau commented 8 years ago

了解,谢谢~

mishe commented 8 years ago

手机端不适用GIF图的原因是:1.可以用css3动画来代替,css3动画只出发页面复合,性能更好,2 gif动画都在手机端显示不流畅,不能使用GPU加速,会造成页面重排,严重影响页面性能

Yunkou commented 8 years ago

css 多行还是一行的问题,我的见解 1. 现在纯手写css比较少了,一般 都是用sass 和 less 来管理样式。 2 书写sass 和 less 一行简直就是灾难 3 css 多行书写,还有个好处,可以要求团队,css 输出按照盒子模型的顺序去书写,更好维护,不强制但是倡导输出是一致的。

mishe commented 8 years ago

css 一行主要是引入component css的和css module的概念,方便直观的感受css module,写成多行的话,无法直观界定,一个module的样式,可能会有100行,甚至N行,但采用一行的方式,一般一个module的css ,估计最多也就50行。当然借助webpack来做CSS module 完全没有必要写成一行,也没必要自我约束的css module方式

mishe commented 8 years ago

CSS的选择器的排列结构和属性的顺序有什么讲究吗?

1.对于这个我个人不太关注,曾几何时流行过把css样式分离成多个文件,排版布局css+ 颜色css+... 2.个人认为没有太大的必要来强制约束这些定义,css的解析速度不取决于你的样式代码编写的前后顺序,至少没有明确的浏览器引擎说这方面的问题。

  1. 基于单行css方式,建议把position,float,width,height,margin,padding元素的属性放在前列,把其他属性放在后面。
  2. css3由于有严重的私有特性,建议换行编写,也就是分2行排列
zcyzcy88 commented 8 years ago

使用&& 和 || 替代简单的if @mishe

反对。

用位运算符效率不是更高吗?用了会有什么隐患吗 @DeepenLau

  • 因为 JavaScript 中只有一种数字数据类型:64位浮点数。所以用位运算符不会提高效率。