Определить, поддерживает ли браузер localStorage

На прошлой неделе я был прерван предупреждающим сообщением об ошибке производства, когда я сосредоточился на кодировании. Пришлось прекратить работу и выяснить, что случилось.

Ошибка

мы не можем знать, какой код не работает, из расположения кода для производственных файлов javascript все скомпилированы и исправлены.

При поиске проблемы мы можем обнаружить, что браузер не поддерживает localStorage. Самое простое решение — отловить ошибку при использовании localStorage:

try {
  const data = localStroage.getItem(key)
} catch(e) {
  // if localStorage not support, fallback
}

Но этот способ усложнит наш код, если будет много фрагментов кода localStorage.

Лучшим способом будет предоставить служебный файл для выполнения:

export const storage = {
  getItem(key, fallbackValue) {
    try {
      return localStorage.getItem(key);
    } catch(e) {
      return fallbackValue;
    }
  },
  setItem(key, value) {
    try {
      localStorage.setItem(key, value);
    } catch(e) {
      // 
    }
  }
  removeItem(key, value) {
    try {
      localStorage.removeItem(key, value);
    } catch(e) {
      // 
    }
  }
}

В нашем коде мы можем импортировать утилиту и использовать storage.getItem для доступа к данным localStorage. Но этот способ также может продолжать оптимизироваться, так как данные будут потеряны в том же контексте страницы.

Если localStorage не поддерживается, мы можем использовать память. Окончательный способ будет таким:

function isSupportLS() {
  try {
    localStorage.setItem('_ranger-test-key', 'hi')
    localStorage.getItem('_ranger-test-key')
    localStorage.removeItem('_ranger-test-key')
    return true
  } catch (e) {
    return false
  }
}

class Memory {
  constructor() {
    this.cache = {}
  }
  setItem(cacheKey, data) {
    this.cache[cacheKey] = data
  }
  getItem(cacheKey) {
    return this.cache[cacheKey]
  }
  removeItem(cacheKey) {
    this.cache[cacheKey] = undefined
  }
}
// if not support localStorage, fallback to memory
export const storage = isSupportLS() ? window.localStorage : new Memory();

мы можем отключить localStorage, заблокировав все файлы cookie, посетите chrome://settings/cookies:

А затем протестируйте этот код в консоли Chrome, он работает хорошо:

Надеюсь, что эта статья поможет вам, и с нетерпением жду возможности следовать за мной, чтобы узнать больше о навыках.

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord . Заинтересованы в хакинге роста? Ознакомьтесь с разделом Схема.