Храните тонны данных на локальном жестком диске.

Если вы хотите узнать основы расширений Google Chrome,ознакомьтесь с моей статьей здесь:



Чтобы продемонстрировать IndexedDB в контексте расширения Chrome, мы будем использовать простую HTML-страницу с двумя формами.

Одна форма для добавления записей.

Единая форма для поиска и редактирования записей.

Мы будем использовать эту форму через всплывающую страницу нашего расширения Chrome.

Давайте начнем

Наш файл манифеста

// manifest.json
{
    "name": "chrome ext with localDB",
    "description": "chrome ext interacting with IndexedDB",
    "version": "0.1.0",
    "manifest_version": 2,
    "icons": {
        "16": "./obj-16x16.png",
        "32": "./obj-32x32.png",
        "48": "./obj-48x48.png",
        "128": "./obj-128x128.png"
    },
    "background": {
        "scripts": [
            "./background.js"
        ]
    },
    "options_page": "./options.html",
    "browser_action": {
        "default_popup": "popup.html"
    },
    "permissions": []
}

Примечание.
Нам не нужны специальные разрешения; нам не нужно разрешение «хранилище», чтобы использовать IndexedDB.

Давайте посмотрим на этот фоновый скрипт!

При первой установке нашего расширения Chrome мы создаем базу данных

// background.js
let db = null;
function create_database() {
    const request = window.indexedDB.open('MyTestDB');
    request.onerror = function (event) {
        console.log("Problem opening DB.");
    }
    request.onupgradeneeded = function (event) {
        db = event.target.result;
        let objectStore = db.createObjectStore('roster', {
            keyPath: 'email'
        });
        objectStore.transaction.oncomplete = function (event) {
            console.log("ObjectStore Created.");
        }
    }
    request.onsuccess = function (event) {
        db = event.target.result;
        console.log("DB OPENED.");
        insert_records(roster);
        db.onerror = function (event) {
            console.log("FAILED TO OPEN DB.")
        }
    }
}

Затем заполните эту базу данных.

// background.js
function insert_records(records) {
    if (db) {
      const insert_transaction = db.transaction("roster", 
                                   "readwrite");
      const objectStore = insert_transaction.objectStore("roster");
      return new Promise((resolve, reject) => {
         insert_transaction.oncomplete = function () {
             console.log("ALL INSERT TRANSACTIONS COMPLETE.");
             resolve(true);
         }
         insert_transaction.onerror = function () {
             console.log("PROBLEM INSERTING RECORDS.")
             resolve(false);
         }
         records.forEach(person => {
           let request = objectStore.add(person);
           request.onsuccess = function () {
             console.log("Added: ", person);
           }
         });
      });
    }
}

Когда мы получаем сообщения для добавления, получения, обновления или удаления с переднего плана:

// background.js
function get_record(email) {
  if (db) {
    const get_transaction = db.transaction("roster", "readonly");
    const objectStore = get_transaction.objectStore("roster");
    return new Promise((resolve, reject) => {
      get_transaction.oncomplete = function () {
        console.log("ALL GET TRANSACTIONS COMPLETE.");
      }
      get_transaction.onerror = function () {
        console.log("PROBLEM GETTING RECORDS.")
      }
      let request = objectStore.get(email);
      request.onsuccess = function (event) {
        resolve(event.target.result);
      }
    });
  }
}
function update_record(record) {
  if (db) {
    const put_transaction = db.transaction("roster", "readwrite");
    const objectStore = put_transaction.objectStore("roster");
    return new Promise((resolve, reject) => {
      put_transaction.oncomplete = function () {
        console.log("ALL PUT TRANSACTIONS COMPLETE.");
        resolve(true);
      }
      put_transaction.onerror = function () {
        console.log("PROBLEM UPDATING RECORDS.")
        resolve(false);
      }
      objectStore.put(record);
    });
  }
}
function delete_record(email) {
  if (db) {
    const delete_transaction = db.transaction("roster", 
                                             "readwrite");
    const objectStore = delete_transaction.objectStore("roster");
    return new Promise((resolve, reject) => {
      delete_transaction.oncomplete = function () {
        console.log("ALL DELETE TRANSACTIONS COMPLETE.");
        resolve(true);
      }
      delete_transaction.onerror = function () {
        console.log("PROBLEM DELETE RECORDS.")
        resolve(false);
      }
      objectStore.delete(email);
    });
  }
}

…мы можем ответить получением, обновлением и удалением записей…

Давайте взглянем на всплывающую страницу и сопровождающий ее скрипт.

Всплывающая страница является базовой HTML-страницей. Две формы с кнопками…

…и, конечно же, наш ‘popup-script.js’, прикрепленный, чтобы мы могли захватывать и управлять DOM.

Именно в файле 'popup-script.js' мы собираем информацию о форме и отправляем сообщения в фоновый скрипт, чтобы фоновый скрипт мог выполнять
всю IndexedDB. > команды…

… и как только мы получим данные IndexedDB из нашего фона, мы продолжим и покажем пользователю некоторую визуальную обратную связь на всплывающей странице HTML!

Если вы хотите ознакомиться с более подробным руководством, посмотрите мой полный видеоурок на YouTube Объект – это А.

Не забудьте подписаться на нас в Instagram и Twitter, чтобы быть в курсе наших последних руководств по веб-разработке.

От имени команды plainenglish.io благодарим вас за внимание.