前端性能优化

一、PC端优化策略 

  主要包括网络加载类、页面渲染类、CSS优化类、JavaScript执行类、缓存类、图片类、架构协议类等几类;
1、网络加载类
(1)减少HTTP资源请求次数:
  在前端页面中,通常建议尽可能合并静态资源图片、JavaScript或CSS代码,减少页面请求数和资源请求消耗,这样可以缩短首屏加载时间,通过构建工具合并雪碧图、CSS、JavaScript文件等都是为了减少HTTP资源请求次数,另外也要尽量避免重复的资源,防止增加多余请求;
(2)减少HTTP请求大小:
  除了减少HTTP资源请求次数,也要尽量减少每个HTTP请求的大小,如减少没必要的图片、JavaScript、CSS 及 HTML 代码,对文件进行压缩优化,或者使用gzip压缩传输内容等都可以用来减少文件大小,缩短网络传输等待时延,使用构建工具来压缩静态图片资源以及移除代码中的注释并压缩,目的都是为了减少HTTP请求的大小;
(3)将CSS或JavaScript放到外部文件中,避免使用style或script标签直接引入:
  在HTML文件上引用外部资源可以有效利用浏览器的静态资源缓存,但有时候在移动端页面CSS或JavaScript比较简单的情况下为了减少请求,也会将CSS或JavaScript直接写到HTML里面,具体要根据CSS或JavaScript文件的大小和业务的场景来分析,如果CSS或JavaScript文件内容较多,业务逻辑较复杂,建议放到外部文件引入;
  <link rel="stylesheet" href="/css/master.css">
  <script type="text/javascript" src="//cdn.domain.com/path/main.js"></script>
(4)避免页面中空的href和src:
  当<link>标签的href属性为空,或<script>、<img>、<iframe>标签的src属性为空时,浏览器在渲染过程中仍会将href属性或者src属性中的空内容进行加载,直至加载失败,这样就阻塞了页面中其他资源的下载进程,而且最终加载到的内容是无效的,因此要尽量避免;
  <!--不推荐-->
  <img src="" alt="photo" >
  <a href="">点击链接</a>
(5)为HTML指定Cache-Control或Expires:
  为HTML内容设置Cache-Control 或 Expires可以将HTML内容缓存起来,避免频繁向服务器端发送请求,在页面中的Cache-Control 或 Expires头部有效时,浏览器将直接从缓存中读取内容,不再向服务器端发送请求;
  <meta http-equiv="Cache-Control" content="max-age=7200">
  <meta http-equiv="Expires" content="Mon,20Jul201623:00:00GMT">
(6)合理设置Etag和Last-Modified:
  合理设置Etag 和 Last-Modified使用浏览器缓存,对于未修改的文件,静态资源服务器会向浏览器端返回304,让浏览器从缓存中读取文件,减少Web资源下载的带宽消耗并降低服务器负载;
  <meta http-equiv="last-modified" content="Sun,05 Nov 2017 13:45:57 GMT">
(7)减少页面重定向:
  页面每次重定向都会延长页面内容返回的等待延时,一次重定向大约需要200毫秒不等的时间开销(无缓存),为了保证用户尽快看到页面内容,要尽量避免页面重定向;
(8)使用静态资源分域存放来增加下载并行数:
  浏览器在同一时刻向同一域名请求文件的并行下载数是有限的,因此可以利用多个域名的主机来存放不同的静态资源,增大页面加载时资源的并行下载数,缩短页面资源加载的时间,通常根据多个域名来分别存储JavaScript、CSS和图片文件;
  <link rel="stylesheet" href="//cdn1.domain.com/path/main.css" >
  <script src="//cdn2.domain.com/path/main.js"></script>
(9)使用静态资源CDN来存储文件:
  如果条件允许,可以利用CDN网络加快同一个地理区域内重复静态资源文件的响应下载速度,缩短资源请求时间;
(10)使用CDN Combo下载传输内容:
  CDN Combo是在CDN服务器端将多个文件请求打包成一个文件的形式来返回的技术,这样可以实现HTTP连接传输的一次性复用,减少浏览器的HTTP请求数,加快资源下载速度,例如同一个域名CDN服务器上的a.js,b.js,c.js就可以按如下方式在一个请求中下载:
  <script src="//cdn.domain.com/path/a.js,b.js,c.js"></script>
(11)使用可缓存的AJAX:
  对于返回内容相同的请求,没必要每次都直接从服务端拉取,合理使用AJAX缓存能加快AJAX响应速度并减轻服务器压力;
  $.ajax({
    url: url,
    type: 'get',
    cache: true, //推荐使用缓存
    data: {},
    success() {},
    error() {}
  });
(12)使用GET来完成AJAX请求:
  使用XMLHttpRequest时,浏览器中的POST方法会发起两次TCP数据包传输,首先会发送文件头,然后发送HTTP正文数据,而使用GET时只发送头部,所以在拉取服务端数据时使用GET请求效率更高;
  $.ajax({
    url: url,
    type: 'get', //推荐使用get完成请求
    data: {},
    success() {},
    error() {}
  });
(13)减少Cookie的大小并进行Cookie隔离:
  HTTP请求通常默认带上浏览器端的Cookie一起发送给服务器,所以在非必要的情况下,要尽量减少Cookie来减少HTTP请求的大小,对于静态资源,尽量使用不同的域名来存放,因为Cookie默认是不能跨域的,这样就做到了不同域名下静态资源请求的Cookie隔离;
(14)缩小favicon.ico并缓存:
  有利favicon.ico的重复加载,因为一般一个Web应用的favicon.ico是很少改变的;
