การประมาณพื้นที่เก็บข้อมูลที่ใช้ได้

DR

Chrome 61 และเบราว์เซอร์อื่นๆ ที่จะตามมาในอนาคต แสดงค่าประมาณของ พื้นที่เก็บข้อมูลที่เว็บแอปใช้และจำนวนปริมาณที่ใช้ได้ผ่าน

if ('storage' in navigator && 'estimate' in navigator.storage) {
  navigator.storage.estimate().then(({usage, quota}) => {
    console.log(`Using ${usage} out of ${quota} bytes.`);
  });
}

เว็บแอปและพื้นที่เก็บข้อมูลที่ทันสมัย

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

ข้อมูลประเภทแรกสิ่งที่ต้องใช้ในการโหลดเว็บแอปประกอบด้วย HTML JavaScript, CSS และบางทีอาจเป็นรูปภาพ Service Worker พร้อมด้วย Cache Storage API จัดหาโครงสร้างพื้นฐานที่จำเป็นสำหรับการประหยัดทรัพยากรหลักเหล่านั้นและใช้ ภายหลังเพื่อให้โหลดเว็บแอปของคุณได้อย่างรวดเร็ว ซึ่งควรจะข้ามเครือข่ายไปเลย (เครื่องมือที่ผสานรวมกับกระบวนการสร้างของเว็บแอปพลิเคชันของคุณ เช่น ไลบรารี Workbox หรือไลบรารีที่เก่ากว่า sw-precache สามารถทำให้กระบวนการจัดเก็บ อัปเดต และการใช้งานประเภทนี้เป็นไปโดยอัตโนมัติ data.)

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

อดีต: window.webkitStorageInfo และ navigator.webkitTemporaryStorage

ที่ผ่านมา เบราว์เซอร์สนับสนุนการสำรวจความคิดเห็นประเภทนี้ผ่านทางข้อความนำหน้า อินเทอร์เฟซแบบเดิมๆ (และเลิกใช้งานแล้ว) window.webkitStorageInfo ไม่ได้ค่อนข้างเก่า แต่ยังไม่ใช่มาตรฐาน navigator.webkitTemporaryStorage แม้ว่าอินเทอร์เฟซเหล่านี้จะให้ข้อมูลที่เป็นประโยชน์ แต่ก็ไม่มี มาตรฐานเว็บด้วย

ซึ่งนั่นคือกรณีที่ใช้ WHATWG Storage Standard เข้าสู่ภาพ

อนาคต: navigator.storage

API ที่มีประโยชน์ 2 รายการเป็นส่วนหนึ่งของการพัฒนา Storage Living Standard อย่างต่อเนื่อง เป็น StorageManager ซึ่งแสดงต่อเบราว์เซอร์ navigator.storage navigator.storage จะใช้งานได้เฉพาะในระบบที่ปลอดภัยเท่านั้น เช่นเดียวกับ API เว็บรุ่นใหม่อื่นๆ อีกมากมาย (แสดงผ่าน HTTPS หรือ localhost)

เมื่อปีที่แล้ว เราได้เปิดตัว navigator.storage.persist() ซึ่งทำให้เว็บแอปพลิเคชันสามารถขอพื้นที่เก็บข้อมูล ได้รับการยกเว้นจากการล้างข้อมูลอัตโนมัติ

ขณะนี้ได้มีการผนวกเข้าด้วยกันโดยเมธอด navigator.storage.estimate() ซึ่งทำหน้าที่เป็น การแทนที่ navigator.webkitTemporaryStorage.queryUsageAndQuota() ในปัจจุบัน estimate() แสดงข้อมูลที่คล้ายกัน แต่แสดง อินเทอร์เฟซที่อิงตามสัญญา ซึ่งสอดคล้องกับ API อะซิงโครนัสสมัยใหม่อื่นๆ สัญญาที่ว่า estimate() แสดงผลการแปลงด้วยออบเจ็กต์ที่มีพร็อพเพอร์ตี้ 2 รายการ ได้แก่ usage, แสดงจำนวนไบต์ที่ใช้อยู่ในปัจจุบัน และ quota ซึ่งแสดง ไบต์สูงสุดที่สามารถจัดเก็บโดยการตั้งค่าปัจจุบัน origin (เช่นเดียวกับส่วนอื่นๆ ที่เกี่ยวข้องกับพื้นที่เก็บข้อมูล จะมีการนำโควต้าไปใช้ทั่วทั้ง origin.)

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

ค่าประมาณพื้นที่เก็บข้อมูลในการใช้งานจริง

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

