手機百度localstorage細粒度緩存介紹

jopen 8年前發布 | 45K 次閱讀 緩存 緩存組件

從14年開始,手機百度就開始支持localstorage的細粒度緩存,配合inline渲染模式使用,在2G慢速網站將頁面的js和css嵌入 到script和style標簽,然后將源碼存到localstorage,第二次訪問的時候從localstorage讀取,提高頁面訪問速度。

細粒度localstorage方案

傳統的localstorage緩存,流程圖如下:
 手機百度localstorage細粒度緩存介紹

最大的缺點是:需要頁面渲染之后,讀取localstorage緩存內容,然后二次拉取沒有緩存或需要更新的資源

還有一個方案,就是利用cookie保存一個版本號信息,server端拿到cookie就可以判斷出來需要下發和更新的資源。這個方案雖然可以避 免二次拉取,但是畢竟cookie的存儲量有限,cookie太大就影響http上行請求速度。所以之前百度移動搜索結果頁的方法就是整個頁面存儲一個 md5的版本號,如果有一個資源更新,那么就需要整個頁面的資源代碼重新下發,所以往往每周上線的時候會引起頁面性能數據抖動。

所以結合上面的兩種方式,手百這邊做的是如下的方案:
手百細粒度方案

第一步:代碼按照更新頻度進行分組

上面提到的cookie方案最大的問題就是:業務代碼和通用代碼都“一視同仁”,這樣經常頻繁變化的業務代碼只要發生變化,通用代碼也需要更新,所以每周固定上線時間就會全部重新下發一遍代碼。

為了解決這個方案的缺點,首先將需要緩存的代碼進行分層:通用業務。通過區分通用和業務代碼,每段代碼都有自己的獨立版本號,業務層代碼的修改就不會引起通用代碼的更新,只會更新自己的版本號,下發自己的新版本。

第二步:利用cookie的多維度

大家都知道cookie是可以按照域名來緩存的,二級子域名可以讀取主域名的cookie,這個我們稱之為:cookie的doman維度

cookie除了域名之外,還有一個容易被忽略的維度,就是不同的pathcookie也可以不同,下一級path是可以讀取上一級path的cookie。這個是cookie的第二個維度:cookie的path維度

下面例子是同一個cookiepo_lsv在不同domain和path的情況。

</tr> </tbody>

</tr>

</tr>

</tr> </tbody> </table>

保證cookie保存足夠多的信息

之前使用md5,cookie value的長度是32個長度,如果利用value足夠短的長度保存足夠多的cookie信息。我們的方法是使用如下約定:

  1. css和js分別使用c和j來打頭
  2. localstorage的key和版本號使用-間隔,而每個版本之間使用_,保證cookie在encode的時候不被編碼成%xx保證長度
  3. 真實localstorage的值,使用盡量一個字母簡寫
  4. 而版本號使用的是36進制,如果每周上線一次計算,加上cookie有效期,36進制保證版本號是一位已經足夠了,不用考慮版本號重疊問題
  5. </ol>

    自動打包工具

    維護版本號是很麻煩的一個工作,如果一不留神漏了哪個,就會導致重大bug,比如頁面一直reload等,所以我們使用了打包工具來完成這個過程,避免了人工的錯誤。

    打包過程如下:
     手機百度localstorage細粒度緩存介紹

    localstorage.json的格式內容如下:

    {
        "jA": {
            "hash": "2c79d70",
            "files": [
                "common:widget/localstorage/zepto-ajax.tpl"
            ],
            "version": 1
        },
        "jZ": {
            "hash": "5358395",
            "files": [
                "common:widget/localstorage/zepto.tpl"
            ],
            "version": 1
        }
    }

    需要緩存到localstorage的文件都統一放在localstorage文件夾,再看下需要緩存的widget經過打包工具自動生成的代碼:

    <script data-lsid="jZ">
        __inline('/static/js/zepto.js');
    </script>

    經過打包工具release之后,變成下面的smarty模板:

    {%if ($_ls_nonsupport) || ($_parsedLSCookies.jZ.isUpdate )%}
        <script data-lsv="{%$_parsedLSCookies.jZ.version|escape:html%}"  data-lsid="jZ">
        var Zepto=xxx
        </script>
    {%else%}
        <script>LS.exec("jZ","js");</script>
    {%/if%}

    代碼執行時候,解析cookie,然后讀取localstroage.json的內容,跟cookie的版本號對比,生成模板變量,賦值給模板文件。

    來自:http://js8.in/2015/12/06/手機百度localstorage細粒度緩存介紹/

     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
key value domain path
po_lsv jZ-1_jA-1_cF-1_cM-1_jB-2 po.m.baidu.com /tiny
po_lsv jZ-1_jA-1_cF-1_cM-1_jB-1 po.m.baidu.com /
po_lsv jZ-1_jA-1_cF-1 m.baidu.com /
  • sesese色