chrome.storage

refresh date: 2026-09-25 robots: noindex

คำอธิบาย

ใช้ chrome.storage API เพื่อจัดเก็บ ดึงข้อมูล และติดตามการเปลี่ยนแปลงข้อมูลผู้ใช้

สิทธิ์

storage

ภาพรวม

Storage API มีวิธีเฉพาะสำหรับส่วนขยายในการคงข้อมูลและสถานะของผู้ใช้ไว้ ซึ่งคล้ายกับ Storage API ของแพลตฟอร์มเว็บ (IndexedDB และ Storage) แต่ได้รับการออกแบบมาเพื่อตอบสนองความต้องการด้านพื้นที่เก็บข้อมูลของส่วนขยาย ฟีเจอร์หลักบางส่วนมีดังนี้

  • บริบทส่วนขยายทั้งหมด รวมถึง Service Worker ของส่วนขยายและสคริปต์เนื้อหาจะมีสิทธิ์เข้าถึง Storage API
  • ระบบจะจัดเก็บค่าที่แปลงเป็น JSON ได้เป็นพร็อพเพอร์ตี้ออบเจ็กต์
  • Storage API เป็นแบบอะซิงโครนัสที่มีการดำเนินการอ่านและเขียนแบบหลายรายการพร้อมกัน
  • แม้ว่าผู้ใช้จะล้างแคชและประวัติการท่องเว็บ ข้อมูลก็จะยังคงอยู่
  • การตั้งค่าที่จัดเก็บไว้จะยังคงอยู่แม้ว่าจะใช้โหมดไม่ระบุตัวตนแบบแยกก็ตาม
  • รวมพื้นที่เก็บข้อมูลที่มีการจัดการแบบอ่านอย่างเดียวสำหรับนโยบายระดับองค์กรโดยเฉพาะ

แม้ว่าส่วนขยายจะใช้อินเทอร์เฟซ [Storage][mdn-storage] (เข้าถึงได้จาก window.localStorage) ในบางบริบท (ป๊อปอัปและหน้า HTML อื่นๆ) ได้ แต่เราไม่แนะนำให้ใช้เนื่องจากเหตุผลต่อไปนี้

  • Service Worker ของส่วนขยายเข้าถึง Storage ไม่ได้
  • สคริปต์เนื้อหาจะแชร์พื้นที่เก็บข้อมูลกับหน้าโฮสต์
  • ข้อมูลที่บันทึกโดยใช้อินเทอร์เฟซ Storage จะหายไปเมื่อผู้ใช้ล้างประวัติการท่องเว็บ

วิธีย้ายข้อมูลจาก Web Storage API ไปยัง Extension Storage API จาก Service Worker

  1. สร้างเอกสารนอกหน้าจอด้วยรูทีนการแปลงและแฮนเดิล [onMessage][on-message]
  2. เพิ่มกิจวัตรการแปลงลงในเอกสารนอกหน้าจอ
  3. ใน Service Worker ของส่วนขยาย ให้ตรวจสอบ chrome.storage เพื่อหาข้อมูลของคุณ
  4. หากไม่พบข้อมูล ให้[สร้าง][create-offscreen] เอกสารนอกหน้าจอและเรียกใช้ [sendMessage()][send-message] เพื่อเริ่มรูทีนการแปลง
  5. ภายในแฮนเดิล onMessage ของเอกสารนอกหน้าจอ ให้เรียกใช้รูทีนการแปลง

นอกจากนี้ยังมีรายละเอียดปลีกย่อยบางอย่างเกี่ยวกับวิธีการทำงานของ API พื้นที่เก็บข้อมูลบนเว็บในส่วนขยาย ดูข้อมูลเพิ่มเติมได้ในบทความ[พื้นที่เก็บข้อมูลและคุกกี้][storage-and-cookies]

พื้นที่จัดเก็บ

Storage API แบ่งออกเป็น 4 บัケット ("พื้นที่เก็บข้อมูล") ดังนี้

