咱們優化的目標是什麼:使界面早點顯示出來,數據是否正確能夠等待查詢的返回來更新。javascript
上篇介紹了代碼優化的方向:css
去掉耗時的 jqueryhtml
優化我的代碼java
代碼中用到 jquery 的地方,主要使用 jquery 的選擇器函數,extend函數,添加節點函數。react
jquery等價dom原生操做jquery
去掉了 jquery 的部分,雖然快了 200ms 左右,可是然並卵,開始界面的一段空白仍是很醜。web
最好的優化效果是把後面紅框中的時序放到前面紅框中。就是下面的操做方式,來個 setTimeout
chrome
上篇中的示例咱們再測試下: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"