(15)推荐使用异步JavaScript资源:
  异步的JavaScript资源不会阻塞文档解析,所以允许在浏览器中优先渲染页面,延后加载脚本执行,例如JavaScript的引用可以如下设置,也可以使用模块化加载机制来实现;其中使用async时,加载和渲染后续文档元素的过程和main.js的加载与执行是并行的;使用defer时,加载后续文档元素的过程和main.js的加载是并行的,但是main.js的执行要在页面所有元素解析完成之后才开始执行;
  <script src="main.js" defer></script>
  <script src="main.js" async></script>
(16)消除阻塞渲染的CSS及JavaScript:
  对于页面中加载时间过长的CSS或JavaScript文件,需要进行合理拆分或延后加载,保证关键路径的资源能快速加载完成;
(17)避免使用CSS import引用加载CSS:
  CSS中的@import可以从另一个样式文件中引入样式,但应该避免这种用法,因为这样会增加CSS资源加载的关键路径长度,带有@import的CSS样式需要在CSS文件串行解析到@import时才会加载另外的CSS文件,大大延后CSS渲染完成的时间;
  <!--不推荐-->
  <style>
  @import "path/main.css";
  </style>
  <!--推荐-->
  <link rel="stylesheet" href="//cdn1.domain.com/path/main.css" >

2、页面渲染类
(1)把CSS资源引用放到HTML文件顶部:
  一般推荐将所有CSS资源指定在HTML文档<head>中,这样浏览器可以优先下载CSS并尽早完成页面渲染;
(2)JavaScript资源引用放到HTML文件底部:
  JavaScript资源放到HTML文档底部可以防止JavaScript的加载和解析执行对页面渲染造成阻塞,由于JavaScript资源默认是解析阻塞的,除非被标记为异步或者通过其他的异步方式加载,否则会阻塞HTML DOM解析和CSS渲染过程;
(3)尽量预先设定图片等大小:
  在加载大量的图片元素时,尽量预先限定图片的尺寸大小,否则在图片加载过程中会更新图片的排版信息,产生大量的重排;
(4)不要在HTML中直接缩放图片:
  在HTML中直接缩放图片会导致页面内容的重排重绘,此时可能会使页面中的其他操作产生卡顿,因此要尽量减少在页面中直接进行图片缩放;
(5)减少DOM元素数量和深度:
  HTML中标签元素越多,标签的层级越深,浏览器解析DOM并绘制到浏览器中所花的时间就越长,所以应尽可能保持DOM元素简洁和层级较少;
  <!--不推荐-->
  <div>
    <span>
        <a href="javascript:void(0);">
            <img src="./path/photo.jpg" alt="图片">
        </a>
    </span>
  </div>
  <!--推荐-->
  <img src="./path/photo.jpg" alt="图片" >
(6)尽量避免在选择器末尾添加通配符:
  CSS解析匹配到渲染树的过程是从右到左的逆向匹配,在选择器末尾添加通配符至少会增加一倍多计算量;
(7)减少使用关系型样式表的写法:
  直接使用唯一的类名即可最大限度的提升渲染引擎绘制渲染树的效率;
(8)尽量减少使用JS动画:
  JS直接操作DOM极容易引起页面的重排;
(9)CSS动画使用translate、scale代替top、height:
  尽量使用CSS3的translate、scale属性代替top、left和height、width,避免大量的重排计算;
(10)尽量避免使用<table>、<iframe>:
  <table>内容的渲染是将table的DOM渲染树全部生成完并一次性绘制到页面上的,所以在长表格渲染时很耗性能,应该尽量避免使用它,可以考虑使用列表元素<ul>代替;尽量使用异步的方式动态添加iframe,因为iframe内资源的下载进程会阻塞父页面静态资源的下载与CSS及HTML DOM的解析;
(11)避免运行耗时的JavaScript:
  长时间运行的JavaScript会阻塞浏览器构建DOM树、DOM渲染树、渲染页面,所以任何与页面初次渲染无关的逻辑功能都应该延迟加载执行,这和JavaScript资源的异步加载思路是一致的;
(12)避免使用CSS表达式或CSS滤镜:
  CSS表达式或CSS滤镜的解析渲染速度是比较慢的,在有其他解决方案的情况下应该尽量避免使用;
  //不推荐
  .opacity{
    filter : progid : DXImageTransform.Microsoft.Alpha( opacity = 50 );
  }


二、移动端优化策略

1、网络加载类
(1)首屏数据请求提前,避免JavaScript文件加载后才请求数据:
  为了进一步提升页面加载速度,可以考虑将页面的数据请求尽可能提前,避免在JavaScript加载完成后才去请求数据,通常数据请求是页面内容渲染中关键路径最长的部分,而且不能并行,所以如果能将数据请求提前,可以极大程度缩短页面内容的渲染完成时间;
(2)首屏加载和按需加载,非首屏内容滚屏加载,保证首屏内容最小化:
  由于移动端网络速度相对较慢,网络资源有限,因此为了尽快完成页面内容的加载,需要保证首屏加载资源最小化,非首屏内容使用滚动的方式异步加载,一般推荐移动端页面首屏数据展示延时最长不超过3秒,目前中国联通3G的网络速度为338KB/s (2.71Mb/s),所以推荐首屏所有资源大小不超过1014KB,即大约不超过1MB;
(3)模块化资源并行下载:
  在移动端资源加载中,尽量保证JavaScript资源并行加载,主要指的是模块化JavaScript资源的异步加载,例如AMD的异步模块,使用并行的加载方式能够缩短多个文件资源的加载时间;