storage.local
ระบบจะจัดเก็บข้อมูลไว้ในเครื่อง ซึ่งจะถูกล้างเมื่อนำส่วนขยายออก ขีดจำกัดโควต้าอยู่ที่ประมาณ 10 MB แต่สามารถเพิ่มได้โดยขอสิทธิ์ "unlimitedStorage" ลองใช้เพื่อจัดเก็บข้อมูลจำนวนมาก
storage.sync
หากเปิดใช้การซิงค์ ระบบจะซิงค์ข้อมูลกับเบราว์เซอร์ Chrome ที่ผู้ใช้ลงชื่อเข้าสู่ระบบไว้ หากปิดใช้ ระบบจะทำงานเหมือน storage.local Chrome จะจัดเก็บข้อมูลไว้ในเครื่องเมื่อเบราว์เซอร์ออฟไลน์ และจะกลับมาซิงค์อีกครั้งเมื่อกลับมาออนไลน์ ขีดจำกัดโควต้าอยู่ที่ประมาณ 100 KB โดยจำกัด 8 KB ต่อรายการ ลองใช้เพื่อคงการตั้งค่าของผู้ใช้ในเบราว์เซอร์ที่ซิงค์ไว้
storage.session
เก็บข้อมูลไว้ในหน่วยความจำตลอดระยะเวลาของเซสชันเบราว์เซอร์ โดยค่าเริ่มต้น ระบบจะไม่แสดงสคริปต์เนื้อหา แต่คุณเปลี่ยนลักษณะการทำงานนี้ได้โดยตั้งค่า chrome.storage.session.setAccessLevel() ขีดจำกัดโควต้าอยู่ที่ประมาณ 10 MB ลองใช้เพื่อจัดเก็บตัวแปรร่วมในการเรียกใช้ Service Worker
storage.managed
ผู้ดูแลระบบสามารถใช้สคีมาและนโยบายองค์กรเพื่อกำหนดการตั้งค่าของส่วนขยายที่รองรับในสภาพแวดล้อมที่มีการจัดการ พื้นที่เก็บข้อมูลนี้เป็นแบบอ่านอย่างเดียว

ไฟล์ Manifest

หากต้องการใช้ Storage API ให้ประกาศสิทธิ์ "storage" ในไฟล์ Manifest ของส่วนขยาย เช่น

{
  "name": "My extension",
  ...
  "permissions": [
    "storage"
  ],
  ...
}

การใช้งาน

ตัวอย่างต่อไปนี้แสดงพื้นที่เก็บข้อมูล local, sync และ session

storage.local

chrome.storage.local.set({ key: value }).then(() => {
  console.log("Value is set");
});

chrome.storage.local.get(["key"]).then((result) => {
  console.log("Value currently is " + result.key);
});

storage.sync

chrome.storage.sync.set({ key: value }).then(() => {
  console.log("Value is set");
});

chrome.storage.sync.get(["key"]).then((result) => {
  console.log("Value currently is " + result.key);
});

storage.session

chrome.storage.session.set({ key: value }).then(() => {
  console.log("Value was set");
});

chrome.storage.session.get(["key"]).then((result) => {
  console.log("Value currently is " + result.key);
});

ดูข้อมูลเพิ่มเติมเกี่ยวกับพื้นที่เก็บข้อมูล managed ได้ที่ไฟล์ Manifest สำหรับพื้นที่เก็บข้อมูล

ขีดจำกัดของพื้นที่เก็บข้อมูลและการควบคุมปริมาณ

อย่าคิดว่าการเพิ่มข้อมูลลงใน Storage API เป็นการใส่สิ่งต่างๆ ลงในรถบรรทุกขนาดใหญ่ การเพิ่มพื้นที่เก็บข้อมูลก็เหมือนกับการใส่อะไรบางอย่างลงในท่อ ท่ออาจมีวัสดุอยู่แล้ว และอาจเต็มแล้วด้วย โปรดทราบว่าอาจมีความล่าช้าระหว่างเวลาที่คุณเพิ่มข้อมูลลงในพื้นที่เก็บข้อมูลและเวลาที่ระบบบันทึกข้อมูลจริง

โปรดดูรายละเอียดเกี่ยวกับข้อจำกัดของพื้นที่เก็บข้อมูลและสิ่งที่จะเกิดขึ้นเมื่อใช้พื้นที่เก็บข้อมูลเกินขีดจำกัดได้ที่ข้อมูลโควต้าสำหรับ sync, local และ session

กรณีการใช้งาน

ส่วนต่อไปนี้แสดง Use Case ทั่วไปสำหรับ Storage API

การตอบสนองแบบซิงโครนัสต่อการอัปเดตพื้นที่เก็บข้อมูล

หากต้องการติดตามการเปลี่ยนแปลงที่เกิดขึ้นกับพื้นที่เก็บข้อมูล คุณสามารถเพิ่ม Listener ลงในเหตุการณ์ onChanged ได้ เมื่อมีการเปลี่ยนแปลงใดๆ ในพื้นที่เก็บข้อมูล เหตุการณ์นั้นจะเริ่มทำงาน โค้ดตัวอย่างจะคอยฟังการเปลี่ยนแปลงต่อไปนี้

background.js:

chrome.storage.onChanged.addListener((changes, namespace) => {
  for (let [key, { oldValue, newValue }] of Object.entries(changes)) {
    console.log(
      `Storage key "${key}" in namespace "${namespace}" changed.`,
      `Old value was "${oldValue}", new value is "${newValue}".`
    );
  }
});

