Django ManifestStaticFilesStorage и импорты в файлах javascript

В Django 3.2 ManifestStaticFilesStorage добавляет хэш-значение к javascript файлам, вызываемым из шаблона, и это работает как ожидалось. Однако некоторые файлы javascript импортируются из других файлов javascript, и имена этих импортированных файлов не переводятся в хэш-значение. В документации ManifestStaticFilesStorage указано, что это делается для CSS файлов, когда он находит правило импорта и оператор url(), но ничего не говорится о том, как это сделать для javascript. Есть предложения, как заставить это работать?

В качестве примера можно привести эту строку в html-шаблоне:

<script src="{% static 'myapp/js/myjavascript.js' %}" type="module"></script>

в браузере отображается следующим образом (работает как ожидалось):

<script src="/static/myapp/js/myjavascript.12345abc.js" type="module"></script>

Но в файле myjavascript.js эта строка остается нетронутой, что означает, что браузер все еще может иметь кэшированную версию импортированного файла javascript и использовать ее вместо обновленной версии.

import {func1, func2, func3} from './javascript_helper_lib.js';

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

Перед развертыванием кода я создаю файл под названием /path/to/static_dir_location. Содержимое этого файла - это путь к реальному каталогу статических файлов, например, имя приложения и номер выпуска, как myapp_12345. Расположение статического каталога затем добавляется к переменной STATIC_URL в settings.py:

STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'

with open('/path/to/static_dir_location','r') as file:
    staticdir = file.read().replace('\n', '')

STATIC_URL                  = '/static/{}/'.format(staticdir)

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

Вернуться на верх