天天看點

「前端」小程式開發之 webview

開發小程式繞不開 webview,什麼是 webview?有什麼作用呢?

一、什麼是 webview

WebView 也叫網頁視圖,是原生系統用于移動端 APP 嵌入(Embed) Web 技術,方式是内置了一款高性能 webkit 核心浏覽器。大白話就是可以用來承載網頁的容器。

Webview 是一個基于 webkit 引擎,可以解析 DOM 元素,展示html頁面的控件,它和浏覽器展示頁面的原理是相同的,是以可以把它當做浏覽器看待。

現在手機應用層開發的方向有兩種:用戶端開發(比如我們說的app)和 HTML5 移動端開發!

所謂的 HTML5 端就是:HTML5 + CSS + JS 來建構 一個網頁版的應用,而這中間的媒介就是這個 WebView,而 Web 和網頁端可以通過JS來進行互動,比如, 網頁讀取手機聯系人,調用手機相關的API等!

而且相比起普通的用戶端開發,HTML5移動端有個優勢: 可以用百分比來布局,而且如果 HTML5 端有什麼大改,我們不用像用戶端那樣去重新下一個 APP,然後 覆寫安裝,我們隻需修改下網頁即可!

而用戶端...慘不忍睹,當然 HTML5 也有個缺點,就是性能的問題, 資料積累,耗電問題,還有閃屏等等...

二、webview主要用于什麼地方?或者說什麼需求下會使用到webview?

在電腦上展示 html 頁面,通過浏覽器打開頁面即可浏覽,而手機系統層面,如果沒有 webview 支援,是無法展示 html 頁面,是以 webview 的作用即用于手機系統來展示 html 界面的。是以它主要在需要在手機系統上加載 html 檔案時被需要。

三、微信小程式中的 webview

小程式的主要開發語言是 JavaScript ,小程式中,邏輯層和渲染層是分開的,分别運作在不同的線程中。 具體的運作環境如下:

運作環境 邏輯層 渲染層
iOS JavaScriptCore WKWebView
安卓 V8 chromium定制核心
小程式開發者工具 NWJS Chrome WebView

可以看出,小程式的渲染層也是運作在webview上的;

四、為什麼webview會很慢?

普通使用者通路webview經曆過程如下:

  1. 互動無回報
  2. 到達新的頁面,頁面白屏
  3. 頁面基本架構出現,但是沒有資料;頁面處于loading狀态
  4. 出現所需的資料
「前端」小程式開發之 webview

于是,做了測試結果如下

「前端」小程式開發之 webview

說明

在浏覽器中,我們輸入位址時(甚至在之前),浏覽器就可以開始加載頁面。 而在用戶端中,用戶端需要先花費時間初始化WebView完成後,才開始加載。

五、如何避免webview加載慢?

  1. 全局WebView
在用戶端剛啟動時,就初始化一個全局的WebView待用,并隐藏; 當使用者通路了WebView時,直接使用這個WebView加載對應網頁,并展示
  1. 用戶端代理資料請求
在用戶端初始化WebView的同時,直接由native開始網絡請求資料; 當頁面初始化完成後,向native擷取其代理請求的資料。

六、webview的性能優化

  • WebView初始化慢,可以在初始化同時先請求資料,讓後端和網絡不要閑着。
  • 後端處理慢,可以讓伺服器分trunk輸出,在後端計算的同時前端也加載網絡靜态資源。
  • 腳本執行慢,就讓腳本在最後運作,不阻塞頁面解析。
  • 同時,合理的預加載、預緩存可以讓加載速度的瓶頸更小。
  • WebView初始化慢,就随時初始化好一個WebView待用。
  • DNS和連結慢,想辦法複用用戶端使用的域名和連結。
  • 腳本執行慢,可以把架構代碼拆分出來,在請求頁面之前就執行好。

七、webview 和原生Native如何選擇?

在内嵌的WebView中應該限制允許打開的WebView的域名,并設定運作通路的白名單。或者當使用者打開外部連結前給使用者強烈而明顯的提示。

在一個用戶端内,native目前主要功能是提供高效而基礎的功能;内部的WebView則添加一些性能體驗要求不高但動态化要求高的能力。

提高用戶端的動态能力,或者提高WebView的性能,都是提升App功能覆寫的方式。

而目前的各種架構,ReactNative、Week包括微信小程式,都是這個趨勢的嘗試。

「前端」小程式開發之 webview

文章來源:https://juejin.cn/post/6950890297450561550

繼續閱讀