(4)inline首屏必备的CSS和JavaScript:
  通常为了在HTML加载完成时能使浏览器中有基本的样式,需要将页面渲染时必备的CSS和JavaScript通过<script>或<style>内联到页面中,避免页面HTML载入完成到页面内容展示这段过程中页面出现空白;
  <!DOCTYPE html>
  <head>
    <meta charset="UTF-8">
    <title>样例</title>
    <meta>
    <style>
      /*必备的首屏CSS*/
      html,
      body {
        margin: 0;
        padding: 0;
        background-color: #ccc;
      }
    </style>
  </head>
  <body>
  </body>
  </html>
(5)meta dns prefetch设置DNS预解析:
  设置文件资源的DNS预解析,让浏览器提前解析获取静态资源的主机IP,避免等到请求时才发起DNS解析请求,通常在移动端HTML中可以采用如下方式完成:
  <!--cdn域名预解析-->
  <meta http-equiv="x-dns-prefetch-control" content="on" >
  <link rel="dns-prefetch" href="//cdn.domain.com" >
(6)资源预加载:
  对于移动端首屏加载后可能会被使用的资源,需要在首屏完成加载后尽快进行加载,保证在用户需要浏览时已经加载完成,这时候如果再去异步请求就显得很慢;
(7)合理利用MTU策略:
  通常情况下,我们认为TCP网络传输的最大传输单元(Maximum Transmission Unit,MTU)为 1500B,即一个 RTT(Round-Trip Time,网络请求往返时间)内可以传输的数据量最大为1500字节,因此在前后端分离的开发模式中,尽量保证页面的HTML内容在1KB以内,这样整个HTML的内容请求就可以在一个RTT内请求完成,最大限度地提高HTML载入速度;

2、缓存类
(1)合理利用浏览器缓存:
  除了上面所说的Cache-Control、Expires、Etag 和 Last-Modified来设置HTTP缓存外,在移动端还可以使用localStorage等来保存AJAX返回的数据,或者使用localStorage保存CSS或JavaScript静态资源内容,实现移动端的离线应用,尽可能减少网络请求,保证静态资源内容的快速加载;
(2)静态资源离线方案:
  对于移动端或Hybrid应用,可以设置离线文件或离线包机制让静态资源请求从本地读取,加快资源载入速度,并实现离线更新;
(3)尝试使用AMP HTML
  AMP HTML可以作为优化前端页面性能的一个解决方案,使用AMP Component中的元素来代替原始的页面元素进行直接渲染;
  <!--不推荐-->
  <video width="400" height="300" src="//www.domain.com/videos/myvideo.mp4"
  poster="path/poster.jpg">
  <div fallback>
    <p>Your browser doesn’t support HTML5 video</p>
  </div>
  <source type="video/mp4" src="foo.mp4">
  <source type="video/webm" src="foo.webm">
  </video>
  <!--推荐-->
  <amp-video width="400" height="300" src="//www.domain.com/videos/myvideo.mp4" poster="path/poster.jpg">
  <div fallback>
    <p>Your browser doesn’t support HTML5 video</p>
  </div>
  <source type="video/mp4" src="foo.mp4">
  <source type="video/webm" src="foo.webm">
  </amp-video>
(4)尝试使用PWA模式:
  PWA(Progressive Web Apps)是 Google 提出的用前沿的 Web 技术为网页提供 App 般使用体验的一系列方案;

3、图片类
(1)图片压缩处理:
  在移动端,通常要保证页面中一切用到的图片都是经过压缩优化处理的,而不是以原图的形式直接使用的,因为那样很消耗流量,而且加载时间更长;
(2)使用较小的图片,合理使用base64内嵌图片:
  在页面使用的背景图片不多且较小的情况下,可以将图片转化成base64编码嵌入到HTML页面或CSS文件中,这样可以减少页面的HTTP请求数,需要注意的是,要保证图片较小,一般图片大小超过2KB就不推荐使用base64嵌入显示了;
  .class-name{
    background-image : url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAALCAMAAABxsOwqAAAAYFBMVEWnxwusyQukxQudwQyZvgyhxAyfwgyxzAsUHQGOuA0aJAERGAFIXwSTugyEqgtqhghQZgUwQQIpOQKbuguVtQuKrAuCowp2kQlheghTbQZHWQU7SwVAVgQ6TgQlLwMeKwFOemyQAAAAVElEQVQI1y3JVRaAIAAF0UconXbvf5ei8HfPDIQQhBAAFE10iKig3SLRNN4SP/p+N08VC0YnfIlNWtqIkhg/TPYbCvhqdHAWRXPZSp3g3CWZvVLXC6OJA3ukv0AaAAAAAElFTkSuQmCC');
  }
(3)使用更高压缩比格式的图片:
  使用具有较高压缩比格式的图片,如webp(需要设计降级兼容方案)等,在同等图片画质的情况下,高压缩比格式的图片体积更小,能够更快完成文件传输,节省网络流量;
  <img src="//cdn.domain.com/path/photo.webp" alt="webp格式图片" >
(4)图片懒加载:
  为了保证页面内容的最小化,加速页面的渲染,尽可能节省移动端网络流量,页面中的图片资源推荐使用懒加载实现,在页面滚动时动态载入图片;
  <img data-src="//cdn.domain.com/path/photo.jpg" alt="懒加载图片" >
(5)使用MediaQuery 或 srcset根据不同屏幕加载不同大小图片:
  针对不同的移动端屏幕尺寸和分辨率,输出不同大小的图片或背景图能保证在用户体验不降低的前提下节省网络流量,加快部分机型的图片加载速度,这在移动端非常值得推荐;
