чи реально використовувати локальний сховище HTML5 для зберігання CSS та JavaScript


22

Ідея полягає у використанні локального сховища HTML5 для зберігання часто доступних CSS та JavaScript.

Наприклад (псевдокод):

var load_from_cdn = вірно;
if (виявити локальне сховище)  
{
  if (кеш css, js знайдено)
  {
     завантажити локальний кеш пам'яті
     load_from_cdn = помилково;
  }
}
якщо (load_from_cdn)
{
   document.write ('<script> ...');
}

Це можливо чи реально?

Я знаю кеш браузера, буде ще перевірка доступу до заголовка,
я припускаю, що HTTP-доступ не кращий (на мій погляд )

PS: Здається, що локальне зберігання підтримує лише пару ключів і цінностей , чи може хтось довести це?
(найкраще з кількома прикладами)


1
Вікіпедія, очевидно, намагалася зробити це найкращим ефектом: twitter.com/catrope/status/408018210529615872 twitter.com/catrope/status/408018210529615872/photo/1
Дейв

1
це моя ідея 2 роки тому ... :)
ajreal

Ваше запитання було першим, що я знайшов, коли розглядав це. Тут було багато дискусій щодо того, чи була це гарна ідея чи ні, тому я подумав, що надам деякі анекдотичні докази на користь!
Дейв

1
Ця картина вводить в оману. Якщо прокрутити далі вниз, ви побачите, що величезне падіння насправді не було тому, що локальне зберігання було кращим, ніж кешування, а скоріше помилка в налаштуванні кешування: " Вийшло менш вражаюче :(. Графік - внутрішній трафік, падіння належне" to localStorage приховує помилку кешування "- twitter.com/catrope/status/408110382599782400
Джеймі Баркер

перевірити addyosmani.com/basket.js
xhh

Відповіді:


11

Цілком нормально використовувати локальний сховище для зберігання JS та CSS. Однак локальне зберігання має обмеження 5М на домен. Можливо, вам доведеться переглянути цю стратегію.

Для робочого столу в Інтернеті ви можете використовувати кеш браузера за замовчуванням, щоб зробити це. Просто встановіть відповідь JS & CSS HTTP на кешування. Це просто і легко.

Для мобільної мережі Інтернет затримка висока. Отже, зменшення HTTP-запитів є критичним. Отже, наявність JS та CSS у зовнішніх URL-адресах є оптимальним. Було б набагато краще, щоб JS та CSS були вбудованими. Це зменшує запити HTTP, але роздуває вміст HTML. Тоді що? Як ви вже сказали, використовуйте місцеві сховища!

Коли один веб-переглядач відвідує сайт вперше, JS & CSS будуть введені в дію. JS також має ще два завдання: 1) зберігати JS & CSS у локальне сховище; 2) Встановіть файл cookie, щоб позначити, що JS & CSS знаходяться в локальному сховищі.

Коли браузер вдруге заходить на сайт, сервер отримав файли cookie та знає, що браузер вже має відповідні JS & CSS. Таким чином, HTML-рендер має вбудований JS для зчитування JS & CSS з локального сховища та вставки в дерево DOM.

Це основна ідея створення мобільної версії bing.com. Можливо, вам доведеться врахувати контроль версій JS та CSS під час впровадження у виробництво.

Спасибі


Так, досить близько до того, що я думаю.
айреал

Google розробив модуль для Page Speed ​​Mod, який робить те саме. Ось сторінка, де вони розповідають про товари, товаришів і не знають розробників.google.com
speed/pagespeed/module/…

прихильне, але wtf в цьому випадку означає "вбудований". "inline" має як 5 різних значень.
Олександр Міллс

1
Він фактично збільшився до 10 Мб для робочого столу та 5 Мб для мобільних
Роко С. Бульян

1
Вам не потрібне печиво. ви можете просто прочитати, чи є у локальному сховищі шуканий ключ / значення плюс ви повинні надати версію (для очевидних недійсних цілей). Ця хитрість корисна лише після другого доступу до сайту, а також якщо активи не знаходяться в кеші (чомусь)
vsync


23

У чому справа?

Вже є добре налагоджена методика, яка називається кешування на стороні клієнта. Що приносить локальному сховищу HTML5, у якому випадку кешування бракує?

У вас може бути якась дивна програма, яка повинна динамічно завантажувати шматки коду JavaScript, щоб ви не могли ефективно використовувати кеш, але це надзвичайно рідкісний випадок.

