javascript 文件中的 Django ManifestStaticFilesStorage 和导入

Posted

技术标签:

【中文标题】javascript 文件中的 Django ManifestStaticFilesStorage 和导入【英文标题】:Django ManifestStaticFilesStorage and imports within javascript files 【发布时间】:2021-10-31 03:50:25 【问题描述】:

Django 3.2 ManifestStaticFilesStorage 将哈希值添加到从模板中调用的 javascript 文件中,这按预期工作。但是,某些 javascript 文件从其他 javascript 文件导入,并且这些导入的文件名不会转换为散列值。 ManifestStaticFilesStorage 文档表明,当它找到导入规则和 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';

【问题讨论】:

【参考方案1】:

我使用稍微不同的方法解决了这个问题。我没有使用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)

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

【讨论】:

以上是关于javascript 文件中的 Django ManifestStaticFilesStorage 和导入的主要内容,如果未能解决你的问题,请参考以下文章

将 Django 模板中的 JSON 传递给独立的 Javascript 文件

html 将以编程方式附加外部脚本文件的javascript代码片段,并按顺序排列。用于响应式网站,其中ma

如何在 django 的 ModelForms 中的标签后添加空格

有必要在 Django 中启动应用程序来加载 javaScript 文件吗?

Django - 如何将 javascript 变量从另一个文件加载到模板

将大型 json 字符串从 Javascript 发布到 Django