(6)使用iconfont代替图片图标:
  在页面中尽可能使用iconfont来代替图片图标,这样做的好处有:使用iconfont体积较小,而且是矢量图,因此缩放时不会失真;可以方便地修改图片大小尺寸和呈现颜色;但是需要注意的是,iconfont引用不同webfont格式时的兼容性写法,根据经验推荐尽量按照以下顺序书写,否则不容易兼容到所有的浏览器上;
  @font-face{
    font-family:iconfont;
    src:url("./iconfont.eot");
    src:url("./iconfont.eot?#iefix") format("eot"),
    url("./iconfont.woff") format("woff"),
    url("./iconfont.ttf") format("truetype");
  }
(7)定义图片大小限制:
  加载的单张图片一般建议不超过30KB,避免大图片加载时间长而阻塞页面其他资源的下载,因此推荐10KB以内,如果用户上传的图片过大,建议设置告警系统,帮助我们观察了解整个网站的图片流量情况,做出进一步的改善;
(8)强缓存策略:
  对于一些永远不会变的图片可以使用强缓存的方式缓存在用户的浏览器上;

4、脚本类
(1)尽量使用id:
  选择器选择页面DOM元素时尽量使用id选择器,因为id选择器速度最快;
(2)合理缓存DOM对象:
  对于需要重复使用的DOM对象,要优先设置缓存变量,避免每次使用时都要从整个DOM树中重新查找;
  //不推荐
  $('#mod.active').remove('active');
  $('#mod.not-active').addClass('active');
  //推荐
  let $mod=$('#mod');
  $mod.find('.active').remove('active');
  $mod.find('.not-active').addClass('active');
(3)页面元素尽量使用事件代理,避免直接事件绑定:
  使用事件代理可以避免对每个元素都进行绑定,并且可以避免出现内存泄露及需要动态添加元素的事件绑定问题,所以尽量不要直接使用事件绑定;
  //不推荐
  $('.btn').on('click',function(e){
    console.log(this);
  });
  //推荐
  $('body').on('click','.btn',function(e){
    console.log(this);
  });
(4)使用touchstart代替click:
  由于移动端屏幕的设计,touchstart事件和click事件触发时间之间存在300毫秒的延时,所以在页面中没有实现touchmove滚动处理的情况下,可以使用touchstart事件来代替元素的click事件,加快页面点击的响应速度,提高用户体验,但同时我们也要注意页面重叠元素touch动作的点击穿透问题;
  //不推荐
  $('body').on('click','.btn',function(e){
    console.log(this);
  });
  //推荐
  $('body').on('touchstart','.btn',function(e){
    console.log(this);
  });
(5)避免touchmove、scroll连续事件处理:
  需要对touchmove、scroll这类可能连续触发回调的事件设置事件节流,例如设置每隔16ms(60帧的帧间隔为16.7ms,因此可以合理地设置为16ms)才进行一次事件处理,避免频繁的事件调用导致移动端页面卡顿;
  //不推荐
  $('.scroller').on('touchmove','.btn',function(e){
    console.log(this);
  });
  //推荐
  $('.scroller').on('touchmove','.btn',function(e){
    let self=this;
    setTimeout(function(){
      console.log(self);
    },16);
  });
(6)避免使用eval、with,使用join代替连接符+,推荐使用ECMAScript6的字符串模板,这些都是一些基础的安全脚本编写问题,尽可能使用较高效率的特性来完成这些操作,避免不规范或不安全的写法;
(7)尽量使用ECMAScript6+的特性来编程:
  ECMAScript6+一定程序上更加安全高效,而且部分特性执行速度更快,也是未来规范的需要,所以推荐使用ECMAScript6+的新特性来完成后面的开发;

5、渲染类
(1)使用Viewport固定屏幕渲染,可以加速页面渲染内容:
   一般认为,在移动端设置Viewport可以加速页面的渲染,同时可以避免缩放导致页面重排重绘;
(2)避免各种形式重排重绘:
  页面的重排重绘很耗性能,所以一定要尽可能减少页面的重排重绘,例如页面图片大小变化,元素位置变化等这些情况都会导致重排重绘;
(3)使用CSS3动画,开启GPU加速:
  使用CSS3动画时可以设置transform:translateZ(0) 来开启移动设备浏览器的GPU图形处理加速,让动画过程更加流畅,但需要注意的是,在Native WebView 下 GPU 加速有几率产生 App Crash;
  -webkit-transform:translateZ(0);
  -ms-transform:translateZ(0);
  -o-transform:translateZ(0);
  transform:translateZ(0);
(4)合理使用Canvas 和 requestAnimationFrame:
  选择Canvas 或requestAnimationFrame等更高效的动画实现方式,尽量避免使用setTimeout、setInterval等方式来直接处理连续动画;
(5)SVG 代替图片:
  部分情况下可以考虑使用SVG 代替图片实现动画,因为使用SVG格式内容更小,而且SVG DOM结构方便调整;
(6)不滥用float:
  在DOM渲染树生成后的布局渲染阶段,使用float的元素布局计算比较耗性能,所以尽量减少float的使用,推荐使用固定布局或flex-box弹性布局的方式来实现页面元素布局;
(7)不滥用web字体或过多font-size声明:
  过多的font-size声明会增加字体的大小计算,而且也没有必要;
(8)做好脚本容错:
  脚本容错可以避免非正常环境的执行错误影响页面的加载和不相关功能的使用;