Також пам’ятайте про інше. У веб-переглядачах є спеціальна політика кешування, і більшість браузерів добре керує кешем (видаляючи лише старіший вміст тощо). Реалізуючи домашній кеш, ви перешкоджаєте браузерам правильно керувати ним. Не тільки його можна критикувати самостійно, але це також зашкодить вам рано чи пізно. Приклад: коли користувачі веб-програми повідомляють про помилки, ви часто відповідаєте, просячи їх очистити кеш. Я не впевнений, що ви запитаєте у вашому випадку, оскільки очищення кеша ніколи не вирішить проблеми з вашим веб-додатком.


У відповідь на вашу першу редакцію (друга редакція поза темою):

Я знаю кеш браузера, буде ще перевірка доступу до заголовка

Здається, вам не вистачає розуміння кешування браузера. Ось чому важливо зрозуміти, як це працює спочатку, перш ніж почати впроваджувати власний механізм кешування в домашніх умовах . Винаходьте власне колесо лише тоді, коли ви достатньо зрозумієте існуючі колеса і маєте вагомі причини не користуватися ними. Дивіться пункт 1 моєї відповіді на питання "Повторно винаходити колесо і НЕ шкодувати про це" .

Надаючи деякі дані через HTTP, ви можете вказати кілька заголовків, пов’язаних із кешем:

  • Last-Modified визначає, коли зміст змінено,
  • Expiresвказує, коли браузер повинен запитати сервер, чи змінено вміст .

Ці два заголовки дозволяють веб-переглядачу:

  • Уникайте завантаження вмісту знову і знову. Якщо Last-Modifiedвстановлено останній місяць, а вміст уже було завантажено сьогодні за кілька годин, завантажувати його знову не потрібно.
  • Уникайте запитів щодо дати останнього змінення файлу. Якщо Expiresз об'єкта кешу є 5 травня - й , 2014 року, ви не повинні видавати будь-який запит GET ні в 2011, ні в 2012 або 2013 році, так як ви знаєте , що кеш уточнений.

Другий важливий для CDN. Коли Google обслуговує JQuery відвідувачу Stack Overflow або cdn.sstatic.netподає зображення чи таблиці стилів, використовувані Stack Overflow, вони не хочуть, щоб браузери кожен раз запитували нову версію. Натомість вони подають ці файли один раз, встановлюють термін придатності щось досить довго, і це все.

Ось, наприклад, скріншот того, що відбувається, коли я заходжу на домашню сторінку Stack Overflow:

На скріншоті хронологічної шкали переповнення стека в Chrome відображаються 15 файлів, 3 запитуються, 12 подаються безпосередньо з кеша без запитів на віддалені сервери

Є 15 файлів для обслуговування. Але де всі ці 304 Not Modifiedвідповіді? У вас є лише три запити вмісту, які змінилися. Для всього іншого браузер використовує кешовану версію, не запитуючи жодного сервера .


На закінчення, вам дійсно потрібно подумати двічі, перш ніж реалізувати власний механізм кешування, і особливо знайти хороший сценарій, де це може бути корисним . Як я вже говорив на початку моєї відповіді, я можу знайти тільки один: де ви служите шматки JavaScript , щоб використовувати їх через, OMG, eval(). Але в цьому випадку я впевнений, що є кращі підходи, які є:

  • Більш ефективно, використовуючи стандартні методи кешування, або
  • Простіше в обслуговуванні.

+1 для цього. Це абсолютно безглуздо. Майже у всіх випадках абсолютно. Кешування за допомогою якогось унікального, хеш-клавіша набагато краще.
shabunc

1
Ви не зовсім праві щодо кешу браузера. Швидке оновлення пройде всю перевірку кешу браузера.
айреал

1
Посилання на reinventing the wheel and not regretting itмертве: '(
Есаїлія

4
Кешування Bowser не настільки прямо, як вам здається, і не є послідовними для всіх браузерів. Наприклад, деякі браузери випадково вирішують завантажувати веб-шрифти (незалежно від заголовків - зараз не можна знайти статтю про це, але я думаю, що це виявив Дейв Руперт). Крім того, ETAG змушують браузери перевіряти, чи ресурс оновлено ... а іноді ви не можете видалити ETAG (наприклад, Amazon S3) - тому якщо ваш CSS-файл надсилає заголовок ETAG, він завжди перевірятиметься на оновлення (304s все ще є корисним навантаженням). Для запобігання непотрібних запитів необхідне користувацьке кешування.
Райан Уіл

7

