За последние 24 часа нас посетили 17276 программистов и 1679 роботов. Сейчас ищут 1733 программиста ...

Версии assets

Тема в разделе "JavaScript и AJAX", создана пользователем Danil005, 2 ноя 2017.

  1. Danil005

    Danil005 Активный пользователь

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Впрочем у меня есть файл client.js. И при каждом изменение, нужна прописывать версию:
    client.js?v0.00001, как сделать, чтобы так часто не изменить её. Вся проблема в том, что файл состоит из 35 строк...
     
  2. rewuxiin

    rewuxiin Активный пользователь

    С нами с:
    17 апр 2012
    Сообщения:
    611
    Симпатии:
    87
    Обновляй страницу ctrl+F5, однако пользователи не сделавшие очистку кеша - не получат свежую версию скрипта.
     
    Danil005 нравится это.
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.330
    Адрес:
    Лень
    надо браузеру дать правило, что это не один и тот же файл, атрибутом в гет параметре.

    src="....client.js?<?= $_SERVER['REQUEST_TIME'] ?>" ..... >
    --- Добавлено ---
    Или лучше хеш файла, который учитывает изменение файла, размер и прочее ( не знаю точно, тестов нет )
     
    rewuxiin нравится это.
  4. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Тогда ты лишишь себя механизма кэширования.

    Тут два основных варианта:
    1. Если файл действительно меняется постоянно, то при запросе к нему с клиента можно прописывать get-параметр с текущем временем или даже со случайным числом. Браузер будет грузить его каждый раз как новый.
    2. Если нужно именно версионирование, то можно подставлять в качестве параметра время последнего изменения файла. Это дешевле чем хэш.

    А полагаться на ctrl-f5 можно только если сайт не ушел в продакшн, т.к. пользователь сайта не будет так делать и в результате у него все может сломаться.
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.330
    Адрес:
    Лень
    я знаю, поэтому второй вариант озвучил
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Я пришел к тому, чтобы для ассетов указывать версию деплоя. То есть она одна на все ассеты, а не индивидуальная. Версия меняется в процессе обновления скриптов на сервере. Т.е. при "деплое"

    Этой версией может быть git hash если деплой делается через git или метка времени деплоя. В процессе деплоя номер версии обновляется в .env и таким образом становится доступен в PHP скриптах. Поддержка .env изначально есть в Laravel, в самописных скриптах можно подключить пакет dotenv через composer.

    Часть баш-скрипта деплоя:
    Код (Text):
    1.   VER=`date --utc +%Y%m%d-%H%M%S`
    2.   sed -i "/^VERSION=/s/=.*/=${VER}/" .env
    а можно так: VER=`git log --pretty=format:'%h' -n 1`
    --- Добавлено ---

    В шаблоне вывода
    PHP:
    1. <link rel="stylesheet" href="/css/styles.min.css?v={{ $VERSION }}">

    Во View Composer или какой-нибудь иной обвязке с "глобальными" переменными шаблонов, делаем переменную доступной во всех шаблонах:
    PHP:
    1. [
    2. //...
    3.   'VERSION' => env('VERSION', time()),
    4. //...
    5. ]
    Таким образом, если вдруг параметр VERSION не задан (например на локалке скрипт деплоя не запускается), то ассеты получаются как бы всегда просроченные. Для девелоперской версии это нормально. Ненормально заставлять себя и других нажимать Ctrl+F5 после каждого обновления.
     
    #6 artoodetoo, 3 ноя 2017
    Последнее редактирование: 30 ноя 2017
    mahmuzar, Danil005, romach и ещё 1-му нравится это.