6、架构协议类
(1)尝试使用 SPDY 和 HTTP2:
  在条件允许的情况下可以考虑使用 SPDY 协议来进行文件资源传输,利用连接复用加快传输过程,缩短资源加载时间,HTTP2 在未来也是可以考虑尝试的;
(2)使用后端数据渲染:
  使用后端数据渲染的方式可以加快页面内容的渲染展示,避免空白页面的出现,同时可以解决移动端页面 SEO 的问题,如果条件允许,后端数据渲染是一个很不错的实践思路;
(3)使用 NativeView 代替 DOM 的性能劣势:
  可以尝试使用 NativeView 的 MNV* 开发模式来避免 HTML DOM 性能慢的问题,目前使用 MNV* 的开发模式已经可以将页面内容渲染体验做到接近客户端 Native 应用的体验了,但需要避免 js Framework 和 native Framework 的频繁交互;

雅虎网站性能优化的 14 条规则:

尽可能减少 HTTP 请求数

使用 CDN(内容分发网络)

为文件头指定 Expires 或 Cache-Control,使内容具有缓存性

使用 Gzip 压缩内容

把 CSS 放到顶部

把 JavaScript 放在底部

避免在 CSS 中使用 Expressions

把 JavaScript 和 CSS 都放到外部文件中

减少 DNS 查找次数

压缩 JavaScript 和 CSS

避免重定向

剔除重复的 JavaScript 和 CSS

配置 Etags

使 AJAX 缓存

对规则的分析:

代码编写方面的规则:

把 CSS 放到顶部

把 JavaScript 放在底部

把 JavaScript 和 CSS 都放到外部文件中

避免在 CSS 中使用 Expressions

使 AJAX 缓存

打包方面的规则:

尽可能减少 HTTP 请求数

压缩 JavaScript 和 CSS

剔除重复的 JavaScript 和 CSS

部署方面的规则:

使用 CDN(内容分发网络)

为文件头指定 Expires 或 Cache-Control,使内容具有缓存性

使用 Gzip 压缩内容

减少 DNS 查找次数

避免重定向

配置 Etags

对规则的实践

部署方面的规则,应用 Nginx 为静态文件添加 Expires 跟 Cache-Control 头,

配置 Etags,并启用 Gzip 压缩。并且避免在 Nginx 中做重定向,有条件的话可以

启用 CDN,并优化网络配置以减少 DNS 查找次数。

代码编写方面的规则,需要在编写代码种形成规范。默认使用类似 jQuery 这样的库

便可以对 AJAX 进行缓存。

打包方面 Linner 可以合并 JavaScript 与 CSS 文件, 并且支持小图片的合并,用以减少 HTTP 请求数。同时 Linner 的仓库管理可以避免重复的 JavaScript 与 CSS文件的出现。在build过后所有的文件将会被压缩。


三、前端SEO优化

一、搜索引擎工作原理

  当我们在输入框中输入关键词,点击搜索或查询时,然后得到结果。深究其背后的故事,搜索引擎做了很多事情。

  在搜索引擎网站,比如百度,在其后台有一个非常庞大的数据库,里面存储了海量的关键词,而每个关键词又对应着很多网址,这些网址是百度程序从茫茫的互联网上一点一点下载收集而来的,这些程序称之为“搜索引擎蜘蛛”或“网络爬虫”。这些勤劳的“蜘蛛”每天在互联网上爬行,从一个链接到另一个链接,下载其中的内容,进行分析提炼,找到其中的关键词,如果“蜘蛛”认为关键词在数据库中没有而对用户是有用的便存入数据库。反之,如果“蜘蛛”认为是垃圾信息或重复信息,就舍弃不要,继续爬行,寻找最新的、有用的信息保存起来提供用户搜索。当用户搜索时,就能检索出与关键字相关的网址显示给访客。

  一个关键词对用多个网址,因此就出现了排序的问题,相应的当与关键词最吻合的网址就会排在前面了。在“蜘蛛”抓取网页内容,提炼关键词的这个过程中,就存在一个问题:“蜘蛛”能否看懂。如果网站内容是flash和js,那么它是看不懂的,会犯迷糊,即使关键字再贴切也没用。相应的,如果网站内容是它的语言,那么它便能看懂,它的语言即SEO。

二、SEO简介

  全称:Search English Optimization,搜索引擎优化。自从有了搜索引擎,SEO便诞生了。

  存在的意义:为了提升网页在搜索引擎自然搜索结果中的收录数量以及排序位置而做的优化行为。简言之,就是希望百度等搜索引擎能多多我们收录精心制作后的网站,并且在别人访问时网站能排在前面。

  分类:白帽SEO和黑帽SEO。白帽SEO,起到了改良和规范网站设计的作用,使网站对搜索引擎和用户更加友好,并且网站也能从搜索引擎中获取合理的流量,这是搜索引擎鼓励和支持的。黑帽SEO,利用和放大搜索引擎政策缺陷来获取更多用户的访问量,这类行为大多是欺骗搜索引擎,一般搜索引擎公司是不支持与鼓励的。本文针对白帽SEO,那么白帽SEO能做什么呢?

  1. 对网站的标题、关键字、描述精心设置,反映网站的定位,让搜索引擎明白网站是做什么的;

  2. 网站内容优化:内容与关键字的对应,增加关键字的密度;

  3. 在网站上合理设置Robot.txt文件;

  4. 生成针对搜索引擎友好的网站地图;

  5. 增加外部链接,到各个网站上宣传;

三、前端SEO

  通过网站的结构布局设计和网页代码优化,使前端页面既能让浏览器用户能够看懂,也能让“蜘蛛”看懂。

