搜尋
首頁web前端js教程js和css的快取機制的介紹
js和css的快取機制的介紹Jun 28, 2018 am 11:21 AM
localstorage

本文主要介紹了localStorage的黑科技-js和css快取機制的相關知識,具有一定的參考價值,下面一起來看下吧

一、發現黑科技的起因

今天在微信公眾號看到一篇技術博文,想用印象筆記收藏,所以發送了文章連結到pc上。然後習慣性地打開控制台,看看源碼,想了解下最近微信用了什麼新技術。

呵呵,以下勾起了我偵探的慾望。頁面載入後的異常點就是只載入了一個js,如下圖所示:

#我很詬異,為什麼已經開啟了Disable cache,js只載入了一個,而且體積這麼小。接著,我按住Ctrl O進行資源檔案查找,發現我被「忽悠」了。其實根本不只一個js檔。

腦袋裡靈光一閃,不會是用localStorage做了快取吧? !趕緊看了下localStronge,還真是。 。 。 。

心裡一陣澎湃,這不是我之前就想實現的載入效能優化的想法嗎!乖乖,我孤陋寡聞了,已經有前端團隊實作了程式碼。

二、談談檔案載入方面的最佳化想法

通常,前端的資源檔案載入優化,就是在檔案不修改迭代的情況下,盡可能多地利用緩存,避免多次下載相同的檔案。

一般的做法就是盡量延長資源的有效期,也就是設定 Cache-Control裡的max-age,讓頁面資源請求的回傳碼為304,讓瀏覽器直接使用本地快取。

雖然pc端的協商快取(304)很快,但手機端因為網路原因,協商快取的效果就沒pc端那麼好了。而且,手機會經常清除本地緩存,所以檔案快取的時間也不會很長。

這時候,localStorage就派上用場了。

localStorage比較cookie,可以快取大體積的數據,而且是永久有效。所以,如果把js資源和css資源儲存在localStorage中,則可以省去發送http請求所消耗的時間,大大提高使用者的瀏覽體驗。

三、用localStorage做資源快取需要解決的問題

3.1 版本更新機制

只要一個專案還在迭代開發,就難以避免需要更新資源檔案。

普通的資源要求,可以根據

檔名md5 http://res.wx.qq.com/mmbizwap/zh_CN/htmledition/js/biz_wap/moon32ebc4.js

在資源連結後面加上特定的字尾http://1.ss.faisys.com/js/comm/fai.min.js?v=201612051739

做標識來判斷是否需要更新資源。

如果用localStorage做,則需要一套新的快取更新機制。

3.2 搭建更新程式碼的鷹架

使用localStorage緩存,則需要一個新的鷹架來管理資源檔案的讀取和寫入。

3.3 後台輸出一份資源配置資訊

因為需要前端做資源更新,所以後台要輸出一份依據給前端做判斷用,也就是需要一份資源配置資訊。前端根據配置訊息,進行匹配和比較,最終決定 使用localStorage緩存,還是重新發起請求,下載最新的資源檔案。

3.4 存在XSS安全隱患

localStorage中的信息,客戶端是可以任意修改的。如果哪個駭客想練手一下,可以任意注入js程式碼。那麼,在頁面刷新的時候,注入的程式碼也會被執行。

四、微信的做法解析

4.1 版本識別

########4.1 版本識別################# ##########以__MOON__a/a_report.js為例,版本資訊用key __MOON__a/a_report.js_ver存儲,儲存的value為//res.wx.qq.com/mmbizwap/zh_CN/htmledition /js/a/a_report32e586.js。 ######如果按普通載入方式,直接將該value取出來,設定到script節點的src屬性,即可完成載入。 ######微信判斷該版本是否最新,就是用該value值與後台輸出的配置資訊進行比較,最後得出是否更新的結果。 ######如果value值與設定資訊一致,則使用快取。否則,重新發起請求載入。 ############4.2 鷹架#############可以看出,微信使用的是自己開發的鷹架moon.js,在這個網頁中的實際檔名是moon32ebc4.js。 ###

因為是混淆過變數名稱的文件,所以要看具體程式碼的走向,有點費力,這裡就不做分析了。

4.3 資源設定資訊

因為鷹架moon.js需要資源設定資訊才能正常運作,所以設定資訊一定會在moon.js之前輸出。

依序查看moon.js之前的script標籤,發現了window.moon_map這個json物件。

利用控制台輸出該變數查看資訊如下:

#看到這裡,可以明確一點:這就是更新機制所必備的資源配置資訊表了。

而且,可以看出,該配置資訊json物件的key,就對應localStorage中的key。同理,value值也是一一對應。

4.4 XSS攻擊

這裡是為了驗證微信的快取機制是否有XSS攻擊,看到這裡的童鞋可千萬不要去做壞事。

我在一個js快取程式碼中,插入alert("hehe");,看頁面刷新的時候,是否會出現該彈窗,來驗證是否有攻擊漏洞。

刷新頁面後,結果如下圖:

#可以看出,微信也沒有解決這類問題。所以,這種快取機制,還是有先天不足的。

4.5 測試微信的更新機制

#修改localStorage中key __MOON__a/a_report.js_ver #對應的value值,讓微信的鷹架moon.js更新__MOON__a/a_report.js,刷掉我剛才主動插入的程式碼。

