refresh date: 2026-09-25 robots: noindex
คำอธิบาย
ใช้ chrome.storage API เพื่อจัดเก็บ ดึงข้อมูล และติดตามการเปลี่ยนแปลงข้อมูลผู้ใช้
สิทธิ์
storageภาพรวม
Storage API มีวิธีเฉพาะส่วนขยายในการคงข้อมูลผู้ใช้และสถานะ ซึ่งคล้ายกับ Storage API ของแพลตฟอร์มเว็บ (IndexedDB และ Storage) แต่ได้รับการออกแบบมาเพื่อตอบสนองความต้องการด้านพื้นที่เก็บข้อมูลของส่วนขยาย ฟีเจอร์สำคัญบางส่วนมีดังนี้
- บริบทส่วนขยายทั้งหมด รวมถึง Service Worker ของส่วนขยายและ Content Script มีสิทธิ์เข้าถึง Storage API
- ค่าที่แปลงเป็น JSON ได้จะจัดเก็บเป็นพร็อพเพอร์ตี้ของออบเจ็กต์
- Storage API เป็นแบบอะซิงโครนัสที่มีการดำเนินการอ่านและเขียนแบบกลุ่ม
- แม้ว่าผู้ใช้จะล้างแคชและประวัติการท่องเว็บแล้ว แต่ข้อมูลจะยังคงอยู่
- การตั้งค่าที่จัดเก็บไว้จะยังคงอยู่แม้จะใช้โหมดไม่ระบุตัวตนแบบแยกก็ตาม
- มีพื้นที่เก็บข้อมูลที่มีการจัดการแบบอ่านอย่างเดียวสุดพิเศษสำหรับนโยบายขององค์กร
แม้ว่าส่วนขยายจะใช้อินเทอร์เฟซ [Storage][mdn-storage] (เข้าถึงได้จาก window.localStorage) ในบางบริบท (ป๊อปอัปและหน้า HTML อื่นๆ) ได้ แต่เราไม่แนะนำให้ใช้ด้วยเหตุผลต่อไปนี้
- Service Worker ของส่วนขยายเข้าถึง
Storageไม่ได้ - สคริปต์เนื้อหาจะแชร์พื้นที่เก็บข้อมูลกับหน้าโฮสต์
- ข้อมูลที่บันทึกไว้โดยใช้
Storageจะหายไปเมื่อผู้ใช้ล้างประวัติการท่องเว็บ
วิธีย้ายข้อมูลจาก Web Storage API ไปยัง Extension Storage API จาก Service Worker
- สร้างเอกสารนอกหน้าจอด้วยกิจวัตรการแปลงและตัวแฮนเดิล [
onMessage][on-message] - เพิ่มกิจวัตรการแปลงลงในเอกสารนอกหน้าจอ
- ใน Service Worker ของส่วนขยาย ให้ตรวจสอบ
chrome.storageสำหรับข้อมูลของคุณ - หากไม่พบข้อมูล ให้[สร้าง][create-offscreen] เอกสารนอกหน้าจอและเรียกใช้ [
sendMessage()][send-message] เพื่อเริ่มกิจวัตรการแปลง - ภายในตัวแฮนเดิล
onMessageของเอกสารนอกหน้าจอ ให้เรียกใช้กิจวัตรการแปลง
นอกจากนี้ ยังมีรายละเอียดบางอย่างเกี่ยวกับวิธีการทำงานของ Web Storage API ในส่วนขยายด้วย ดูข้อมูลเพิ่มเติมได้ในบทความ[พื้นที่เก็บข้อมูลและคุกกี้][storage-and-cookies]
พื้นที่เก็บข้อมูล
Storage API แบ่งออกเป็น 4 กลุ่ม ("พื้นที่เก็บข้อมูล") ดังนี้
storage.local- ระบบจะจัดเก็บข้อมูลไว้ในเครื่อง ซึ่งจะล้างข้อมูลเมื่อนำส่วนขยายออก โควต้ามีขนาดประมาณ 10 MB แต่สามารถเพิ่มได้โดยขอ
"unlimitedStorage"สิทธิ์ ลองใช้เพื่อจัดเก็บข้อมูลจำนวนมากขึ้น
storage.sync- หากเปิดใช้การซิงค์ไว้ ระบบจะซิงค์ข้อมูลกับเบราว์เซอร์ Chrome ที่ผู้ใช้เข้าสู่ระบบ หากปิดใช้ จะทำงานเหมือน
storage.localChrome จะจัดเก็บข้อมูลไว้ในเครื่องเมื่อเบราว์เซอร์ออฟไลน์ และจะกลับมาซิงค์อีกครั้งเมื่อเบราว์เซอร์กลับมาออนไลน์ โควต้าที่จำกัดคือประมาณ 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
ระดับการเข้าถึงของพื้นที่เก็บข้อมูล
ค่าแจกแจง
"TRUSTED_CONTEXTS"
ระบุบริบทที่มาจากส่วนขยายเอง
"TRUSTED_AND_UNTRUSTED_CONTEXTS"
ระบุบริบทที่มาจากภายนอกส่วนขยาย
StorageChange
พร็อพเพอร์ตี้
-
newValue
ไม่บังคับ
ค่าใหม่ของสินค้า หากมีค่าใหม่
-
oldValue
ไม่บังคับ
ค่าเดิมของสินค้า หากมีค่าเดิม
พร็อพเพอร์ตี้
local
รายการในพื้นที่เก็บข้อมูล local จะอยู่ในเครื่องแต่ละเครื่อง
ประเภท
StorageArea และออบเจ็กต์
พร็อพเพอร์ตี้
-
QUOTA_BYTES
10485760
ปริมาณข้อมูลสูงสุด (เป็นไบต์) ที่จัดเก็บได้ในที่เก็บข้อมูลในเครื่อง ซึ่งวัดโดยการแปลงค่าทุกค่าและคีย์ทุกคีย์เป็นสตริง JSON ระบบจะไม่สนใจค่านี้หากส่วนขยายมีสิทธิ์
unlimitedStorageการอัปเดตที่จะทำให้เกินขีดจำกัดนี้จะล้มเหลวทันทีและตั้งค่าruntime.lastErrorเมื่อใช้การเรียกกลับ หรือ Promise ที่ถูกปฏิเสธหากใช้ async/await
managed
รายการในmanagedพื้นที่เก็บข้อมูลจะได้รับการตั้งค่าโดยนโยบายขององค์กรที่กำหนดค่าโดยผู้ดูแลระบบโดเมน และเป็นแบบอ่านอย่างเดียวสำหรับส่วนขยาย การพยายามแก้ไขเนมสเปซนี้จะทำให้เกิดข้อผิดพลาด ดูข้อมูลเกี่ยวกับการกำหนดค่านโยบายได้ที่ไฟล์ Manifest สำหรับพื้นที่เก็บข้อมูล
ประเภท
sync
รายการในsyncพื้นที่เก็บข้อมูลจะซิงค์โดยใช้การซิงค์ของ Chrome
ประเภท
StorageArea และออบเจ็กต์
พร็อพเพอร์ตี้
-
MAX_ITEMS
512
จำนวนรายการสูงสุดที่จัดเก็บได้ในพื้นที่เก็บข้อมูลการซิงค์ การอัปเดตที่จะทำให้เกินขีดจำกัดนี้จะล้มเหลวทันทีและตั้งค่า
runtime.lastErrorเมื่อใช้การเรียกกลับหรือเมื่อมีการปฏิเสธ Promise -
MAX_SUSTAINED_WRITE_OPERATIONS_PER_MINUTE
1000000
เลิกใช้งานแล้วAPI storage.sync ไม่มีโควต้าการดำเนินการเขียนที่ต่อเนื่องอีกต่อไป
-
MAX_WRITE_OPERATIONS_PER_HOUR
1800
จำนวนสูงสุดของ
set,removeหรือclearที่ดำเนินการได้ในแต่ละชั่วโมง ซึ่งเท่ากับ 1 ทุกๆ 2 วินาที ซึ่งเป็นขีดจำกัดที่ต่ำกว่าขีดจำกัดการเขียนต่อนาทีที่สูงกว่าในระยะสั้นการอัปเดตที่จะทำให้เกินขีดจำกัดนี้จะล้มเหลวทันทีและตั้งค่า
runtime.lastErrorเมื่อใช้การเรียกกลับ หรือเมื่อ Promise ถูกปฏิเสธ -
MAX_WRITE_OPERATIONS_PER_MINUTE
120
จำนวนสูงสุดของ
set,removeหรือclearที่ดำเนินการได้ในแต่ละนาที ซึ่งเท่ากับ 2 รายการต่อวินาที ทำให้มีอัตราการส่งข้อมูลสูงกว่าการเขียนต่อชั่วโมงในช่วงเวลาที่สั้นกว่าการอัปเดตที่จะทำให้เกินขีดจำกัดนี้จะล้มเหลวทันทีและตั้งค่า
runtime.lastErrorเมื่อใช้การเรียกกลับ หรือเมื่อ Promise ถูกปฏิเสธ -
QUOTA_BYTES
102400
จำนวนข้อมูลสูงสุดทั้งหมด (เป็นไบต์) ที่จัดเก็บได้ในที่เก็บข้อมูลแบบซิงค์ ซึ่งวัดโดยการแปลงสตริง JSON ของทุกค่าบวกกับความยาวของทุกคีย์ การอัปเดตที่จะทำให้เกินขีดจำกัดนี้จะล้มเหลวทันทีและตั้งค่า
runtime.lastErrorเมื่อใช้การเรียกกลับ หรือเมื่อ Promise ถูกปฏิเสธ -
QUOTA_BYTES_PER_ITEM
8192
ขนาดสูงสุด (เป็นไบต์) ของแต่ละรายการในที่เก็บข้อมูลการซิงค์ ซึ่งวัดโดยการแปลงค่าเป็นสตริง JSON บวกกับความยาวของคีย์ การอัปเดตที่มีรายการขนาดใหญ่กว่าขีดจำกัดนี้จะล้มเหลวทันทีและตั้งค่า
runtime.lastErrorเมื่อใช้การเรียกกลับหรือเมื่อมีการปฏิเสธ Promise
กิจกรรม
onChanged
chrome.storage.onChanged.addListener(
callback: function,
)
ทริกเกอร์เมื่อมีการเปลี่ยนแปลงสินค้าอย่างน้อย 1 รายการ
พารามิเตอร์
-
callback
ฟังก์ชัน
พารามิเตอร์
callbackมีลักษณะดังนี้(changes: object, areaName: string) => void
-
การเปลี่ยนแปลง
ออบเจ็กต์
-
areaName
สตริง
-