사용 가능한 저장공간 예측

요약 정리

앞으로 더 많은 브라우저가 출시될 예정이므로 이제 Chrome 61에서 웹 앱에서 사용 중인 스토리지와 사용 가능한 스토리지:

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

최신 웹 앱 및 데이터 저장소

최신 웹 애플리케이션의 스토리지 요구사항을 생각해보면 저장되는 내용을 두 가지 범주, 즉 로드하는 데 필요한 핵심 데이터 의미 있는 사용자 상호작용에 필요한 데이터가 애플리케이션 로드 시점입니다.

웹 앱을 로드하는 데 필요한 첫 번째 데이터 유형은 HTML JavaScript, CSS, 일부 이미지 등입니다. 서비스 워커Cache Storage API를 사용하면 핵심 리소스를 저장하고 나중에 웹 앱을 빠르게 로드할 수 있으며, 이상적으로는 네트워크를 완전히 우회하는 것이 이상적입니다. (웹 앱의 빌드 프로세스와 통합되는 도구, Workbox 라이브러리 또는 이전 버전 sw-precache님, 이러한 유형의 데이터를 저장하고 업데이트하며 사용하는 프로세스를 data.)

하지만 다른 유형의 데이터는 어떨까요? 이러한 리소스는 분석을 관리하는 데 전체 사용자에게 중요한 역할을 할 수 있는 경험해 볼 수 있습니다 예를 들어 이미지 편집 웹 앱을 작성 중인 경우 한 개 이상의 로컬 사본을 저장할 수 있습니다. 작업을 실행취소할 수 있습니다. 또는 오프라인 미디어를 개발하는 경우 오디오나 동영상 파일을 로컬에 저장하는 것이 기능을 사용할 수 있습니다. 맞춤설정할 수 있는 모든 웹 앱은 상태 정보의 일종입니다. 이러한 유형의 런타임 스토리지에 사용 가능한 공간이 얼마나 있는지 어떻게 알 수 있을까요? 저장공간이 부족하면 어떻게 되나요?

과거: window.webkitStorageInfonavigator.webkitTemporaryStorage

브라우저는 지금까지 접두사 매우 오래되고 지원 중단된 인터페이스 등 window.webkitStorageInfo님, 낡은 것은 아니지만 여전히 비표준 navigator.webkitTemporaryStorage 이러한 인터페이스는 유용한 정보를 제공하지만 웹 표준으로 자리매김할 것입니다.

WhatWG 스토리지 표준은 입력합니다.

미래: navigator.storage

Storage Living 표준 관련 지속적인 작업의 일환으로 몇 가지 유용한 API가 그것을 StorageManager 이 인터페이스는 브라우저에 navigator.storage 다른 여러 최신 웹 API와 마찬가지로 navigator.storage안전한 환경에서만 사용할 수 있습니다. (HTTPS 또는 localhost를 통해 제공됨) 출처에서 가져옵니다.

작년에 Google에서는 navigator.storage.persist() 메서드를 사용하여 웹 애플리케이션에서 자체 스토리지를 사용하도록 자동 정리에서 제외됩니다

이제 navigator.storage.estimate() 메서드로 조인됩니다. 이 메서드는 navigator.webkitTemporaryStorage.queryUsageAndQuota()의 최신 교체품입니다. estimate()는 비슷한 정보를 반환하지만 프라미스 기반 인터페이스로 이는 다른 최신 비동기 API와 유사합니다. Google Cloud가 이끄는 estimate()는 두 속성 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;
  }
}

추정치는 얼마나 정확한가요?

함수에서 얻은 데이터가 단지 출처가 사용 중인 공간의 추정치입니다. 바로 함수 이름! usagequota 값 모두 안정적일 수 없으므로 다음 사항을 고려하는 것이 좋습니다.

  • usage는 지정된 출처에서 실제로 사용하는 바이트 수를 나타냅니다. 동일 출처 내부 압축 기법의 영향을 받을 수 있으므로 사용되지 않은 공간이 포함될 수 있는 고정 크기 할당 블록과 "Tombstone" 기록 임시로 생성될 수 있는 임시 캠페인도 있습니다 누출을 방지하기 위해 교차 출처(cross-origin) 및 불투명 리소스 로컬에 저장되면 전체 usage에 추가 패딩 바이트가 기여할 수 있습니다. 값으로 사용됩니다.
  • quota는 현재 출처에 예약된 공간의 양을 반영합니다. 이 전체 저장용량 크기와 같은 몇 가지 상수 요인에 따라 달라질 수 있지만 저장공간의 양 등 잠재적인 휘발성 요인 수 현재 사용되지 않는 것입니다 따라서 기기의 다른 애플리케이션이 데이터, 브라우저가 웹에 할애하고자 하는 공간의 양 앱의 출처가 변경될 수 있습니다

현재: 특성 감지 및 대체

Chrome 61부터 estimate()가 기본적으로 사용 설정됩니다. Firefox는 navigator.storage(으)로 실험하고 있지만 2017년 8월 현재 사용되지 않습니다. 기본적으로 사용 설정되어 있습니다. 해야 할 일 dom.storageManager.enabled 환경설정 사용 설정 테스트할 수 있습니다.

일부 브라우저에서만 지원되는 기능으로 작업할 때는 특성 감지는 필수입니다 특성 감지와 특성 감지를 결합하여 이전 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});
}