refresh date: 2026-09-25 robots: noindex
شرح
از chrome.storage API برای ذخیره، بازیابی، و پیگیری تغییرات دادههای کاربر استفاده کنید.
اجازهها
storageنمای کلی
Storage API روشی مختص افزونه برای حفظ دادهها و وضعیت کاربر ارائه میدهد. این میانای برنامهسازی کاربردی مشابه میاناهای برنامهسازی کاربردی فضای ذخیرهسازی پلاتفرم وب (IndexedDB و Storage) است، اما برای برآورده کردن نیازهای فضای ذخیرهسازی افزونهها طراحی شده است. در زیر چند ویژگی کلیدی آورده شده است:
- همه زمینههای افزونه، ازجمله کارگر سرویس افزونه و دستورگانهای محتوا، به Storage API دسترسی دارند.
- مقادیر قابلسریالسازی JSON بهعنوان ویژگیهای شیء ذخیره میشوند.
- Storage API با عملیات خواندن و نوشتن انبوه ناهمگام است.
- حتی اگر کاربر حافظه پنهان و سابقه مرور را پاک کند، دادهها باقی میمانند.
- تنظیمات ذخیرهشده حتی هنگام استفاده از حالت ناشناس تقسیمشده نیز باقی میمانند.
- شامل فضای ذخیرهسازی مدیریتشده انحصاری فقطخواندنی برای خطمشیهای سازمانی است.
اگرچه افزونهها میتوانند از میانای [Storage][mdn-storage] (قابلدسترسی از window.localStorage) در برخی زمینهها (صفحههای بالاپر و دیگر صفحههای HTML) استفاده کنند، اما بهدلایل زیر توصیه نمیشود:
- سرویسکار افزونه نمیتواند به
Storageدسترسی داشته باشد. - متنهای محتوا فضای ذخیرهسازی را با صفحه میزبان همرسانی میکنند.
- دادههای ذخیرهشده بااستفاده از میانای
Storageوقتی کاربر سابقه مرور خود را پاک میکند ازبین میرود.
برای انتقال دادهها از میاناهای برنامهسازی کاربردی فضای ذخیرهسازی وب به میاناهای برنامهسازی کاربردی فضای ذخیرهسازی افزونه ازطریق سرویسکار:
- یک سند خارجاز صفحه با روال تبدیل و یک گرداننده [
onMessage][on-message] ایجاد کنید. - یک روال تبدیل به سند خارجاز صفحه اضافه کنید.
- در کارگر سرویس افزونه،
chrome.storageرا برای دادههایتان بررسی کنید. - اگر دادههایتان پیدا نشد، سند خارجاز صفحهای [ایجاد کنید][create-offscreen] و برای شروع روال تبدیل، [
sendMessage()][send-message] را فراخوانی کنید. - در کنترلکننده
onMessageسند خارجاز صفحه، روال تبدیل را فراخوانی کنید.
همچنین تفاوتهای ظریفی در نحوه عملکرد میاناهای برنامهسازی کاربردی فضای ذخیرهسازی وب در افزونهها وجود دارد. در مقاله [فضای ذخیرهسازی و کوکیها][storage-and-cookies] اطلاعات بیشتری کسب کنید.
محلهای نگهداری
Storage API به چهار دسته زیر («فضاهای ذخیرهسازی») تقسیم میشود:
storage.local- دادهها بهصورت محلی ذخیره میشوند و با برداشتن افزونه پاک میشوند. محدودیت سهمیه تقریباً ۱۰ مگابایت است، اما با درخواست اجازه
"unlimitedStorage"میتوان آن را افزایش داد. برای ذخیره کردن حجم بیشتری از دادهها، از آن استفاده کنید.
storage.sync- اگر همگامسازی فعال باشد، دادهها با هر مرورگر Chrome که کاربر به سیستم آن وارد شده است همگامسازی میشود. اگر غیرفعال باشد، مانند
storage.localعمل میکند. وقتی مرورگر آفلاین است، Chrome دادهها را بهصورت محلی ذخیره میکند و وقتی دوباره آنلاین شد، همگامسازی را ازسر میگیرد. محدودیت سهمیه تقریباً ۱۰۰ کیلوبایت، ۸ کیلوبایت برای هر مورد است. برای حفظ تنظیمات کاربر در مرورگرهای همگامسازیشده، از آن استفاده کنید.
- storage.session
- دادهها را درطول جلسه مرورگر در حافظه نگه میدارد. بهطور پیشفرض، درمعرض اسکریپتهای محتوا قرار نمیگیرد، اما این رفتار را میتوان با تنظیم
chrome.storage.session.setAccessLevel()تغییر داد. محدودیت سهمیه تقریباً ۱۰ مگابایت است. از آن برای ذخیره متغیرهای سراسری در سراسر اجراهای سرویسکار استفاده کنید.
- storage.managed
- سرپرستان میتوانند از طرحواره و خطمشیهای سازمانی برای پیکربندی تنظیمات افزونه پشتیبانی در محیط مدیریتشده استفاده کنند. این فضای ذخیرهسازی فقط خواندنی است.
مانیفست
برای استفاده از میانای برنامهسازی کاربردی فضای ذخیرهسازی، اجازه "storage" را در
مانیفست افزونه اعلام کنید. برای مثال:
{
"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، به مانیفست برای فضاهای ذخیرهسازی مراجعه کنید.
محدودیتهای فضای ذخیرهسازی و محدود کردن شبکه
افزودن به Storage API را مثل گذاشتن چیزها در یک کامیون بزرگ درنظر نگیرید. افزودن به فضای ذخیرهسازی را مانند قرار دادن چیزی در لوله درنظر بگیرید. ممکن است ازقبل موادی در لوله وجود داشته باشد و حتی ممکن است پر باشد. همیشه فرض کنید بین زمانی که به فضای ذخیرهسازی اضافه میکنید و زمانی که واقعاً ضبط میشود، تأخیری وجود دارد.
برای جزئیات مربوط به محدودیتهای فضای ذخیرهسازی و آنچه درصورت فراتر رفتن از آنها اتفاق میافتد، اطلاعات سهمیه را برای sync، local، و session ببینید.
موارد استفاده
بخشهای زیر موارد استفاده رایج Storage API را نشان میدهد.
پاسخ همگام به بهروزرسانیهای فضای ذخیرهسازی
برای ردیابی تغییرات ایجادشده در فضای ذخیرهسازی، میتوانید شنوندهای به رویداد 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 ذخیره میکند و کارگر سرویس از 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);
}
});
پیشبارگیری ناهمگام از فضای ذخیرهسازی
ازآنجاییکه کارگران سرویس همیشه درحال اجرا نیستند، افزونههای «مانیفست نسخه ۳» گاهی اوقات باید
دادهها را بهصورت ناهمگام از فضای ذخیرهسازی بار کنند تا بتوانند گردانندههای رویداد خود را اجرا کنند. برای انجام این کار،
قطعه کد زیر از یک کنترلکننده رویداد 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
۱۰۴۸۵۷۶۰
حداکثر مقدار داده (به بایت) که میتواند در فضای ذخیرهسازی محلی ذخیره شود، که با رشتهسازی JSON هر مقدار بهعلاوه طول هر کلید اندازهگیری میشود. اگر افزونه اجازه
unlimitedStorageرا داشته باشد، این مقدار نادیده گرفته خواهد شد. بهروزرسانیهایی که باعث فراتر رفتن از این حد مجاز میشوند فوراً ناموفق میشوند و هنگام استفاده از فراخوانی برگشتی،runtime.lastErrorرا تنظیم میکنند، یا اگر از async/await استفاده شود، Promise رد میشود.
managed
موارد موجود در فضای ذخیرهسازی managed توسط خطمشی سازمانی پیکربندیشده توسط سرپرست دامنه تنظیم میشوند و برای افزونه فقط خواندنی هستند؛ تلاش برای اصلاح این فضای نام منجر به خطا میشود. برای کسب اطلاعات درباره پیکربندی خطمشی، به مانیفست برای فضاهای ذخیرهسازی مراجعه کنید.
نوع
sync
موارد موجود در فضای ذخیرهسازی sync بااستفاده از «همگامسازی Chrome» همگامسازی میشوند.
نوع
StorageArea و شیء
مشخصات
-
MAX_ITEMS
۵۱۲
حداکثر تعداد مواردی که میتوان در فضای ذخیرهسازی همگامسازی ذخیره کرد. بهروزرسانیهایی که باعث فراتر رفتن از این حد مجاز شوند بلافاصله ناموفق خواهند بود و هنگام استفاده از فراخوانی برگشتی یا رد شدن Promise،
runtime.lastErrorرا تنظیم میکنند. -
MAX_SUSTAINED_WRITE_OPERATIONS_PER_MINUTE
۱۰۰۰۰۰۰
منسوخشدهstorage.sync API دیگر سهمیه عملیات نوشتن پایدار ندارد.
-
MAX_WRITE_OPERATIONS_PER_HOUR
۱۸۰۰
حداکثر تعداد عملیات
set،remove، یاclearکه میتوان در هر ساعت انجام داد. این مقدار برابر با ۱ نوشتن در هر ۲ ثانیه است که سقفی پایینتر از حد مجاز بالاتر نوشتن در دقیقه در کوتاهمدت است.بهروزرسانیهایی که باعث فراتر رفتن از این حد میشوند بلافاصله ناموفق میشوند و هنگام استفاده از فراخوانی برگشتی یا وقتی Promise رد میشود،
runtime.lastErrorرا تنظیم میکنند. -
MAX_WRITE_OPERATIONS_PER_MINUTE
۱۲۰
حداکثر تعداد عملیات
set،remove، یاclearکه میتوان در هر دقیقه انجام داد. این مقدار ۲ در ثانیه است که توان عملیاتی بالاتری نسبتبه نوشتن در ساعت در مدت زمان کوتاهتر ارائه میدهد.بهروزرسانیهایی که باعث فراتر رفتن از این حد میشوند بلافاصله ناموفق میشوند و هنگام استفاده از فراخوانی برگشتی یا وقتی Promise رد میشود،
runtime.lastErrorرا تنظیم میکنند. -
QUOTA_BYTES
۱۰۲۴۰۰
حداکثر مقدار کل (به بایت) دادهای که میتواند در فضای ذخیرهسازی همگامسازی ذخیره شود، که با رشتهسازی JSON هر مقدار بهعلاوه طول هر کلید اندازهگیری میشود. بهروزرسانیهایی که باعث فراتر رفتن از این حد میشوند بلافاصله ناموفق میشوند و هنگام استفاده از فراخوانی برگشتی یا وقتی Promise رد میشود،
runtime.lastErrorرا تنظیم میکنند. -
QUOTA_BYTES_PER_ITEM
8192
حداکثر اندازه (به بایت) هر مورد مجزا در فضای ذخیرهسازی همگامسازی، که با رشتهسازی JSON مقدار آن بهعلاوه طول کلید آن اندازهگیری میشود. بهروزرسانیهای حاوی موارد بزرگتر از این حد فوراً ناموفق خواهند بود و هنگام استفاده از فراخوانی برگشتی یا وقتی Promise رد میشود،
runtime.lastErrorرا تنظیم میکنند.
رویدادها
onChanged
chrome.storage.onChanged.addListener(
callback: function,
)
وقتی یک یا چند مورد تغییر کند، فعال میشود.
پارامترها
-
تماس برگشتی
عملکرد
پارامتر
callbackبهصورت زیر است:(changes: object, areaName: string) => void
-
تغییرات
شیء
-
areaName
رشته
-