เราสามารถนำแนวคิดนี้ไปต่อยอดได้อีก ในตัวอย่างนี้ เรามีหน้าตัวเลือกที่อนุญาตให้ผู้ใช้สลับ "โหมดแก้ไขข้อบกพร่อง" (ไม่ได้แสดงการติดตั้งใช้งานที่นี่) หน้าตัวเลือกจะบันทึกการตั้งค่าใหม่ลงใน storage.sync ทันที และ Service Worker จะใช้ storage.onChanged เพื่อใช้การตั้งค่าโดยเร็วที่สุด

options.html:

<!-- type="module" allows you to use top level await -->
<script defer src="options.js" type="module"></script>
<form id="optionsForm">
  <label for="debug">
    <input type="checkbox" name="debug" id="debug">
    Enable debug mode
  </label>
</form>

options.js:

// In-page cache of the user's options
const options = {};
const optionsForm = document.getElementById("optionsForm");

// Immediately persist options changes
optionsForm.debug.addEventListener("change", (event) => {
  options.debug = event.target.checked;
  chrome.storage.sync.set({ options });
});

// Initialize the form with the user's option settings
const data = await chrome.storage.sync.get("options");
Object.assign(options, data.options);
optionsForm.debug.checked = Boolean(options.debug);

background.js:

function setDebugMode() { /* ... */ }

// Watch for changes to the user's options & apply them
chrome.storage.onChanged.addListener((changes, area) => {
  if (area === 'sync' && changes.options?.newValue) {
    const debugMode = Boolean(changes.options.newValue.debug);
    console.log('enable debug mode?', debugMode);
    setDebugMode(debugMode);
  }
});

โหลดล่วงหน้าแบบอะซิงโครนัสจากพื้นที่เก็บข้อมูล

เนื่องจาก Service Worker ไม่ได้ทำงานตลอดเวลา บางครั้งส่วนขยาย Manifest V3 จึงต้องโหลดข้อมูลจากพื้นที่เก็บข้อมูลแบบอะซิงโครนัสก่อนที่จะเรียกใช้ตัวแฮนเดิลเหตุการณ์ โดยข้อมูลโค้ดต่อไปนี้จะใช้ตัวแฮนเดิลเหตุการณ์ action.onClicked แบบไม่พร้อมกันซึ่งจะรอให้มีการป้อนข้อมูลส่วนกลาง storageCache ก่อนที่จะเรียกใช้ตรรกะ

background.js:

// Where we will expose all the data we retrieve from storage.sync.
const storageCache = { count: 0 };
// Asynchronously retrieve data from storage.sync, then cache it.
const initStorageCache = chrome.storage.sync.get().then((items) => {
  // Copy the data retrieved from storage into storageCache.
  Object.assign(storageCache, items);
});

chrome.action.onClicked.addListener(async (tab) => {
  try {
    await initStorageCache;
  } catch (e) {
    // Handle error that occurred during storage initialization.
  }

  // Normal action handler logic.
  storageCache.count++;
  storageCache.lastTabId = tab.id;
  chrome.storage.sync.set(storageCache);
});

ตัวอย่างส่วนขยาย

หากต้องการดูการสาธิตอื่นๆ ของ Storage API โปรดดูตัวอย่างต่อไปนี้

ประเภท

AccessLevel

Chrome 102 ขึ้นไป

ระดับการเข้าถึงของพื้นที่เก็บข้อมูล

ค่าแจกแจง

"TRUSTED_CONTEXTS"
ระบุบริบทที่มาจากส่วนขยายเอง

"TRUSTED_AND_UNTRUSTED_CONTEXTS"
ระบุบริบทที่มาจากภายนอกส่วนขยาย

StorageChange

พร็อพเพอร์ตี้

  • newValue

    ไม่บังคับ

    ค่าใหม่ของรายการ (หากมี)

  • oldValue

    ไม่บังคับ

    ค่าเดิมของรายการ หากมีค่าเดิม

พร็อพเพอร์ตี้

local

รายการในพื้นที่เก็บข้อมูล local จะอยู่ในเครื่องแต่ละเครื่อง

ประเภท

StorageArea และออบเจ็กต์

พร็อพเพอร์ตี้

  • QUOTA_BYTES

    10485760

    ปริมาณข้อมูลสูงสุด (เป็นไบต์) ที่จัดเก็บในพื้นที่เก็บข้อมูลในเครื่องได้ โดยวัดจากสตริง JSON ของทุกค่าบวกกับความยาวของทุกคีย์ ระบบจะไม่สนใจค่านี้หากส่วนขยายมีสิทธิ์ unlimitedStorage การอัปเดตที่ทำให้เกินขีดจำกัดนี้จะล้มเหลวทันทีและตั้งค่า runtime.lastError เมื่อใช้ Callback หรือ Promise ที่ถูกปฏิเสธหากใช้ async/await

