Django ManifestStaticFilesStorage和javascript文件中的imports



Django 3.2 ManifestStaticFilesStorage为模板内调用的javascript文件添加了一个哈希值,这是预期的工作。然而,有些javascript文件是从其他javascript文件导入的,这些导入的文件名不会被转换为散列值。ManifestStaticFilesStorage文档指出,当它找到import规则和url()语句时,对CSS文件执行此操作,但对如何为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等版本号。然后将静态目录位置附加到settings.py中的STATIC_URL变量:

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)

这种方法强制浏览器重新加载所有静态文件,而不需要检查和更改任何文件的内容。显然,这可能会导致用户在更新静态文件后第一次访问站点时页面加载时间更长,因此它可能不是每个应用程序的最佳方法。

最新更新