<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Хранение в браузере on JSFlow</title><link>https://jsflow.ru/docs/storage/</link><description>Recent content in Хранение в браузере on JSFlow</description><generator>Hugo</generator><language>ru</language><atom:link href="https://jsflow.ru/docs/storage/index.xml" rel="self" type="application/rss+xml"/><item><title>localStorage и sessionStorage</title><link>https://jsflow.ru/docs/storage/web-storage/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://jsflow.ru/docs/storage/web-storage/</guid><description>&lt;h1 id="localstorage-и-sessionstorage"&gt;
 localStorage и sessionStorage
 &lt;a class="anchor" href="#localstorage-%d0%b8-sessionstorage"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Web Storage&lt;/strong&gt; — два связанных хранилища в браузере: &lt;code&gt;localStorage&lt;/code&gt; (данные живут, пока их не удалят) и &lt;code&gt;sessionStorage&lt;/code&gt; (данные привязаны к вкладке и сессии). Оба хранят только &lt;strong&gt;строки&lt;/strong&gt;; объекты нужно сериализовать.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="базовые-операции"&gt;
 Базовые операции
 &lt;a class="anchor" href="#%d0%b1%d0%b0%d0%b7%d0%be%d0%b2%d1%8b%d0%b5-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b8"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;API одинаков для обоих объектов:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;localStorage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setItem&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;theme&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;dark&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;localStorage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getItem&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;theme&amp;#39;&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// &amp;#34;dark&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;localStorage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;removeItem&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;theme&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;localStorage&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;clear&lt;/span&gt;() &lt;span style="color:#75715e"&gt;// осторожно: удаляет всё для origin
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ключи уникальны в пределах origin. Значение &lt;code&gt;'undefined'&lt;/code&gt; и отсутствие ключа — разные вещи: &lt;code&gt;getItem&lt;/code&gt; вернёт &lt;code&gt;null&lt;/code&gt;, если ключа нет.&lt;/p&gt;</description></item><item><title>Куки обзор</title><link>https://jsflow.ru/docs/storage/cookies/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://jsflow.ru/docs/storage/cookies/</guid><description>&lt;h1 id="куки-обзор"&gt;
 Куки обзор
 &lt;a class="anchor" href="#%d0%ba%d1%83%d0%ba%d0%b8-%d0%be%d0%b1%d0%b7%d0%be%d1%80"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Cookie (куки)&lt;/strong&gt; — небольшие пары «имя=значение», которые браузер прикрепляет к запросам на тот же сайт. Сервер выставляет их заголовком &lt;code&gt;Set-Cookie&lt;/code&gt;; JavaScript может читать и записывать часть кук через &lt;code&gt;document.cookie&lt;/code&gt;, но с важными ограничениями.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="как-выглядит-cookie"&gt;
 Как выглядит cookie
 &lt;a class="anchor" href="#%d0%ba%d0%b0%d0%ba-%d0%b2%d1%8b%d0%b3%d0%bb%d1%8f%d0%b4%d0%b8%d1%82-cookie"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Сервер отвечает, например:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Set-Cookie: sessionId=abc123; Path=/; HttpOnly; Secure; SameSite=Lax
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Браузер сохраняет cookie и отправляет её обратно:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Cookie: sessionId=abc123
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Так поддерживают &lt;strong&gt;сессии входа&lt;/strong&gt;, корзины на сервере, A/B-тесты и аналитику — в зависимости от настроек.&lt;/p&gt;</description></item><item><title>IndexedDB</title><link>https://jsflow.ru/docs/storage/indexeddb/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://jsflow.ru/docs/storage/indexeddb/</guid><description>&lt;h1 id="indexeddb"&gt;
 IndexedDB
 &lt;a class="anchor" href="#indexeddb"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;IndexedDB&lt;/strong&gt; — встроенная в браузер &lt;strong&gt;объектная база данных&lt;/strong&gt; для структурированных записей, файлов и больших массивов. В отличие от &lt;a href="https://jsflow.ru/docs/storage/web-storage/"&gt;localStorage&lt;/a&gt;, API &lt;strong&gt;асинхронный&lt;/strong&gt;, лимиты выше, а данные индексируются по ключам. Подходит для офлайн-черновиков, кэша плейлистов и очереди синхронизации — когда Web Storage уже тесен.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="открытие-базы"&gt;
 Открытие базы
 &lt;a class="anchor" href="#%d0%be%d1%82%d0%ba%d1%80%d1%8b%d1%82%d0%b8%d0%b5-%d0%b1%d0%b0%d0%b7%d1%8b"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Работа идёт через &lt;code&gt;indexedDB.open&lt;/code&gt;. Имя и версия задают схему; при повышении версии срабатывает &lt;code&gt;upgradeneeded&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;request&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;indexedDB&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;open&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;jsflow-app&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;request&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;onupgradeneeded&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;db&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;target&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;db&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;objectStoreNames&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;contains&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;tracks&amp;#39;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;db&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;createObjectStore&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;tracks&amp;#39;&lt;/span&gt;, { &lt;span style="color:#a6e22e"&gt;keyPath&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;id&amp;#39;&lt;/span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;request&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;onsuccess&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;db&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;target&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;База готова&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;db&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;db&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;version&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;request&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;onerror&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;error&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Не удалось открыть IndexedDB&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;В &lt;code&gt;upgradeneeded&lt;/code&gt; создают &lt;strong&gt;object store&lt;/strong&gt; (аналог таблицы) и &lt;strong&gt;индексы&lt;/strong&gt;. Вне этой фазы схему менять нельзя — только bump версии.&lt;/p&gt;</description></item></channel></rss>