Chrome 存儲 API

參考原文1
參考原文2
圖靈社區(qū)的教程

知識點:

  • storage
  • onChanged()




Chrome 為擴展應(yīng)用提供了存儲 API渴语,以便將擴展中需要保存的數(shù)據(jù)寫入本地磁盤觅赊。Chrome 提供的存儲 API 可以說是對 localStorage 的改進相满,它與 localStorage 相比有以下區(qū)別:

  • 用戶數(shù)據(jù)可以通過 Chrome 瀏覽器的同步功能自動同步(使用 storage.sync

  • content_scripts 可以直接讀取數(shù)據(jù)抠藕,而不必通過 background 頁面

  • 在隱身模式下仍然可以讀出之前存儲的數(shù)據(jù)

  • 讀寫速度更快

  • 用戶數(shù)據(jù)可以以對象的類型保存(localStorage API 以字符串方式存儲數(shù)據(jù))墩朦。

對于第二點要進一步說明一下。首先 localStorage 是基于域名的绊谭。而 content_scripts 是注入到用戶當(dāng)前瀏覽頁面中的政恍,如果 content_scripts 直接讀取 localStorage,所讀取到的數(shù)據(jù)是用戶當(dāng)前瀏覽頁面所在域中的龙誊。

所以通常的解決辦法是 content_scripts 通過 runtime.sendMessagebackground 通信抚垃,由 background 讀寫擴展所在域(通常是 chrome-extension://extension-id/)的 localStorage,然后再傳遞給 content_scripts趟大。




使用 Chrome 存儲 API 必須要在 Manifest 的 permissions 中聲明 "storage",之后才有權(quán)限調(diào)用铣焊。

Chrome 存儲 API 提供了 2 種儲存區(qū)域逊朽,分別是 synclocal。兩種儲存區(qū)域的區(qū)別在于曲伊,sync 儲存的區(qū)域會根據(jù)用戶當(dāng)前在 Chrome 上登陸的 Google 賬戶自動同步數(shù)據(jù)叽讳,當(dāng)無可用網(wǎng)絡(luò)連接可用時,sync 區(qū)域?qū)?shù)據(jù)的讀寫和 local 區(qū)域?qū)?shù)據(jù)的讀寫行為一致坟募。

對于每種儲存區(qū)域岛蚤,Chrome 又提供了 5 個方法,分別是 get懈糯、getBytesInUse涤妒、setremoveclear赚哗。

sync 區(qū)域存儲和讀取數(shù)據(jù):

chrome.storage.sync.set({key: value}, function() {
    console.log('Value is set to ' + value);
});

chrome.storage.sync.get(['key'], function(result) {
    console.log('Value currently is ' + result.key);
});

local 區(qū)域:

chrome.storage.local.set({key: value}, function() {
    console.log('Value is set to ' + value);
});

chrome.storage.local.get(['key'], function(result) {
    console.log('Value currently is ' + result.key);
});




下面我們寫個小例子來說明她紫。

編寫 manifest.json 文件:

{
    "manifest_version": 2,
    "name": "存儲測試",
    "version": "1.0",
    "description": "存儲測試",

    "browser_action": {
        "default_popup": "popup.html"
    },

    // 設(shè)定使用存儲的權(quán)限
    "permissions": [
        "storage"
    ]
}

編寫 popup.html 頁面:

<style type="text/css">
    * {
        margin: 0;
        padding: 0;
    }

    body {
        width: 250px;
        height: 300px;
    }
</style>

<script type="text/javascript" src="js/popup.js"></script>

編寫 popup.js 文件:

var user1 = {'name': 'diego', 'age': 18}

// 往存儲中寫入數(shù)據(jù)
chrome.storage.sync.set({'user1': user1}, function() {
    console.log('保存成功');
});

// 從存儲中讀取數(shù)據(jù)
chrome.storage.sync.get('user1', function(result) {
    document.write('name: ' + result['user1'].name + '<br>' + 'age: ' + result['user1'].age );
});

現(xiàn)在我們能在頁面上看到剛存儲的數(shù)據(jù):





get() 方法中 keys 可以是字符串硅堆、包含多個字符串的數(shù)組或?qū)ο蟆?/p>

如果 keys是字符串,則和 localStorage 的用法類似(見上例)贿讹;如果是數(shù)組渐逃,則相當(dāng)于一次讀取了多個數(shù)據(jù)。

var user1 = {'name': 'diego', 'age': 18}
var user2 = {'name': 'tony', 'age': 19}

// 往存儲中寫入數(shù)據(jù)
chrome.storage.sync.set({'user2': user2}, function() {
    console.log('保存成功');
});

chrome.storage.sync.set({'user1': user1}, function() {
    console.log('保存成功');
});

// 從存儲中讀取數(shù)據(jù)
chrome.storage.sync.get(['user1', 'user2'], function(result) {
    document.write(
        'name: ' + result['user1'].name + '<br>' + 'age: ' + result['user1'].age 
        + '<hr>' 
        + 'name: ' + result['user2'].name + '<br>' + 'age: ' + result['user2'].age
        );
});

如果 keys 是對象民褂,則會先讀取以這個對象屬性名為鍵值的數(shù)據(jù)茄菊,如果這個數(shù)據(jù)不存在則返回 keys 對象的屬性值(比如 keys{'name':'Billy'},如果 name 這個值存在赊堪,就返回 name 原有的值面殖,如果不存在就返回 'Billy')。

var user1 = {'name': 'diego', 'age': 18}
var default_user = {'name': 'default_user', 'age': 18}


// 往存儲中寫入數(shù)據(jù)
chrome.storage.sync.set({'user1': user1}, function() {
    console.log('保存成功');
});