搜索对着三项的权重逐个减小,title值强调重点即可;description把页面内容高度概括,不可过分堆砌关键词;keywords列举出重要关键词。

(一)合理的title、description、keywords

1、title

title,就是浏览器上显示的那些内容,不仅用户能看到,也能被搜索引擎检索到(搜索引擎在抓取网页时,最先读取的就是网页标题,所以title是否正确设置极其重要。)title一般不超过80个字符,而且词语间要用英文“-”隔开,因为计算机只对英语的敏感性较高,对汉语的敏感性不高。

用法:<title>网站标题</title>

(1)首页title写法,一般是“网站名称-主关键词或一句含有主关键词的描述”。一般网站名称放后面,因为搜索引擎给予标题最前面的词比后面的高。比如,做“冰箱”这个词,就这样写“冰箱_变频冰箱-海尔官网”。

(2)栏目页title写法,一般有2种:“栏目名称-网站名称”、“栏目名称栏目关键词-网站名称”。而且栏目名称最好用关键词来确定,比如企业招聘栏目最好就用企业招聘,而不要起个让人无法识别的名字如企业来人,企业看看,或企业加上一些特殊符号,这种写法虽然很有个性,但会让你的网站在优化上占了下风。

(3)分类列表页title写法,一般是“分类列表页名称-栏目名称-网站名称”,这个和栏目页差不多。

(4)文章页title写法,一般有3种:“文章标题-网站名称”、“内容标题-栏目名称”、“内容标题-栏目名称-网站名称”。其中,“内容标题-栏目名称-网站名称”的写法最为规范,但也相对复杂,它能给用户很好的提示,让用户知道他在访问哪篇文章,并且是在哪个网站的哪个栏目下。

2、description(内容摘要)

description是对于一个网页的简要内容概况。description一般不超过150个字符,描述内容要和页面内容相关。

用法:<meta name=”Description” Content=”你网页的简述”>

(1)首页description写法,一般是将首页的标题、关键词和一些特殊栏目的内容融合到里面,写成简单的介绍。

(2)栏目页description写法,一般是将栏目的标题、关键字、分类列表名称融合到里面,写成简单的介绍。

(3)分类列表页description,这个就比较简单了,一般只需要把分类列表的标题、关键词融合在一起,写成简单的介绍。

(4)文章页description写法,一般有2种写法,标准写法就和前面的一样,将文章标题、文章中的重要内容和关键词融合在一起,写成简单的介绍。这是最好最标准的写法。但是这样写比较麻烦,还有一种种偷懒的方法,你可以在文章首段和标题中加入关键词,比如我这篇文章是讲title、keywords、description的,那么在文章首段和标题中就加入这些内容,然后直接将文章首段的内容复制到description中即可。

3、keywords(关键词)

keywords,主要作用是告诉搜索引擎本页内容是围绕哪些词展开的。因此keywords的每个词都要能在内容中找到相应匹配,才有利于排名。keywords一般不超过3个,每个关键词不宜过长,而且词语间要用英文“,”隔开。为什么用英文上文已经说过。而且,尽量将重要的关键字靠前放,因为靠后的关键字排名较差,除非你站有很高的权重。

用法:<meta name=”Keywords” Content=”关键词1,关键词2,关键词3,关键词4″>

(1)首页keywords写法,一般是“网站名称,主要栏目名,主要关键词”。

(2)栏目页keywords写法,一般是“栏目名称,栏目关键字,栏目分类列表名称”。

(3)分类列表页keywords写法,这个就比较简单了,只要将你这个栏目中的主要关键字写入即可。

(4)文章页keywords写法,建议大家提取文章中的关键词,比如我的文章主要是讲SEO优化的,那么我关键词肯定是SEO优化,如果你觉得你提取关键词的能力较差,也可以选择文章中出现比较多的词来作为关键词,比如我现在写的内容是关于title、keywords、description的,那我的文章页关键词就是这3个。

(二)语义化的HTML代码,符合W3C规范:语义化代码让搜索引擎容易理解网页

1. 什么是HTML语义化

    什么是HTML语义化,我的理解是: 用最恰当的标签来标记内容。通俗的说,就是告诉你:“这是一个一级标题或二级标题”,“这是一个段落”,“这是头部”,“这是一个导航栏”,并不会告诉你:“这是红色的”,“这个有多么宽,多么高”。标题脱了CSS这层外衣,它还是一个标题。这就是简单的HTML语义化:表现网页的结构。语义化的HTML元素指的是那些使用最恰当的HTML进行标记的内容,在标记构成中并不关心内容显示。语义化的HTML是构建有效网站的基石。

2、在写HTML代码时应该注意

    尽可能少的使用无语义的标签div和span;

    在语义不明显时,既可以使用div或者p时,尽量用p, 因为p在默认情况下有上下间距,对兼容特殊终端有利;

    不要使用纯样式标签,如:b、font、u等,改用css设置。

    需要强调的文本,可以包含在strong或者em标签中(浏览器预设样式,能用CSS指定就不用他们),strong默认样式是加粗(不要用b),em是斜体(不用i);

    使用表格时,标题要用caption,表头用thead,主体部分用tbody包围,尾部用tfoot包围。表头和一般单元格要区分开,表头用th,单元格用td;

    表单域要用fieldset标签包起来,并用legend标签说明表单的用途;

    每个input标签对应的说明文本都需要使用label标签,并且通过为input设置id属性,在lable标签中设置for=someld来让说明文本和相对应的input关联起来。

3、HTML5常用的语义元素

    HTML5提供了新的语义元素来定义网页的不同部分,它们被称为“切片元素”,如图所示

