Що робить додавання "? V = 1" до URL-адрес CSS та Javascript у посиланнях та тегах сценарію?


138

Я переглядав шаблон шаблону HTML 5 (від http://html5boilerplate.com/ ) і помітив використання "?v=1"в URL-адресах при посиланні на файли CSS та Javascript.

  1. Що робить додавання "?v=1"до URL-адрес CSS та Javascript у тегах посилань та скриптів?
  2. Не всі URL-адреси Javascript мають "?v=1"(наприклад, зразок нижче js/modernizr-1.5.min.js). Чи є причина, чому це так?

Зразок з їх index.html:

<!-- CSS : implied media="all" -->
<link rel="stylesheet" href="css/style.css?v=1">

<!-- For the less-enabled mobile browsers like Opera Mini -->
<link rel="stylesheet" media="handheld" href="css/handheld.css?v=1">

<!-- All JavaScript at the bottom, except for Modernizr which enables HTML5 elements & feature detects -->
<script src="js/modernizr-1.5.min.js"></script>

<!------ Some lines removed ------>

<script src="js/plugins.js?v=1"></script>
<script src="js/script.js?v=1"></script>

<!--[if lt IE 7 ]>
  <script src="js/dd_belatedpng.js?v=1"></script>
<![endif]-->


<!-- yui profiler and profileviewer - remove for production -->
<script src="js/profiling/yahoo-profiling.min.js?v=1"></script>
<script src="js/profiling/config.js?v=1"></script>
<!-- end profiling code -->

Відповіді:


175

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

/Resources/Combined.css?v=x.x.x.buildnumber

Оскільки це змінюється з кожним новим натисканням коду, клієнт змушений захопити нову версію, саме через запит рядка. Подивіться, наприклад, цю сторінку (під час цієї відповіді):

<link ... href="http://sstatic.net/stackoverflow/all.css?v=c298c7f8233d">

Я думаю, що замість ревізійного номера команда SO пішла з файловим хешем, що є ще кращим підходом, навіть з новим випуском браузери змушені схопити нову версію, коли файл насправді зміниться.

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


3
@Free - Заголовок кеш-керування, надісланий вчора, не може повідомити клієнту, що файл змінився сьогодні (клієнт навіть не перевірить), URL-адреса може. Чи можете ви пояснити, чого мені там не вистачає?
Нік Крейвер

8
@Free - спосіб кешування цих файлів назавжди , тобто клієнт жодним чином не перевіряє, чи не змінено файл. Це означає, що вони ніколи не отримають оновлений файл ... якщо тільки не буде змінена URL-адреса, що відбувається з вищезазначеною технікою. Ви отримуєте максимальну тривалість кешу у клієнта (найменше HTTP-запитів), але клієнт миттєво оновлюється, коли файл фактично змінюється . Як саме ви могли б виконати все це, використовуючи лише заголовки кеш-керування?
Нік Крейвер

4
@Free - Переповнення стека отримує 5 мільйонів відвідувачів щомісяця, ваш підхід матиме 2 наслідки: а) ще багато запитів і даних, що надсилаються на / з наших серверів, і б) користувачі не одразу отримують новий JavaScript / CSS (наприклад, коли у нас виникла помилка або зміни в HTML вимагають нового JS / CSS). Природний термін дії дійсно тут не є можливим. Запропонований вами метод був би технічно набагато менш ефективним, а результат - це фактичні помилки користувачів на регулярній основі ... що насправді не прийнятно на будь-якому головному сайті (а також не має бути жодного веб-сайту насправді).
Нік Крейвер

2
@Free - 5 мільйонів - це 5 мільйонів відвідувачів на місяць , оскільки ми розміщуємо багато разів на день , запити - це багато разів. Щодо завантаження HTML-сторінок, ми говоримо трохи більше 110 мільйонів на місяць (і зростаюче ... знову це лише завантаження HTML-сторінок). Для а) так, ще багато чи більше перерв - це компроміс в будь-якому випадку в часі кешу порівняно з клієнтами, які мають правильний вміст. Крім того, ваша логіка для b) є помилкою, HTML не кешується, тому використовується з кешованим JS, який більше не працює, означає, що на них керуються лише кешовані користувачі, а не імунітет.
Нік Крейвер

5
@GMsoF v просто представляє для нас "версію", це абсолютно довільний вибір. Будь-який рядок запиту значень спрацював би, наприклад, це так само легко може бути? Jejdutogjesudo =
Nick Craver

23

Це гарантує отримання останньої версії файлу css або js від сервера.

А пізніше ви можете додати, "?v=2"якщо у вас є новіша версія "?v=3", "?v=4"тощо.