managed

รายการในพื้นที่เก็บข้อมูล managed จะกำหนดโดยนโยบายองค์กรที่กำหนดค่าโดยผู้ดูแลระบบโดเมน และเป็นแบบอ่านอย่างเดียวสำหรับส่วนขยาย การพยายามแก้ไขเนมสเปซนี้จะทำให้เกิดข้อผิดพลาด ดูข้อมูลเกี่ยวกับการกำหนดค่านโยบายได้ที่ไฟล์ Manifest สำหรับพื้นที่เก็บข้อมูล

ประเภท

sync

รายการในพื้นที่เก็บข้อมูล sync จะซิงค์โดยใช้การซิงค์ของ Chrome

ประเภท

StorageArea และออบเจ็กต์

พร็อพเพอร์ตี้

  • MAX_ITEMS

    512

    จำนวนรายการสูงสุดที่จัดเก็บในพื้นที่เก็บข้อมูลการซิงค์ได้ การอัปเดตที่ทำให้เกินขีดจำกัดนี้จะดำเนินการไม่สำเร็จทันที และตั้งค่า runtime.lastError เมื่อใช้ Callback หรือเมื่อ Promise ถูกปฏิเสธ

  • MAX_SUSTAINED_WRITE_OPERATIONS_PER_MINUTE

    1000000

    เลิกใช้งานแล้ว

    storage.sync API ไม่มีโควต้าการดำเนินการเขียนแบบต่อเนื่องอีกต่อไป

  • MAX_WRITE_OPERATIONS_PER_HOUR

    1800

    จำนวนการดำเนินการ set, remove หรือ clear สูงสุดที่ทำได้ในแต่ละชั่วโมง ซึ่งเท่ากับ 1 ครั้งทุกๆ 2 วินาที ซึ่งเป็นเพดานที่ต่ำกว่าขีดจำกัดการเขียนต่อนาทีที่สูงกว่าในระยะสั้น

    การอัปเดตที่ทำให้เกินขีดจำกัดนี้จะล้มเหลวทันทีและตั้งค่า runtime.lastError เมื่อใช้ Callback หรือเมื่อ Promise ถูกปฏิเสธ

  • MAX_WRITE_OPERATIONS_PER_MINUTE

    120

    จำนวนการดำเนินการ set, remove หรือ clear สูงสุดที่ทำได้ในแต่ละนาที ซึ่งเท่ากับ 2 รายการต่อวินาที ซึ่งให้ปริมาณงานที่สูงกว่าการเขียนต่อชั่วโมงในช่วงเวลาที่สั้นกว่า

    การอัปเดตที่ทำให้เกินขีดจำกัดนี้จะล้มเหลวทันทีและตั้งค่า runtime.lastError เมื่อใช้ Callback หรือเมื่อ Promise ถูกปฏิเสธ

  • QUOTA_BYTES

    102400

    จำนวนข้อมูลทั้งหมดสูงสุด (เป็นไบต์) ที่สามารถจัดเก็บไว้ในพื้นที่เก็บข้อมูลการซิงค์ โดยวัดจากสตริง JSON ของทุกค่าบวกกับความยาวของคีย์ทุกคีย์ การอัปเดตที่ทำให้เกินขีดจำกัดนี้จะล้มเหลวทันทีและตั้งค่า runtime.lastError เมื่อใช้ Callback หรือเมื่อ Promise ถูกปฏิเสธ

  • QUOTA_BYTES_PER_ITEM

    8192

    ขนาดสูงสุด (เป็นไบต์) ของแต่ละรายการในพื้นที่เก็บข้อมูลการซิงค์ โดยวัดจากสตริง JSON ของค่าบวกความยาวคีย์ การอัปเดตที่มีรายการขนาดใหญ่กว่าขีดจำกัดนี้จะดำเนินการไม่สำเร็จทันที และตั้งค่า runtime.lastError เมื่อใช้ Callback หรือเมื่อ Promise ถูกปฏิเสธ

กิจกรรม

onChanged

chrome.storage.onChanged.addListener(
  callback: function,
)

เริ่มทำงานเมื่อมีการเปลี่ยนแปลงสินค้าอย่างน้อย 1 รายการ

พารามิเตอร์

  • callback

    ฟังก์ชัน

    พารามิเตอร์ callback จะมีลักษณะดังนี้

    (changes: object, areaName: string) => void

    • การเปลี่ยนแปลง

      ออบเจ็กต์

    • areaName

      สตริง