zoukankan      html  css  js  c++  java
  • 前端性能优化(prefetch, preload, dns-prefetch, defer, async)

    常用方式:放到</body>之前,解决js运行时找不到dom的问题。

    页面渲染过程(HTML parser)

    <html>
    <head>
        <link rel="stylesheet" type="text/css" href="/style.css">
        <script type="text/javascript" src="/header.js"></script>
    </head>
    <body>
      <p>Text</p>
      <script type="text/javascript" src="/main.js"></script>
    </body>
    </html>
    1. 从上到下parser
    2. 停止parser,下载并解析style.css
    3. parser
    4. 停止parser,下载并执行header.js
    5. parser, 展示 p
    6. 停止parser,下载并执行main.js
    7. parser to end

    如果下载脚本很慢,会造成长时间空白。

    一、减少JS下载时间(dns-prefetch, preload, prefetch)

    预先解析DNS

    用于预解析CDN地址的DNS

    <!--在head标签中,越早越好-->
    <link rel="dns-prefetch" href="//dns.example.com">

    preload (马上要用什么)

    1. 遇到link标签时,立刻下载并放到内存中,不执行js。
    2. 遇到script标签时,将预加载的js执行。
    <link rel="preload" href="./main.js" as="script">

    prefetch(以后可能要用什么)

    1. 浏览器空闲时,下载并缓存到disk
    2. 有页面使用时,从disk中读取
    3. 不要在当前页面马上要用的资源上用prefetch,要用preload(因为prefetch还没加载完成时,遇到script会再次发起请求,加载两次严重影响性能)
    <link rel="prefetch" href="./main.js">

    二、控制JS的执行时机(defer, async)

    defer

    所有元素解析完成后,DOMContentLoaded事件触发之前。

    async

    当前JS脚本加载完成后(加载后立即执行,执行顺序不固定,适合独立无依赖的代码)

    三、完整过程

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Document</title>
      <link rel="dns-prefetch" href="//cdn.com">
      <link rel="preload" href="//cdn.com/js/currentPage-part1.js" as="script">
      <link rel="preload" href="//cdn.com/js/currentPage-part2.js" as="script">
      <link rel="preload" href="//cdn.com/js/currentPage-part3.js" as="script">
    
      <link rel="prefetch" href="//cdn.com/js/otherPage.js">
    </head>
    <body>
      <script src="//cdn.com/js/currentPage-part1.js" defer></script>
      <script src="//cdn.com/js/currentPage-part2.js" defer></script>
      <script src="//cdn.com/js/currentPage-part3.js" defer></script>
    </body>
    </html>
  • 相关阅读:
    Hibernate框架简介
    [leecode]Evaluate Reverse Polish Notation
    linux 服务器之间配置免密登录
    大数据学习系列之一 ----- Hadoop环境搭建(单机)
    Hadoop hbase集群断电数据块被破坏无法启动
    CentOS 6 上安装 pip、setuptools
    CentOs6.7 python2.6升级到2.7.11
    安装phantomjs(Ubuntu版本 MacOS版本)
    Linux/Centos下安装部署phantomjs 及使用
    linux 查看系统磁盘、内存大小
  • 原文地址:https://www.cnblogs.com/zhoulixue/p/14512847.html
Copyright © 2011-2022 走看看