5+App的離線存儲(chǔ)
HTML5+的離線本地存儲(chǔ)有如下多種方案:
HTML5標(biāo)準(zhǔn)方案:cookie饰序、localstorage没隘、sessionstorage烹俗、websql、indexedDB
HTML5Plus擴(kuò)展方案:plus.navigator.setCookie恩闻、plus.storage艺糜、plus.io、plus.sqllite
cookie(標(biāo)準(zhǔn)h5方案)
體量最小幢尚,可以設(shè)置過期時(shí)間破停。不能跨域。
localstorage(標(biāo)準(zhǔn)h5方案)
適合key尉剩、value鍵值對(duì)的存儲(chǔ)真慢,數(shù)據(jù)量一般不超過5M。是常用的輕量數(shù)據(jù)存儲(chǔ)方案边涕。不能跨域晤碘。
sessionstorage(標(biāo)準(zhǔn)h5方案)
也是鍵值對(duì),特點(diǎn)是關(guān)閉App就消失了功蜓,也不能跨webview园爷,一般不用于持久化數(shù)據(jù)保存。
websql(標(biāo)準(zhǔn)h5方案)
是手機(jī)端關(guān)系型數(shù)據(jù)庫(kù)式撼,各種手機(jī)都支持童社。注意iOS8、9的wkWebview不支持websql著隆。如果要在iOS8扰楼、9上使用websql,請(qǐng)使用uiwebview內(nèi)核美浦。
indexedDB(標(biāo)準(zhǔn)h5方案)
是HTML5里最新的數(shù)據(jù)存儲(chǔ)規(guī)范弦赖,但不是基于SQL,而是基于對(duì)象浦辨。
indexedDB性能更高蹬竖,全是異步處理,學(xué)習(xí)難度偏大流酬。最重要的是目前手機(jī)端支持度不行币厕。Android4.4以上和iOS8以上才支持indexedDB。
plus.navigator.setCookie
與HTML5的標(biāo)準(zhǔn)cookie相比芽腾,plus的擴(kuò)展主要是為了跨域旦装。所謂跨越,就是本地HTML頁(yè)面和服務(wù)器HTML頁(yè)面共享cookie數(shù)據(jù)摊滔,或者說本地頁(yè)面的js可以操作服務(wù)器頁(yè)面產(chǎn)生的cookie阴绢。如果沒有跨越需求店乐,不需要使用plus擴(kuò)展。注意iOS8以后的wkWebview不支持setcookie旱函。
plus.storage
plus.storage也是鍵值對(duì)數(shù)據(jù)存儲(chǔ)响巢。它是把OS給原生App使用的鍵值對(duì)存儲(chǔ)數(shù)據(jù)庫(kù)封裝一層給JS使用描滔。
plus.storage沒有理論上的大小限制棒妨。也是持久化的,不會(huì)被當(dāng)做緩存清理含长。
plus.storage相比于localstorage 還有一個(gè)特點(diǎn)是可跨域券腔。當(dāng)一個(gè)存儲(chǔ)數(shù)據(jù),需要被本地和來自服務(wù)器的頁(yè)面同時(shí)讀寫時(shí)拘泞,就涉及跨域問題纷纫。此時(shí)HTML5的localstorage不能滿足需求,只能使用plus.storage陪腌。
plus.storage操作要比localstorage慢幾十毫秒辱魁,尤其是在循環(huán)里調(diào)用plus api會(huì)放大這種慢。
有網(wǎng)友封裝了一個(gè)框架诗鸭,針對(duì)key-value數(shù)據(jù)染簇,在localstorage超過5m時(shí)自動(dòng)切換到plus.storage,參考http://ask.dcloud.net.cn/article/552强岸。雖然這么做聽起來有點(diǎn)復(fù)雜锻弓,但我們對(duì)這種追求性能極致的開發(fā)者非常贊賞。
plus.io
plus.io是文件讀寫蝌箍,雖然也可以通過讀寫txt等文件存儲(chǔ)數(shù)據(jù)青灼,但并不如專業(yè)的storage和websql方便。
plus.io更多的是用于圖片等多媒體文件的本地保存妓盲。
比如圖文列表的離線使用杂拨,一般有2種做法:
圖片下載不通過img的src,而是plus.dowload下載的悯衬,先下載圖片弹沽,存好路徑后,然后img的src動(dòng)態(tài)指定文件路徑
圖片使用img的src下載甚亭,然后用canvas把img存成圖片文件贷币。下次不聯(lián)網(wǎng),img的scr直接指向本地文件
plus.sqllite
plus.sqllite是對(duì)原生的sqllite的封裝亏狰。它也是一種可以通過sql在本地增刪改查數(shù)據(jù)庫(kù)的方案役纹。
有點(diǎn)類似websql,但相對(duì)于websql而言暇唾,sqllite的好處是:
可以預(yù)置基礎(chǔ)數(shù)據(jù)庫(kù)促脉,直接打包到app里
當(dāng)手機(jī)空間不足時(shí)辰斋,websql可能會(huì)被清理,而sqllite不會(huì)瘸味。
plus.storage沒有理論上的大小限制宫仗。
有人問三方清理工具清理垃圾會(huì)不會(huì)造成某些數(shù)據(jù)丟失,這個(gè)可能性是存在的旁仿,但概率并不高藕夫,取決于清理軟件會(huì)不會(huì)分析你的存儲(chǔ)數(shù)據(jù)里哪些是可以清除的垃圾數(shù)據(jù)。除了OS的清理工具外枯冈,一般沒有root權(quán)限的清理工具是拿不到除了plus.io外的你的app的存儲(chǔ)數(shù)據(jù)的毅贮。
但ios上系統(tǒng)存儲(chǔ)空間很少的時(shí)候,系統(tǒng)會(huì)清理 cookie尘奏、localstorage滩褥、sessionstorage、websql炫加、indexedDB 的數(shù)據(jù)瑰煎,此時(shí)使用plus.storage、plus.sqllite更安全俗孝。
uni-app存儲(chǔ)
uni-app的存儲(chǔ)方案比5+app要少酒甸,因?yàn)閏ookie、localstorage驹针、sessionstorage烘挫、websql、indexedDB只有h5端支持柬甥,其他端都不支持饮六。
uni.storage的鍵值對(duì)存儲(chǔ),這個(gè)是全端支持的苛蒲。
uni-app的Storage在不同端的實(shí)現(xiàn)不同卤橄,uni.storage在app側(cè),映射為plus.storage臂外;h5側(cè)映射為localstorage窟扑;各個(gè)小程序平臺(tái)映射為其自帶的storage鍵值對(duì)存儲(chǔ):
H5端為localStorage,瀏覽器限制5M大小漏健,是緩存概念嚎货,可能會(huì)被清理
App端為原生的plus.storage,無大小限制蔫浆,不是緩存殖属,持久化
各個(gè)小程序端為其自帶的storage api,數(shù)據(jù)存儲(chǔ)生命周期跟小程序本身一致瓦盛,即除用戶主動(dòng)刪除或超過一定時(shí)間被自動(dòng)清理洗显,否則數(shù)據(jù)都一直可用外潜。
微信小程序單個(gè) key 允許存儲(chǔ)的最大數(shù)據(jù)長(zhǎng)度為 1MB,所有數(shù)據(jù)存儲(chǔ)上限為 10MB挠唆。
支付寶小程序單條數(shù)據(jù)轉(zhuǎn)換成字符串后处窥,字符串長(zhǎng)度最大200*1024。同一個(gè)支付寶用戶玄组,同一個(gè)小程序緩存總上限為10MB滔驾。
百度、頭條小程序文檔未說明大小限制
app端還支持2種方案
使用plus.io訪問文件系統(tǒng)
使用plus.sqlite訪問數(shù)據(jù)庫(kù)