Локальне кешування на стороні клієнта має бути значно оптимізованіше, ніж використання локальної пам’яті HTML5. Просто переконайтеся, що ваш JavaScript і CSS знаходяться у зовнішніх керованих файлах, і ваша сторінка повинна завантажуватися набагато швидше через кеш браузера, ніж намагатися витягнути їх з локального сховища та виконати їх самостійно.

Крім того, веб-переглядач може почати завантажувати зовнішні ресурси, коли сторінка починає завантажуватися, перш ніж ви зможете фактично запустити JavaScript на цій сторінці, щоб потім отримати свої ресурси з локальної пам’яті HTML5.

Крім того, вам потрібен код на сторінці для того, щоб завантажити з локальної пам’яті HTML5, тому просто покладіть всі свої JS в один зовнішній, кешований JS-файл.



2

Ви отримаєте набагато кращу ефективність, використовуючи мережу доставки вмісту (CDN), наприклад , бібліотеку кодів Google . Продумано продумано, більшість ваших JS та CSS повинні бути в кеші кожного відвідувача, перш ніж вони вперше потраплять на ваш сайт. Мінімізуйте решту.

Ви завжди можете орієнтувати кешування веб-переглядача та ручне прокатене рішення HTML5. Але я думаю, що рідне кешування збирається збити штани.


2

Використання localStorage - це швидко (er)! Мій тест показав

  • Завантаження jQuery з CDN: Chrome 268ms , FireFox: 200ms
  • Завантаження jQuery з localStorage: Chrome 47ms , FireFox 14ms

Я думаю, що збереження HTTP-запиту вже приносить велику перевагу швидкості. Тут, здається, всі винні в протилежному, тому, будь ласка, доведіть мене неправильно.

Якщо ви хочете перевірити мої результати, я створив крихітну бібліотеку, яка кешує сценарії в localStorage. Перевірте це на https://github.com/webpgr/cached-webpgr.js або просто скопіюйте його із наведеного нижче прикладу.

Повна бібліотека:

function _cacheScript(c,d,e){var a=new XMLHttpRequest;a.onreadystatechange=function(){4==a.readyState&&(200==a.status?localStorage.setItem(c,JSON.stringify({content:a.responseText,version:d})):console.warn("error loading "+e))};a.open("GET",e,!0);a.send()}function _loadScript(c,d,e,a){var b=document.createElement("script");b.readyState?b.onreadystatechange=function(){if("loaded"==b.readyState||"complete"==b.readyState)b.onreadystatechange=null,_cacheScript(d,e,c),a&&a()}:b.onload=function(){_cacheScript(d,e,c);a&&a()};b.setAttribute("src",c);document.getElementsByTagName("head")[0].appendChild(b)}function _injectScript(c,d,e,a){var b=document.createElement("script");b.type="text/javascript";c=JSON.parse(c);var f=document.createTextNode(c.content);b.appendChild(f);document.getElementsByTagName("head")[0].appendChild(b);c.version!=e&&localStorage.removeItem(d);a&&a()}function requireScript(c,d,e,a){var b=localStorage.getItem(c);null==b?_loadScript(e,c,d,a):_injectScript(b,c,d,a)};

Виклик бібліотеки

requireScript('jquery', '1.11.2', 'http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js', function(){
    requireScript('examplejs', '0.0.3', 'example.js');
});

3
Ваші заходи не мають значення. (1) Якщо користувач новачок на веб-сайті, він у будь-якому разі не має jQuery у локальному сховищі. (2) Якщо, з іншого боку, користувач вже відвідав ваш веб-сайт, він має jQuery в кеші, це означає, що він не буде завантажений з CDN. Це також призводить до третього пункту: (3) локальне сховище належне певному сайту, тоді як jQuery на CDN Google поділяється на багато сайтів, це означає, що користувач, який відвідав, скажімо, переповнення стека, але є новим для вашого сайту, переміг Вам не потрібно буде перезавантажувати jQuery з CDN, якщо ви використовуєте ту саму версію jQuery.
Арсеній Муренко

@MainMa Можливо, цей захід не є гарним, я бачу, що зараз, але для кешу браузера для роботи потрібен запит на сервер, який потім повертає номер 304. Цей запит потребує більше часу, ніж безпосередньо отримання файлу з локального сховища . Виправте мене, якщо я помиляюся.
виберіть

@MainMa, будь ласка, також перегляньте коментарі від programmers.stackexchange.com/a/105526/195684 Є більше проблем із кешем, як порівняння ETAG, що робить таке кешування швидше
виберіть
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.