betty.js是一款極輕量的、使用localStorage
存儲Javascript代碼的工具。市面上已經有不少相似的工具:好比餓了麼團隊最近發佈的bowl.js,微信團隊的MOON
(未開源),以及這個想法的鼻祖basket.js。javascript
但爲什麼還要「重複造輪子」?是由於betty.js
她足夠輕量,足夠簡潔易用,足夠具備擴展性,壓縮後的min.betty.js
只有1KB!使得你能夠直接以inline
引入的方式(這也是推薦的引入方式)將betty用到你的項目裏。css
三年前就想着將Javascript的代碼存儲到LS裏,在百度工做的時候曾寫出一個基於mod.js
的存儲工具mocket.js
,它的思想是動態分析項目依賴,本地沒有存儲過的JS再去網絡請求再存儲下來,這也順利應用到百度的部分項目裏。html
但爲什麼不直接開源mocket.js
,就是由於betty
不依賴任何組件,是一個獨立的極其輕量的小工具。固然,能夠藉助betty.js
來擴展實現mocket.js
動態分析組件的思想。前端
好了,廢話這麼多,接下來是介紹文檔:java
npm install betty.js
拷貝min.betty.js
的代碼,使用inline
的方式引入項目裏:git
<script type="text/javascript"> var Betty=function.... </script>
若是你的項目基於FIS,能夠這麼引入:github
<script type="text/javascript" src="/path/min.betty.js?__inline"></script>
var betty = Betty({ uri: "/path/min.allLib.js", key: "allLib", noCache: false, xDomain: false }, function() { // your code... })
var betty = Betty({ uri: "/path/min.allLib.version.js", key: "allLib", noCache: false, xDomain: false }); betty.apply(function() { // your code... }) betty.apply(function() { // your others code... })
以上兩種方式的代碼執行一遍以後,min.allLib.js
的內容就會被betty存儲到localStorage裏,第二次執行時就不會從網絡請求min.allLib.js
,直接從緩存中讀取並執行。shell
至於爲什麼除了第一種寫法,還支持了第二種寫法?是由於在前端工程裏,能夠考慮把定義betty
的操做放到通用的layout裏,把betty.apply
寫進每一個頁面對應的js文件裏。npm
固然,你能夠自由選擇本身的喜愛。跨域
betty.js
會默認使用Ajax
請求待緩存的JS資源,若是跨域則會請求出錯。這時候你須要設置betty padding
和xDomain
來讓跨域請求JS資源被支持:
index.html
<script> window.betty = Betty({ uri: "/path/min.allLib_with_padding.version.js", key: "allLib", xDomain: true }, function() { console.log(Mobike.site) }) </script>
min.allLib_with_padding.js
betty.store(function() { // your code... })
注意:
請設置xDomain
爲true
請在待緩存的JS文件中設置betty padding
,如以上的betty.store(....)
請設置betty
爲全局變量
betty.js
絕對依賴uri
和key
來管理JS版本。若是你的代碼須要更新,請更換uri
的值,新的JS就會被請求,而後代碼內容會被從新存儲到LocalStorage裏,而且會刪掉舊版本的代碼。
betty.js
會以BETTY:{key}:{uri}格式存儲JS代碼,例如:
BETTY:allLib:/path/min.allLib.version.js
因此key
和uri
有一個發生變化,都會引發從新請求並存儲。
Betty
配置betty
var betty = Betty({config, callback[option]})
config:
uri
和key
必須設置
noCache
: 設置不緩存,默認爲false
xDomain
: 設置跨域緩存,默認false
,詳見[跨域緩存]
betty.store
添加存儲的代碼
betty.store(function() { ... })
betty.apply
執行依賴緩存的代碼
betty.apply(function() { ... })
betty.remove
移除緩存的代碼
betty.remove("allLib")
目前還不支持,也不建議隨意緩存CSS內容,仍是建議直接在head
裏引入CSS,主要是基於如下的考慮:
動態插入CSS會使頁面閃動
CSS樣式順序管理問題
固然,一些不在首屏展現的CSS能夠被緩存,但建議將其轉換成JS文件合併到你的min.allLib.js
中,能夠藉助這個小工具addcss:
addcss("a{color: red,font-size: 12px}")
若是你使用FIS,能夠這麼處理:
addcss(__inline("style.css"))