一次移動優化之旅(二)

咱們優化的目標是什麼:使界面早點顯示出來,數據是否正確能夠等待查詢的返回來更新。javascript

前言

上篇介紹了代碼優化的方向:css

  1. 去掉耗時的 jqueryhtml

  2. 優化我的代碼java

去掉耗時的 jquery

代碼中用到 jquery 的地方,主要使用 jquery 的選擇器函數,extend函數,添加節點函數。react

jquery等價dom原生操做jquery

去掉了 jquery 的部分,雖然快了 200ms 左右,可是然並卵,開始界面的一段空白仍是很醜。web

圖片描述

最好的優化效果是把後面紅框中的時序放到前面紅框中。就是下面的操做方式,來個 setTimeoutchrome

優化我的代碼

上篇中的示例咱們再測試下:segmentfault

!function() {

    var date = new Date();
    var curDate = null;
    do {
        curDate = new Date();
    } while (curDate - date < 2000);

    setTimeout(function() {
        var el = document.getElementById("page");
        el.innerHTML = "This is a second page";
        console.log(2);
    }, 2000)
}()

index.js 的邏輯是上面這樣的時候,界面有時會等到 2s 執行完成後纔會渲染出來,有時沒有。爲何?由於若是卡頓的話
多是先執行了上述卡頓 2s 的操做。這裏先渲染界面仍是執行js,具備不肯定性,可是 Timeline 的時序分析是固定的,把 2s
的運行時間計算在內了,如圖:服務器

圖片描述

圖片描述

不過,若是咱們把上面的 index.js 內容改爲以下的形式:

!function() {

    setTimeout(function() {
        var date = new Date();
        var curDate = null;
        do {
            curDate = new Date();
        } while (curDate - date < 2000);

        console.log(curDate - date);
    }, 100);

    setTimeout(function() {
        var el = document.getElementById("page");
        el.innerHTML = "This is a second page";
        console.log(2);
    }, 2000)
}()

則時序分析結果以下圖:

圖片描述

圖片描述

能夠看到在手機中,時序顯示不同了,界面先出來了!

總結

在這種思想下,咱們須要重寫咱們的 html 頁面,修改後代碼以下:

<!doctype html>
    <html>
    <head>
        <title>Test</title>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
        <meta name="format-detection" content="telephone=no" />
        <meta name="apple-mobile-web-app-capable" content="yes" />
        <meta name="apple-mobile-web-app-status-bar-style" content="white" />
        <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />
        <link rel="stylesheet" type="text/css" href="../../tlibs/style.css">
    </head>
    <body style="overflow: hidden;margin:0;">
    <div id="app"><h1 style="color: red;">Hello World</h1></div>
    <div id="mask"></div>
    </body>
    <script type="text/javascript">
        
        setTimeout(function() {

            var urls = [
                "../../libs/highcharts.js",
                "../../tlibs/connect.js",
                "../../tlibs/__tdx_vendor.js",
                "../../tlibs/__tdx_client.js",
                "./index_config.js"
            ];

            for(var i = 0; i < urls.length; i++) {
                var el = document.createElement("script");
                el.setAttribute("src", urls[i]);
                // el.setAttribute("defer", "defer");
                document.body.appendChild(el);
            }

            setTimeout(function() {
                var el = document.createElement("script");
                el.setAttribute("src", "./index_func.js");
                document.body.appendChild(el);    
            }, 300)

        }, 10)

    </script>
    </html>

第一步,咱們確認,html 頁面載入後,界面是會顯示的。

第二步,咱們須要將頁面靜態化,就是先生成靜態頁面。

這裏涉及到 React 的服務器端渲染,生成靜態文件,原來這裏是爲了 SEO 優化時提到的。

import { renderToString } from "react-dom/server"
相關文章
相關標籤/搜索