Почему так много сценариев Javascript добавляют случайные числа к вещам? Столкновение? - PullRequest
4 голосов
/ 16 ноября 2009

Недавно я изучал JavaScript и видел несколько примеров (Facebook.com, букмарклет Readability), в которых для добавления ссылок используется Math.rand ().

Какую проблему это решает? Пример параметра из букмаркета Readability:

_readability_script.src='http://lab.arc90.com/....script.js?x='+(Math.random());

Есть ли в JavaScript коллизии или что-то такое, что это решает?

Ответы [ 6 ]

15 голосов
/ 16 ноября 2009

Как говорит Рубенс, обычно это трюк, используемый для предотвращения кеширования. Браузеры обычно очень агрессивно кэшируют JavaScript и CSS, что может сэкономить вам пропускную способность, но также может вызвать проблемы с развертыванием при изменении ваших скриптов.

Идея состоит в том, что браузеры будут считать ресурс, расположенный в http://www.example.com/something.js?foo, отличным от http://www.example.com/something.js?bar, и поэтому не будут использовать свой локальный кеш для извлечения ресурса.

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

Лично я предпочитаю добавлять время последнего изменения файла как метку времени Unix, поэтому мне не нужно искать и менять номера версий всякий раз, когда я изменяю файл.

4 голосов
/ 16 ноября 2009

Главное, чтобы браузер не кэшировал эти ресурсы.

1 голос
/ 16 ноября 2009

Это потому, что Internet Explorer любит кэшировать все, включая запросы, отправленные с помощью кода JavaScript.

Еще один способ сделать это без случайных чисел в URL-адресе - добавить заголовки Cache-Control в каталоги с элементами, которые вы не хотите кэшировать:

# .htaccess
Header set Cache-Control "no-cache"
Header set Pragma "no-cache"

Большинство браузеров уважают Cache-Control, но IE (включая 7, не тестировал 8) только признает заголовок Pragma.

1 голос
/ 16 ноября 2009

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

0 голосов
/ 18 ноября 2009

Существует инструмент под названием squid, который может кэшировать веб-страницы. Использование случайного числа гарантирует, что запрос не будет обработан таким промежуточным звеном. Даже с установленным в заголовке Cache-Control заголовком «no-cache» вам все равно может понадобиться добавить случайное число, чтобы пройти через что-то вроде «squid».

0 голосов
/ 16 ноября 2009

В зависимости от того, как браузер выбирает интерпретацию подсказок кэширования ресурса, вы можете не получить желаемого эффекта, если просто попросите браузер изменить URL-адрес на ранее использованный URL-адрес. (большинство кнопок с изображением при наведении курсора мыши полагаются на тот факт, что браузер будет повторно использовать кэшированный ресурс для скорости)

Когда вы хотите убедиться, что браузер получает свежую копию ресурса (например, изображение динамического биржевого тикера и т. П.), Вы заставляете браузер всегда думать, что контент обновляется, добавляя либо дату / время, либо каждый -инкрементное или случайное gargabe).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...