1. 程式人生 > >網頁優化-快取並載入本地js,css等資原始檔(有坑,內容中道出)

網頁優化-快取並載入本地js,css等資原始檔(有坑,內容中道出)

現在很多專案中多變化的頁面更希望使用H5來實現,方便快捷,且不需要時刻的去升級版本。但在體驗上H5還是沒有原生的好,在native和H5之間的互動,已經webview載入的速度上都有一定的弊端,優化的方案很多,今天嘗試了一下將js css等資原始檔快取到本地,這樣後續載入網頁的時候速度上就會快一些。
當然,真正影響載入速度的有大概幾個點:
1.網頁中的諸多請求
2.js的執行已經css樣式的渲染
3.圖片等比較大的資源載入
4.網路等外界因素

今天就先解決第二點的優化,載入本地js css檔案。

shouldOverrideUrlLoading(WebView view, String url)
這個方法大家都很熟悉,url攔截,也是native和H5互動的一個重點,主要是兩端定義似有協議,攔截到是自定義的協議那麼可以做對應的事情:

H5端:
    定義一個點選事件:
HTML:
<div>
    <button class="size" id="btn1" onclick="clickme()">button-1</button>
</div>
Javascript:
   clickme =  function()  {
      document.location = "js://webview?arg1=111&arg2=222";
    }

Android端:

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            Uri uri = Uri.parse(url);
            //判斷scheme 如果是私有定義的 攔截
            if (uri.getScheme()
                    .equals("js")) {
                if (uri.getAuthority()
                        .equals("webview")) {
                    //獲取攜帶的引數
                    String arg1 = uri.getQueryParameter("arg1");
                    //TODO 攔截掉 做對應的客戶端需要做的操作
                }
                return true;
            }
            return super.shouldOverrideUrlLoading(view, url);
        }

除了shouldOverrideUrlLoading該方法以外還有一個方法叫shouldInterceptRequest,該方法是攔截H5資源載入的方法,在5.10以前是shouldInterceptRequest(WebView view, String url),後面被shouldInterceptRequest(WebView view, WebResourceRequest request)替代(如需仔細瞭解該方法諮詢搜尋)。今天的內容就主要是該方法中去操作。

再分享前,再分享自己踩過的一個很重要的坑,再本地測試的時候我是將js和css檔案放在assert資料夾中的,且將Html檔案也放在裡面(為了方便),會有一個很重要的問題就是 shouldInterceptRequest該方法不會執行,具體是什麼原因希望瞭解的人可以分享一下。然後我將html放入手機儲存中就可以了。

1.一般再開發中H5 會有專門前端人員寫(本地測試是自己寫的)拿到前端的js和css檔案後命好名放在asset資料夾中(如需要動態去下載另外,且名字一定和前端確定好,script標籤中src路徑名稱相同)

2.然後當H5執行到js或者css的時候客戶端會有攔截,直接載入本地的js和css檔案,具體程式碼:

        @Nullable
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
            //資源攔截 載入本地 js css 檔案
            String path = request.getUrl()
                    .getPath();
            String fileName = request.getUrl()
                    .getLastPathSegment();

            try {
                if (path.endsWith(".js")) {
                    InputStream inputStream = getAssets().open(fileName);
                    return new WebResourceResponse("text/javascript", "utf-8", inputStream);
                } else if (path.endsWith("css")) {
                    InputStream inputStream = getAssets().open(fileName);
                    return new WebResourceResponse("text/css", "utf-8", inputStream);

                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return super.shouldInterceptRequest(view, request);
        }

其實也很簡單,只是本地測試過程中踩了個坑,希望記錄一下,有知道的可以請教一下。