// 從存儲中讀取數(shù)據(jù)
chrome.storage.sync.get({'user2': default_user}, function(result) {
    document.write('name: ' + result['user2'].name + '<br>' + 'age: ' + result['user2'].age );
});

因為 'user2' 這個值是不存在的雹食,所以返回的是 default_user 這個對象畜普;如果換成 'user1' 這個存在的值,則會返回 user1 這個對象群叶。

如果 keys 為一個空數(shù)組([])或空對象({})吃挑,則返回一個空列表,如果 keysnull街立,則返回所有存儲的數(shù)據(jù)舶衬。




getBytesInUse() 方法為獲取一個數(shù)據(jù)或多個數(shù)據(jù)所占用的總空間,返回結(jié)果的單位是字節(jié)赎离,完整方法為:

// sync 區(qū)域
chrome.storage.sync.getBytesInUse(keys, function(bytes){
    console.log(bytes);
});

// local 區(qū)域
chrome.storage.local.getBytesInUse(keys, function(bytes){
    console.log(bytes);
});

此處的 keys 只能為 null逛犹、字符串或包含多個字符串的數(shù)組。




set() 方法為寫入數(shù)據(jù)梁剔,完整方法為:

// sync 區(qū)域
chrome.storage.sync.set(items, function(){
    //do something
});

// local 區(qū)域
chrome.storage.local.set(items, function(){
    //do something
});

items 為對象類型虽画,形式為鍵/值對。items 的屬性值如果是字符型荣病、數(shù)字型和數(shù)組型码撰,則儲存的格式不會改變,但如果是對象型和函數(shù)型的个盆,會被儲存為 "{}"脖岛,如果是日期型和正則型的,會被儲存為它們的字符串形式颊亮。




remove() 方法為刪除數(shù)據(jù)柴梆,完整方法為:

// sync 區(qū)域
chrome.storage.sync.remove(keys, function(){
    //do something
});

// local 區(qū)域
chrome.storage.local.remove(keys, function(){
    //do something
});

其中 keys 可以是字符串,也可以是包含多個字符串的數(shù)組终惑。




clear() 方法為刪除所有數(shù)據(jù)绍在,完整方法為:

// sync 區(qū)域
chrome.storage.sync.clear(function(){
    //do something
});

// local 區(qū)域
chrome.storage.local.clear(function(){
    //do something
});




Chrome 同時還為存儲 API 提供了一個 onChanged() 事件,當(dāng)存儲區(qū)的數(shù)據(jù)發(fā)生改變時,這個事件會被激發(fā)揣苏。

onChanged() 的完整方法為:

chrome.storage.onChanged.addListener(function(changes, areaName){
    console.log('Value in '+areaName+' has been changed:');
    console.log(changes);
});

callback() 會接收到兩個參數(shù)悯嗓,第一個為 changes,第二個是 StorageArea卸察。changes 是詞典對象脯厨,鍵為更改的屬性名稱,值包含兩個屬性坑质,分別為 oldValuenewValue合武;StorageArealocalsync

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涡扼,一起剝皮案震驚了整個濱河市稼跳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吃沪,老刑警劉巖汤善,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異票彪,居然都是意外死亡红淡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門降铸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來在旱,“玉大人,你說我怎么就攤上這事推掸⊥靶” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵谅畅,是天一觀的道長登渣。 經(jīng)常有香客問我,道長毡泻,這世上最難降的妖魔是什么绍豁? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮牙捉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘敬飒。我一直安慰自己邪铲,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布无拗。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鸥跟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天被饿,我揣著相機與錄音,去河邊找鬼搪搏。 笑死狭握,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疯溺。 我是一名探鬼主播论颅,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼囱嫩!你這毒婦竟也來了恃疯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤墨闲,失蹤者是張志新(化名)和其女友劉穎今妄,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸳碧,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡盾鳞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了杆兵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雁仲。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖琐脏,靈堂內(nèi)的尸體忽然破棺而出攒砖,到底是詐尸還是另有隱情,我是刑警寧澤日裙,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布吹艇,位于F島的核電站,受9級特大地震影響昂拂,放射性物質(zhì)發(fā)生泄漏受神。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一格侯、第九天 我趴在偏房一處隱蔽的房頂上張望鼻听。 院中可真熱鬧,春花似錦联四、人聲如沸撑碴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽醉拓。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間亿卤,已是汗流浹背愤兵。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留排吴,地道東北人秆乳。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像傍念,于是被迫代替她去往敵國和親矫夷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 通常Chrome擴展使用以下三種方法中的一種來儲存數(shù)據(jù): 第一種是使用HTML5的localStorage憋槐; 可以...
    本草博士閱讀 7,065評論 0 2
  • chrome擴展開發(fā)入門教程 最近在開發(fā)chrome插件双藕,看到一篇非常適合入門的教程,特記錄一下 注:轉(zhuǎn)載 本文首...
    謝大見閱讀 6,433評論 1 25
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理阳仔,服務(wù)發(fā)現(xiàn)忧陪,斷路器,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • Chrome擴展開發(fā) 標(biāo)簽(空格分隔): Chrome擴展 1近范、寫在前面 Chrome插件是一個用Web技術(shù)開發(fā)...
    記憶的時間差閱讀 6,031評論 0 15
  • 天堂如果真是我想象中的地方嘶摊,那么天堂里應(yīng)該沒有煩惱、沒有憎恨评矩,完美無瑕叶堆,從來沒有壞事和悲傷。那里只有好人斥杜,人們不會...
    門前折柳閱讀 291評論 0 1