常用的语义化元素:

(1)header元素

    header 元素代表“网页”或“section”的页眉。

    通常包含h1-h6元素或hgroup,作为整个页面或者一个内容块的标题。也可以包裹一节的目录部分,一个搜索框,一个nav,或者任何相关logo。

    整个页面没有限制header元素的个数,可以拥有多个,可以为每个内容块增加一个header元素

    <header>

      <hgroup>

    <h1>网站标题</h1>

    <h1>网站副标题</h1>

      </hgroup>

    </header>

header使用注意:

    可以是“网页”或任意“section”的头部部分;

    没有个数限制。

    如果hgroup或h1-h6自己就能工作的很好,那就不要用header。

(2)footer元素

footer元素代表“网页”或“section”的页脚,通常含有该节的一些基本信息,譬如:作者,相关文档链接,版权资料。如果footer元素包含了整个节,那么它们就代表附录,索引,提拔,许可协议,标签,类别等一些其他类似信息。

<footer> 我是页脚 </footer>

footer使用注意:

    可以是“网页”或任意“section”的底部部分;

    没有个数限制,除了包裹的内容不一样,其他跟header类似。

(3)hgroup元素

hgroup元素代表“网页”或“section”的标题,当元素有多个层级时,该元素可以将h1到h6元素放在其内,譬如文章的主标题和副标题的组合

    <hgroup>

      <h1>这是一篇介绍HTML 5语义化标签和更简洁的结构</h1>

      <h2>HTML 5</h2>

    </hgroup>

hgroup使用注意:

    如果只需要一个h1-h6标签就不用hgroup

    如果有连续多个h1-h6标签就用hgroup

    如果有连续多个标题和其他文章数据,h1-h6标签就用hgroup包住,和其他文章元数据一起放入header标签

(4)nav元素

nav元素代表页面的导航链接区域。用于定义页面的主要导航部分。

    <nav>

    <ul>

    <li>HTML 5</li>

    <li>CSS3</li>

    <li>JavaScript</li>

    </ul>

    </nav>

但是我在有些时候却情不自禁的想用它,譬如:侧边栏上目录,面包屑导航,搜索样式,或者下一篇上一篇文章,但是事实上规范上说nav只能用在页面主要导航部分上。页脚区域中的链接列表,虽然指向不同网站的不同区域,譬如服务条款,版权页等,这些footer元素就能够用了。

nav使用注意:

    用在整个页面主要导航部分上,不合适就不要用nav元素;

(5)aside元素

aside元素被包含在article元素中作为主要内容的附属信息部分,其中的内容可以是与当前文章有关的相关资料、标签、名次解释等。(特殊的section)

在article元素之外使用作为页面或站点全局的附属信息部分。最典型的是侧边栏,其中的内容可以是日志串连,其他组的导航,甚至广告,这些内容相关的页面。

    <article>

    <p>内容</p>

    <aside>

    <h1>标题呢</h1>

    <p>这里是内容呢</p>

    </aside>

    </article>

aside使用总结:

    aside在article内表示主要内容的附属信息,

    在article之外则可做侧边栏,没有article与之对应,最好不用。

    如果是广告,其他日志链接或者其他分类导航也可以用

(6)section元素

section元素代表文档中的“节”或“段”,“段”可以是指一篇文章里按照主题的分段;“节”可以是指一个页面里的分组。

section通常还带标题,虽然html5中section会自动给标题h1-h6降级,但是最好手动给他们降级。如下:

    <section>

    <h1>section是啥?</h1>

    <article>

    <h2>关于section</h1>

    <p>section的介绍</p>

    <section>

    <h3>关于其他</h3>

    <p>关于其他section的介绍</p>

    </section>

    </article>

    </section>

section使用注意:

一张页面可以用section划分为简介、文章条目和联系信息。不过在文章内页,最好用article。section不是一般意义上的容器元素,如果想作为样式展示和脚本的便利,可以用div。

    表示文档中的节或者段;

    article、nav、aside可以理解为特殊的section,所以如果可以用article、nav、aside就不要用section,没实际意义的就用div

(7)article元素

article元素最容易跟section和div容易混淆,其实article代表一个在文档,页面或者网站中自成一体的内容,其目的是为了让开发者独立开发或重用。譬如论坛的帖子,博客上的文章,一篇用户的评论,一个互动的widget小工具。(特殊的section)

除了它的内容,article会有一个标题(通常会在header里),会有一个footer页脚。

    <article>

    <h1>一篇文章</h1>

    <p>文章内容..</p>

    <footer>

    <p><small>small内容</small></p>

    </footer>

    </article>

更多语义化元素:https://developer.mozilla.org/en-US/docs/Web/HTML/Element

4、一些简单的语义化举例

下面是一段html代码,我们来进行优化

    <div class="main">

    <div class="h2">标签的语义<a href="#">更多</a></div>

    <div class="p">段落1内容<span class="strong">强调内容</span></div>

    <div class="p">段落2内容</div>

    </div>

上述代码添加CSS样式可以达到效果,但用的只是向div,span这样的无语义标签,我们从标签上看不出结构这样显然是不行的,我们需要用代码清晰表现出:“哪是标题”,“哪是内容”。我们改进一下。

版本一

    <div class="main">

    <h2>标签的语义 <a href="#">更多</a></h2>

    <p>段落一的各种内容.....<strong>强调的内容</strong></p>

    <p>段落二的内容。。。段落二的内容。。。</p>

    </div>