Зауважте, що ви можете використовувати будь-яке querystring, "v" не є обов'язковим, наприклад:

"?blah=1"також буде працювати.

І

"?xyz=1002" буду працювати.

І це звичайна техніка, оскільки браузери тепер кешують файли js та css краще та довше.


13

Хеш-рішення є приємним, але насправді не читабельним, коли ви хочете знати, яка версія файлу сидить у вашій локальній папці. Рішення полягає в date/timeпечатці вашої версії, щоб ви могли легко порівняти її з файлом вашого сервера.

Наприклад, якщо ваш .js or .cssфайл датований 2011-02-08 15:55:30(остання модифікація), версія повинна дорівнювати.js?v=20110208155530

Слід легко читати властивості будь-якого файлу будь-якою мовою. В ASP.Net це дуже просто ...

".js?v=" + File.GetLastWriteTime(HttpContext.Current.Request.PhysicalApplicationPath + filename).ToString("yyMMddHHHmmss");

Зі свого боку, це чудово переробляється на властивості / функції спочатку та поза ним. Більше немає виправдань.

Удачі, ст.


2
Що робити, якщо ви будуєте свій веб-сайт лише за допомогою html js та css. Тоді як ми можемо автоматично вводити ім’я версії до статичних ресурсів?
Нішант Наїр

@ Whizkid747 запізніла відповідь, але для новачків, незалежно від того, яка програма для створення веб-сайтів / система побудови ви використовуєте, повинна мати спосіб отримати дату в мілісекундах, яку ви можете використовувати як версію, інакше якщо ви не використовуєте програму // вам доведеться писати ці самі.
AntK

7

Файли Javascript часто кешуються браузером набагато довше, ніж ви могли очікувати.

Це часто може призвести до несподіваної поведінки, коли ви випускаєте нову версію файлу JS.

Тому прийнято додавати параметр QueryString до URL-адреси для файлу javascript. Таким чином, браузер кешує файл Javascript з v = 1. Коли ви випустите нову версію файлу javascript, ви зміните URL-адресу на v = 2, і браузер буде змушений завантажити нову копію.


які саме браузери? навіть більш химерні IE 5 та 6 підкорялися заголовкам кеш-керування.
Безкоштовні консультації

7

Аби відповісти на запитання;

"? v = 1" це записується лише тому, що завантажується свіжа копія файлів css та js замість використання з кешу браузера.

Якщо ви згадуєте цей параметр рядка запиту в кінці таблиці стилів або js-файлу, він змушує браузер завантажити новий файл, завдяки якому останні зміни в .css і .js файли роблять ефективними у вашому браузері.

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

Ось стаття, яка пояснює цю річ Як і навіщо робити версії файлів CSS та JS


2

Під час розробки / тестування нових випусків кеш може бути проблемою, оскільки браузер, сервер і навіть іноді 3G telco (якщо ви робите мобільне розгортання) кешуватимуть статичний вміст (наприклад, JS, CSS, HTML, img). Ви можете подолати це, додавши до версії номер версії, випадкове число або часову позначку, наприклад: JSP:<script src="js/excel.js?time=<%=new java.util.Date()%>"></script>

Якщо ви використовуєте чистий HTML (замість серверних сторінок JSP, ASP, PHP), сервер вам не допоможе. У браузері посилання завантажуються до запуску JS, тому вам потрібно видалити посилання та завантажити їх у JS.

// front end cache bust
var cacheBust = ['js/StrUtil.js', 'js/protos.common.js', 'js/conf.js', 'bootstrap_ECP/js/init.js'];   
for (i=0; i < cacheBust.length; i++){
     var el = document.createElement('script');
     el.src = cacheBust[i]+"?v=" + Math.random();
     document.getElementsByTagName('head')[0].appendChild(el);
}

0

Як ви можете прочитати раніше, ?v=1гарантує, що ваш браузер отримає версію файлу 1. Коли у вас є нова версія, вам просто потрібно додати інший номер версії, і браузер забуде про стару версію і завантажить нову.

Існує плагін gulp, який піклується про версію файлів під час фази збирання, тому вам не доведеться робити це вручну. Це зручно, і ви можете легко інтегрувати його в процесі збирання. Ось посилання: gulp-annotate


-2

Як згадували інші, це використовується для перетворення кешу переднього кінця. Для цього я особисто вважаю корисним пакет npm grunt-cache-bust npm.


1
Хоча це посилання може відповісти на запитання, лише відповіді на посилання відхиляються у програмі переповнення стека, ви можете покращити цю відповідь, взявши важливі частини посилання та ввівши її у свою відповідь. Це гарантує, що ваша відповідь все ще є відповіддю, якщо посилання буде змінено або видалено :)
WhatsThePoint
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.