這裡,我修改檔案名稱***587.js(原來的檔案名稱***586.js)。接著F5刷新頁面。

結果為:report.js程式碼更新了,版本號碼也恢復回 ***586.js

五、結論

localStorage快取有其用武之地,但不是萬能的。需要注意以上提及的坑。

可以套用的場景我歸納為以下幾點:

1. 非首屏渲染需要的css文件,可以做LS快取。

首屏渲染需要的css,需要以常規方式輸出,因為SEO需要,不然爬蟲爬取頁面的時候,頁面效果會很不好。而非首屏的css,則可以用LS緩存,減少資源下載時間。

2. 展示類別、動畫類別等非業務主要邏輯的程式碼,可以做LS快取。

這樣,可以一定程度上避免業務層的安全漏洞。當然,前端再怎麼做防護都是一層薄紙。重要的,還是後台介面要做好安全保護。

3. 行動端可以做LS快取。 PC端做LS緩存,發揮的優化作用不大。

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

把JS與CSS寫在同一個檔案裡的書寫方法

關於原生js實現類似fullpage的單頁/全螢幕滾動的方法

#

以上是js和css的快取機制的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
为什么localstorage无法成功保存数据?为什么localstorage无法成功保存数据?Jan 03, 2024 pm 01:41 PM

存储数据到localstorage为何总是失败?需要具体代码示例在前端开发中,我们经常需要将数据存储在浏览器端,以便提高用户体验和方便之后的数据访问。Localstorage是HTML5提供的一项用于客户端存储数据的技术,它提供了一种简单的方法来存储数据,并且可以在页面刷新或关闭后保持数据的持久化。然而,当我们使用localstorage进行数据存储时,有时

设置localstorage项的过期时间的方法设置localstorage项的过期时间的方法Jan 11, 2024 am 09:06 AM

如何设置localstorage的过期时间,需要具体代码示例随着互联网发展的迅猛,前端开发中经常需要在浏览器中保存数据。而localstorage是一种常用的WebAPI,旨在提供了一种在浏览器中本地存储数据的方式。然而,localstorage并没有提供一个直接的方法来设置过期时间。本文将介绍如何通过代码示例来实现设置localstorage的过期时间。

恢复被删除的Localstorage数据的方法有哪些?恢复被删除的Localstorage数据的方法有哪些?Jan 11, 2024 pm 12:02 PM

如何恢复被删除的Localstorage数据?Localstorage是一种用于在网页中存储数据的技术。它被广泛应用于各种网页应用程序中,以便在多个页面之间共享数据。然而,有时候我们可能会意外地删除了Localstorage中的数据,这给我们带来了困扰。那么,如何恢复被删除的Localstorage数据呢?下面是具体的步骤和代码示例。步骤1:停止写入Loca

本地存储为何不能正确保存数据?本地存储为何不能正确保存数据?Jan 03, 2024 pm 01:41 PM

localstorage为什么无法正常保存我的数据?在Web开发中,我们经常需要将用户的数据保存在本地,以便在用户下次访问网站时能够快速加载或恢复数据。而在浏览器中,我们可以使用localStorage来实现这个功能。然而,有时候我们会发现使用localStorage保存的数据并不能正常工作。那么,为什么会出现这种情况呢?在理解为什么localStorage

localstorage为什么不安全localstorage为什么不安全Oct 10, 2023 pm 05:38 PM

localstorage不安全的原因是数据不加密、XSS攻击、CERF攻击、容量限制等。详细介绍:1、数据不加密,localstorage是一个简单的键值对存储系统,它将数据以明文形式存储在用户的浏览器中,这意味着任何人都可以轻松地访问和读取存储在localstorage中的数据,如果敏感信息存储在localstorage中,那么黑客或恶意用户可以轻松地获取这些信息等等。

使用localstorage存储数据的步骤使用localstorage存储数据的步骤Jan 11, 2024 am 09:14 AM

如何使用localstorage存储数据?简介:localstorage是一种HTML5提供的浏览器本地存储机制,通过它可以方便地在浏览器中存储和读取数据。本文将介绍如何使用localstorage存储数据,并提供具体的代码示例。本文共分为以下几个部分:1、localstorage简介;2、使用localstorage存储数据的步骤;3、代码示例;4、常见问

为什么localstorage不安全为什么localstorage不安全Dec 13, 2023 pm 05:37 PM

localstorage不安全的原因:1、存储内容可被篡改;2、数据可被窃取;3、数据可被伪造;4、跨站点脚本攻击;5、清除浏览器数据。详细介绍:1、存储内容可被篡改,localStorage中的数据是存储在用户的浏览器中的,这意味着任何能够访问该浏览器的人都可以查看和修改localStorage中的数据;2、数据可被窃取,由于localStorage中的数据是存储在用户等等。

localstorage是什么localstorage是什么Dec 19, 2023 pm 02:07 PM

localStorage是一种Web API,可以在Web浏览器中存储和检索数据,它允许网站将数据存储在用户的本地浏览器中,而不是在服务器上。它可以用于存储许多不同类型的数据,例如用户设置、首选项、购物车数据等。在不同的浏览器中具有不同的存储限制,并且通常有一个最大存储量限制。它可以用于改善网站的用户体验和提供个性化服务。但是在使用localStorage时需要注意隐私等等。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)