国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

初探IndexedDB

jsyzchen / 1635人閱讀

背景

隨著前端技術(shù)日新月異地快速發(fā)展,web應(yīng)用功能和體驗(yàn)也逐漸發(fā)展到可以和原生應(yīng)用媲美的程度,前端緩存技術(shù)的應(yīng)用對(duì)這起到了不可磨滅的貢獻(xiàn),因此想一探前端的緩存技術(shù),這篇文章主要會(huì)介紹在日常開發(fā)中比較少接觸的IndexedDB

IndexedDB 什么是IndexedDB

IndexedDB簡(jiǎn)單理解就是前端數(shù)據(jù)庫(kù),提供了一種在用戶瀏覽器中持久存儲(chǔ)數(shù)據(jù)的方法,但是和前端關(guān)系型數(shù)據(jù)不同的是,IndexedDB采用的key-value鍵值對(duì)存儲(chǔ),這種存儲(chǔ)形式的數(shù)據(jù)庫(kù)查詢更簡(jiǎn)單快速,IndexedDB分別為同步和異步訪問(wèn)提供了多帶帶的API,但是同步API僅提供在web worker內(nèi)部使用,因此絕大多數(shù)情況,我們使用的都是異步API,同時(shí)IndexedDB也無(wú)法突破同源策略的限制,只能訪問(wèn)在同域下的數(shù)據(jù)

為什么要用IndexedDB

提到為什么要用IndexedDB就不得不提到我們經(jīng)常用的緩存API localStorage和sessionStorage,這兩個(gè)緩存API能滿足我們開發(fā)時(shí)的絕大多數(shù)需求,簡(jiǎn)單的鍵值存儲(chǔ),但是它們有它們的限制:

存儲(chǔ)空間限制,只有5M

只能存儲(chǔ)字符串,存儲(chǔ)對(duì)象類型的數(shù)據(jù)要用JSON.stringify和parse兩個(gè)方法轉(zhuǎn)換

存儲(chǔ)的字段一多就很難管理,存儲(chǔ)的字段也無(wú)法產(chǎn)生關(guān)聯(lián)

IndexedDB的存儲(chǔ)空間是沒(méi)有限制,但是不同瀏覽器可能會(huì)對(duì)IndexedDB中單個(gè)庫(kù)的大小進(jìn)行一定的限制,IndexedDB本質(zhì)上還是一個(gè)數(shù)據(jù)庫(kù),可以存儲(chǔ)大量結(jié)構(gòu)化數(shù)據(jù)(包括文件/blobs),同時(shí)IndexedDB API通過(guò)索引的方式實(shí)現(xiàn)了數(shù)據(jù)的高性能搜索

怎么用IndexedDB

前面介紹一堆IndexedDB相關(guān)的內(nèi)容,接下來(lái)就來(lái)看看具體IndexedDB具體怎么使用,以一個(gè)簡(jiǎn)單的例子來(lái)切入,下面直接上具體代碼:

var data = [{
  id: 1,
  name: "Tom",
  age: "18"  
}, {
  id: 2,  
  name: "Tommy",
  age: "16"
}]  
// 打開數(shù)據(jù)庫(kù),兩個(gè)參數(shù)(數(shù)據(jù)庫(kù)名字,版本號(hào)),如果數(shù)據(jù)庫(kù)不存在則創(chuàng)建一個(gè)新的庫(kù)
var request = window.indexedDB.open("myDatabase", "1")
// 數(shù)據(jù)庫(kù)操作過(guò)程中出錯(cuò),則錯(cuò)誤回調(diào)被觸發(fā)
request.onerror = (event) => {
  console.log(event)
}
// 數(shù)據(jù)庫(kù)操作一切正常,所有操作后觸發(fā)
request.onsuccess = (event) => {
  var db = event.target.result
  // 數(shù)據(jù)讀取
  var usersObjectStore = db.transaction("users").objectStore("users")
  var userRequest = usersObjectStore.get(1)
  userRequest.onsuccess = function (event) {
    console.log(event.target.result)
  }
}
// 創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)或者修改數(shù)據(jù)庫(kù)版本號(hào)時(shí)觸發(fā)
request.onupgradeneeded = (event) => {
  var db = event.target.result
  // 創(chuàng)建對(duì)象倉(cāng)庫(kù)用來(lái)存儲(chǔ)數(shù)據(jù),把id作為keyPath,keyPath必須保證不重復(fù),相當(dāng)于數(shù)據(jù)庫(kù)的主鍵
  var objectStore = db.createObjectStore("users", { keyPath: "id"})
  // 建立索引,name和age可能重復(fù),因此unique設(shè)置為false
  objectStore.createIndex("name", "name", {unique: false})
  objectStore.createIndex("age", "age", {unique: false})
  // 確保在插入數(shù)據(jù)前對(duì)象倉(cāng)庫(kù)已經(jīng)建立
  objectStore.transaction.oncomplete = () => {
    // 將數(shù)據(jù)保存到數(shù)據(jù)倉(cāng)庫(kù)
    var usersObjectStore = db.transaction("users", "readwrite").objectStore("users")
    data.forEach(data => {
      usersObjectStore.add(data)
    })
  }
}

上面的例子介紹了IndexedDB的簡(jiǎn)單用法,當(dāng)執(zhí)行完上面的代碼后可以在瀏覽器中看到自己新建的IndexedDB:


考慮到不是所有人都會(huì)將IndexedDB應(yīng)用于實(shí)際工作,因此上面只是介紹了簡(jiǎn)單API的調(diào)用,更多關(guān)于IndexedDB的用法可以去MDN學(xué)習(xí),真正需要使用的時(shí)候,對(duì)于其異步API調(diào)用如果不做一定的封裝,一定會(huì)陷入深深的回調(diào)地獄,因此這里推薦兩個(gè)IndexedDB API的封裝庫(kù):

Dexie.js

localForage

應(yīng)用場(chǎng)景

相信這個(gè)話題應(yīng)該是大部分人最感興趣的,IndexedDB到底應(yīng)用在什么地方?前面介紹了這么多,IndexedDB使用比localStorage、sessionStorage復(fù)雜得多,如果沒(méi)有特定的使用場(chǎng)景,開發(fā)者一定不會(huì)自己給自己找麻煩選擇IndexedDB做緩存,結(jié)下就來(lái)看看IndexedDB適用的場(chǎng)景:

不需要網(wǎng)絡(luò)連接的純離線應(yīng)用,比如Todolist這類的用來(lái)記錄待辦任務(wù)類型的應(yīng)用,


在不考慮需要聯(lián)網(wǎng)的登錄、分享功能下,待辦事項(xiàng)、收件箱、任務(wù)核心功能完全可以用IndexedDB做數(shù)據(jù)庫(kù)存儲(chǔ),配合Electron做一個(gè)桌面應(yīng)用

需要存儲(chǔ)大量數(shù)據(jù)的應(yīng)用,比如圖書管理系統(tǒng)這類的需要存儲(chǔ)大量數(shù)據(jù)的應(yīng)用,完全可以將圖書信息存儲(chǔ)在IndexedDB中

配和service worker構(gòu)建pwa應(yīng)用,用來(lái)緩存網(wǎng)絡(luò)請(qǐng)求

總結(jié)

這篇文章簡(jiǎn)單介紹了IndexedDB的相關(guān)內(nèi)容,總的來(lái)說(shuō),IndexedDB的應(yīng)用頻率并不高,這是由于IndexedDB適用復(fù)雜度和不多的適用場(chǎng)景決定的,因此這里也只是對(duì)它做了簡(jiǎn)單介紹,希望看了這篇文章后,能對(duì)IndexedDB有個(gè)簡(jiǎn)單的了解,在需要使用的時(shí)候能有個(gè)印象。如果有錯(cuò)誤或不嚴(yán)謹(jǐn)?shù)牡胤?,歡迎批評(píng)指正,如果喜歡,歡迎點(diǎn)贊

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/103929.html

相關(guān)文章

  • 2019年夏天,我走上了前端之路

    摘要:對(duì)于前端開發(fā)來(lái)說(shuō),我機(jī)緣巧合走上這條路,我便始終如一,盡管可能與我專業(yè)不盡相同,這便是人生,所有事都是緣分。 HTML5 語(yǔ)義化標(biāo)簽 文本相關(guān)標(biāo)簽 表格相關(guān)標(biāo)簽 表單相關(guān)標(biāo)簽 多媒體API的豐富與增強(qiáng) CSS3 屬性選擇器 文本相關(guān)屬性 背景邊框,邊距屬性 大小、定位、輪廓屬性 盒模型與布局相關(guān)屬性 表格相關(guān)屬性 CSS動(dòng)畫效果 scss、less預(yù)編譯器 JavaScript...

    widuu 評(píng)論0 收藏0
  • 構(gòu)建 Web 應(yīng)用之 Service Worker 初探

    摘要:誕生之初,是單線程的。當(dāng)接收到服務(wù)端的響應(yīng)之后,便通過(guò)回調(diào)函數(shù)執(zhí)行之后的操作。沖鋒基于事件驅(qū)動(dòng)。擁有攔截請(qǐng)求消息推送靜默更新地理圍欄等服務(wù)??刂茣r(shí)處于兩種狀態(tài)之一終止以節(jié)省內(nèi)存監(jiān)聽(tīng)獲取和消息事件。支持的所有事件五銷毀瀏覽器決定是否銷毀。 這次體驗(yàn)一種新的博客風(fēng)格,我們長(zhǎng)話短說(shuō),針針見(jiàn)血。 showImg(https://segmentfault.com/img/remote/14600...

    voidking 評(píng)論0 收藏0
  • IndexedDB使用與出坑指南

    摘要:在不指定的情況下,默認(rèn)版本號(hào)為。具體示例如下在需要更新數(shù)據(jù)庫(kù)的模式時(shí),需要更新版本號(hào)。此時(shí)我們指定一個(gè)高于之前版本的版本號(hào),就會(huì)觸發(fā)事件。數(shù)據(jù)操作事務(wù)在中,我們也能夠使用事務(wù)來(lái)進(jìn)行數(shù)據(jù)庫(kù)的操作。 概述 本文通過(guò)對(duì)IndexedDB的使用方法和使用場(chǎng)景進(jìn)行相關(guān)介紹,對(duì)常見(jiàn)的問(wèn)題進(jìn)行解答。 同時(shí),因?yàn)镸DN中的相關(guān)文檔缺乏相關(guān)邏輯性,所以不容易理解。本文將通過(guò)項(xiàng)目中常見(jiàn)的數(shù)據(jù)存儲(chǔ)和操作需求...

    陳偉 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<