// For a primer on async/await, see
// https://developers.google.com/web/fundamentals/getting-started/primers/async-functions
async function storeDataAndUpdateUI(dataUrl) {
  // Pro-tip: The Cache Storage API is available outside of service workers!
  // See https://googlechrome.github.io/samples/service-worker/window-caches/
  const cache = await caches.open('data-cache');
  await cache.add(dataUrl);

  if ('storage' in navigator && 'estimate' in navigator.storage) {
    const {usage, quota} = await navigator.storage.estimate();
    const percentUsed = Math.round(usage / quota * 100);
    const usageInMib = Math.round(usage / (1024 * 1024));
    const quotaInMib = Math.round(quota / (1024 * 1024));

    const details = `${usageInMib} out of ${quotaInMib} MiB used (${percentUsed}%)`;

    // This assumes there's a <span id="storageEstimate"> or similar on the page.
    document.querySelector('#storageEstimate').innerText = details;
  }
}

ค่าประมาณนี้มีความแม่นยำเพียงใด

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

  • usage แสดงจำนวนไบต์ที่ต้นทางหนึ่งๆ ใช้ได้อย่างมีประสิทธิภาพ ต้นทางเดียวกัน ซึ่งอาจได้รับผลกระทบจากเทคนิคการบีบอัดภายใน บล็อกการจัดสรรขนาดคงที่ซึ่งอาจมีพื้นที่ที่ไม่ได้ใช้ และการแสดงข้อมูล ของ "tombstone" ระเบียน ที่อาจสร้างขึ้นชั่วคราวหลังจากการลบ เพื่อป้องกันการรั่วไหล ของข้อมูลขนาดที่แน่นอน ข้ามต้นทาง ทรัพยากรที่ไม่ชัดเจน ที่บันทึกไว้ในเครื่องอาจมีส่วนเพิ่มไบต์ของระยะห่างจากขอบให้กับ usage โดยรวม
  • quota แสดงปริมาณพื้นที่ซึ่งสำรองไว้สำหรับต้นทางในขณะนี้ ค่าจะขึ้นอยู่กับปัจจัยที่คงที่บางอย่าง เช่น ขนาดพื้นที่เก็บข้อมูลโดยรวม แต่ยังรวมถึง จำนวนปัจจัยที่อาจผันผวน เช่น จำนวนพื้นที่เก็บข้อมูล ที่ไม่ได้ใช้งานอยู่ในขณะนี้ เพื่อให้แอปพลิเคชันอื่นๆ ในอุปกรณ์เขียนหรือลบ ซึ่งก็คือจำนวนพื้นที่ที่เบราว์เซอร์ยินดีมอบให้เว็บของคุณ ต้นทางของแอปอาจเปลี่ยนแปลง

ปัจจุบัน: การตรวจหาฟีเจอร์และฟีเจอร์สำรอง

ระบบจะเปิดใช้ estimate() โดยค่าเริ่มต้นใน Chrome 61 เป็นต้นไป Firefox คือ กำลังทดสอบกับ navigator.storage แต่ตั้งแต่เดือนสิงหาคม 2017 เป็นต้นมา การทดสอบก็ไม่ได้เปลี่ยนไป โดยค่าเริ่มต้น สิ่งที่คุณต้องทำ เปิดใช้ค่ากำหนด dom.storageManager.enabled เพื่อทดสอบ

เมื่อทำงานกับฟังก์ชันที่มีเบราว์เซอร์บางประเภทยังไม่รองรับ การตรวจหาฟีเจอร์ถือเป็นสิ่งจำเป็น คุณสามารถรวมการตรวจหาฟีเจอร์กับ Wrapper ตามคำสัญญาที่ด้านบนของ navigator.webkitTemporaryStorage ที่เก่ากว่า ในการสร้างอินเทอร์เฟซที่สอดคล้องกันในลักษณะต่อไปนี้

function storageEstimateWrapper() {
  if ('storage' in navigator && 'estimate' in navigator.storage) {
    // We've got the real thing! Return its response.
    return navigator.storage.estimate();
  }

  if ('webkitTemporaryStorage' in navigator &&
      'queryUsageAndQuota' in navigator.webkitTemporaryStorage) {
    // Return a promise-based wrapper that will follow the expected interface.
    return new Promise(function(resolve, reject) {
      navigator.webkitTemporaryStorage.queryUsageAndQuota(
        function(usage, quota) {resolve({usage: usage, quota: quota})},
        reject
      );
    });
  }

  // If we can't estimate the values, return a Promise that resolves with NaN.
  return Promise.resolve({usage: NaN, quota: NaN});
}