版本一比源代码大有改进,从标签可以分清哪是标题哪是内容,也能看到哪被强调,但仔细看有a链接在h2标签中,虽然它们是在同一行,但a链接并不是属于标题。我们也可以添加HTML5语音元素进行改进:

版本二

    <main>

    <header class="title">

    <h2>标签的语义化</h2>

    <a href="#">更多</a>

    </header>

    <article class="content">

    <p>段落一的各种内容.....<strong>强调的内容</strong></p>

    <p>段落二的内容。。。</p>

    </article>

    </main>

版本二用HTML5定义的新标签是语义化更加完美,写到这里基本上也就可以了,但其实我们还可以利用ARIA(无障碍网页倡议)更加使代码完美。更加具有可读性。

版本三

    <main role="main">

    <header class="title" role="heading">

    <h2>标签的语义化</h2>

    <a href="#">更多</a>

    </header>

    <article class="content" role="contentinfo">

    <p>段落一的各种内容.....<strong>强调的内容</strong></p>

    <p>段落二的内容。。。</p>

    </article>

    </main>

 现在可以看到标签中多了一些role属性,那是ARIA中定义的地标角色定义它们可以使屏幕阅读器更好的工作。当然并不是使用div这些标签就是不重视语义化,有些时候因为样式的需求必须使用这些无语义标签,这时我们就应该大胆使用它们。但能少用尽量少用。

    但是也不要因为html5新标签的出现,而随意用之,错误的使用肯定会事与愿违。所以有些地方还是要用div的,就是因为div没有任何意义的元素,他只是一个标签,仅仅是用来构建外观和结构。因此是最适合做容器的标签。

(三)非装饰性图片必须加alt

<img> 标签的 alt 属性指定了替代文本,用于在图像无法显示或者用户禁用图像显示时,代替图像显示在浏览器中的内容。

示例:<img src="xxx.jpg" alt="海尔官网-双门冰箱" />

1、alt标签的作用:

    增强内容相关性

它是可以利用汉字介绍文章内容的,对于一些特定的企业产品,由于视觉的体验,它往往是少文字的。 

    提高关键词密度

在操作企业站的时候,我们经常遇到是站点首屏一个大的横幅banner,几乎占用了首页的大部分页面,为了有效的提高首页核心关键词密度,我们只能利用一切办法增添关键词,比如:在图片的alt标签中添加。 

(四)友情链接,好的友情链接可以快速的提高你的网站权重

    友情链接,也称为网站交换链接、互惠链接、互换链接、联盟链接等,是具有一定资源互补优势的网站之间的简单合作形式,即分别在自己的网站上放置对方网站的LOGO图片或文字的网站名称,并设置对方网站的超链接(点击后,切换或弹出另一个新的页面),使得用户可以从合作网站中发现自己的网站,达到互相推广的目的,因此常作为一种网站推广基本手段。

    友情链接是指互相在自己的网站上放对方网站的链接。必须要能在网页代码中找到网址和网站名称,而且浏览网页的时候能显示网站名称,这样才叫友情链接。

    友情链接是网站流量来源的根本,比如一种可以自动交换链接的友情链接网站(每来访一个IP,就会自动排到第一),这是一种创新的自助式友情链接互联网模式。

(五)外链,高质量的外链,会给你的网站提高源源不断的权重提升

    外链就是指在别的网站导入自己网站的链接。导入链接对于网站优化来说是非常重要的一个过程。导入链接的质量(即导入链接所在页面的权重)间接影响了我们的网站在搜索引擎中的权重。

    外链是互联网的血液,是链接的一种。没有链接的话,信息就是孤立的,结果就是我们什么都看不到。一个网站是很难做到面面俱到的,因此需要链接到别的网站,将其他网站所能补充的信息吸收过来,连接外链不在于数量,而是在于链接外链的质量。

    外链的效果不只是为了提高网站的权重,也不仅仅是为了提高某个关键词的排名。一个高质量的外部链接是可以给网站带来很好的流量。

(六)向各大搜索引擎登陆入口提交尚未收录站点

百度提交入口:https://ziyuan.baidu.com/linksubmit/url

Google提交入口:http://www.google.com/addurl/?hl=zh-CN&continue=/addurl

360提交入口:http://info.so.360.cn/site_submit.html

搜狗提交入口:http://fankui.help.sogou.com/index.php/web/web/index?type=1

必应提交入口:https://www.bing.com/toolbox/webmaster/(必应的匿名提交url已经取消,需要去登陆Bing网站管理员到“配置我的网站”菜单选项中的“提交URL”工具)

其他的一些优化内容:

1.重要内容HTML代码放在最前:搜索引擎抓取HTML顺序是从上到下,保证重要内容一定会被抓取

2.少用iframe:搜索引擎不会抓取iframe中的内容

3.提高网站速度:网站速度是搜索引擎排序的一个重要指标

4.页面内容尽量不要做成flash、图片、视频,这些东西蜘蛛是抓不到的,就算是必须的,也要生成相应的静态页面。有很多企业站看着很炫,全站flash,老板看着是爽了,做SEO优化的人员就要抓狂了,全站没一个链接。

5.除首页外别的页面最好要加上面包屑型导航,导航结构一定要清晰。

6.做好404页面,一般会加首页链接及错误提示,并测试其返回状态码为404:1、用户体验友好,可以留住用户,不至于直接关闭页面;2、蜘蛛友好,可以返回抓取其他页面。

7.网站结构呈扁平状树型,目录结构不宜过深,每个页面离首页最多点击不超过3次,过深不利于搜索引擎的抓取。

借鉴:https://blog.csdn.net/yuyuking/java/article/details/89374794

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345