H5很重要,很重要,很重要,重要的事情必須重複多遍,H5的優勢:跨平臺、迭代快、開發體驗好。缺點:加載慢,用戶體驗差。因此在接下來很長一段時間內我將會從H5的幾個缺點發面去研究如何優化。css
常常遇到一個問題,H5頁面因爲緩存問題常常在H5發佈新版本以後客戶端App看不到最新的效果,以前因爲雜七雜八的問題項目工期緊沒好好研究,最近抽空研究了下緩存問題。html
緩存問題具體表現爲:UIWebview首次打開加載慢;第二次加載速度明顯快;H5資源更新事後在App上看不到更改的效果git
爲此我認爲是緩存形成的問題,我進入App目錄下,看到Library下的Caches下面有不少文件名稱很長的文件,點擊預覽能夠看到是圖片、css等,原本我想着找出H5資源緩存到App中的特色,而後用NSFileManager刪除掉緩存文件,發現此路不通。web
結論:頁面實時效果變化的,沒有緩存瀏覽器
對比實驗:緩存
結論:頁面沒有看到最新的效果,明顯緩存了。可是我很想知道爲何本地局域網的方式請求網頁不會緩存,而經過公網IP的方式會緩存。性能優化
爲此,我作了進一步的實驗,用谷歌瀏覽器分別請求本地局域網和公網ip查看資源加載的狀況。服務器
一、公網IP 網絡
二、本地局域網運維
關鍵詞Status Code
結論:從圖上能夠看出本地局域網無論首次加載仍是刷新都是直接請求;而經過局域網的方式請求:首次請求是從服務器上獲取,在此刷新的時候是從(from memory cache)中獲取的。
局域網 的方式網速都比較快因此不會緩存;
公網IP的方式可能因爲網速問題會將首次請求到的資源緩存下來。
因此肯定緩存存在了,那麼如何避免緩存?
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { if (webView != _webView) { return YES; } NSURL *url = [rntity Tag 的資源直接訪問equest URL]; if ([request.URL.absoluteString containsString:@"http"] || [request.URL.absoluteString containsString:@"https"]) { if ([request.URL.absoluteString containsString:@"?"]) { url = [NSURL URLWithString:[NSString stringWithFormat:@"%@&h5V=%@",request.URL.absoluteString,[ProjectUtil getH5VersionString]]]; }else{ url = [NSURL URLWithString:[NSString stringWithFormat:@"%@?h5V=%@",request.URL.absoluteString,[ProjectUtil getH5VersionString]]]; } } LBPLOG(@"url->%@",[url absoluteString]); __strong WVJB_WEBVIEW_DELEGATE_TYPE* strongDelegate = _webViewDelegate; if ([_base isCorrectProcotocolScheme:url]) { if ([_base isBridgeLoadedURL:url]) { [_base injectJavascriptFile]; } else if ([_base isQueueMessageURL:url]) { NSString *messageQueueString = [self _evaluateJavascript:[_base webViewJavascriptFetchQueyCommand]]; [_base flushMessageQueue:messageQueueString]; } else { [_base logUnkownMessage:url]; } return NO; } else if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:shouldStartLoadWithRequest:navigationType:)]) { return [strongDelegate webView:webView shouldStartLoadWithRequest:request navigationType:navigationType]; } else { return YES; } }
總結:
App的緩存問題暫時研究到這裏,後期會繼續研究其餘方面的問題
經過瀏覽器咱們知道有的緩存是200 OK(from cache ),有的緩存是304 Not modified。若是運維移除了Entity Tag就一直是200(from cache)。若是沒有移除的話2者是交替出現的。
爲何2者會有區別?
作了 實驗得出結論:
直接訪問有緩存的網站都觸發 200 OK (from cache)
刷新瀏覽器則會觸發304
同一域名下,沒有 Entity Tag 的資源直接訪問,是 200 OK (from cache) 的結果
同一域名下,有Entity Tag 的資源直接訪問,是出現304 Not Modified