猿问

Go HTML 模板中的自动资产修订文件名

我正在寻找有关实现在 Go HTML 模板中自动包含版本化文件名的帮助。例如,在我的模板中,我的头中有这样的东西:

<link rel="stylesheet" href="{{ .MyCssFile }}" />

样式表本身有一大块 MD5 哈希附加到来自名为 gulp-rev 的 gulp 脚本的名称

stylesheet-d861367de2.css

目的是确保浏览器获取新的更改,但也允许缓存。以下是 Django 中的示例实现,以获得更好的解释:

https://docs.djangoproject.com/en/1.9/ref/contrib/staticfiles/#manifeststaticfilesstorage

StaticFilesStorage 存储后端的子类,它通过将文件内容的 MD5 哈希附加到文件名来存储它处理的文件名。例如,文件 css/styles.css 也将保存为 css/styles.55e7cbb9ba48.css。

此存储的目的是继续提供旧文件,以防某些页面仍然引用这些文件,例如因为它们被您或第 3 方代理服务器缓存。此外,如果您想将远期的 Expires 标头应用于已部署的文件以加快后续页面访问的加载时间,这将非常有用。

现在我想知道如何最好地在 Go 中实现这一点?我打算从内置文件服务器提供文件

我目前的想法是:

  • 有一个循环来检查目录中的最新样式表文件。听起来很慢。

  • 对通用命名的文件进行某种重定向/重写(如 file.css 是根据对 file-hash.css 的请求提供的)。

  • 让 Go 自己管理资产命名,附加哈希或时间戳。

  • 也许它用 nginx 或其他东西处理得更好?


RISEBY
浏览 148回答 2
2回答

慕运维8079593

编写一个模板函数来解析名称。这是一个示例模板函数:func resolveName(p string) (string, error) {&nbsp; i := strings.LastIndex(p, ".")&nbsp; if i < 0 {&nbsp; &nbsp; i = len(p)&nbsp; }&nbsp; g := p[:i] + "-*" + p[i:]&nbsp; matches, err := filepath.Glob(g)&nbsp; if err != nil {&nbsp; &nbsp; return "", err&nbsp; }&nbsp; if len(matches) != 1 {&nbsp; &nbsp; return "", fmt.Errorf("%d matches for %s", len(matches), p)&nbsp; }&nbsp; return matches[0], nil}以下是注册为函数“resolveName”时如何在模板中使用它:<link rel="stylesheet" href="{{ .MyCssFile | resolveName }}" />playground example每次渲染模板时,此函数都会解析文件的名称。更聪明的函数可能会在解析名称时缓存名称,或者在启动时遍历目录树以预构建缓存。

慕丝7291255

我知道它太旧了,但也许这个图书馆会帮助你。它允许收集和散列静态文件。它还具有将文件路径从原始位置反转到散列位置的功能:staticFilesPrefix := "/static/"staticFilesRoot := "output/dir"storage := NewStorage(staticFilesRoot)err := storage.LoadManifest()funcs := template.FuncMap{&nbsp; &nbsp; "static": func(relPath string) string {&nbsp; &nbsp; &nbsp; &nbsp; return staticFilesPrefix + storage.Resolve(relPath)&nbsp; &nbsp; },}tmpl := template.Must(&nbsp; &nbsp; template.New("").Funcs(funcs).ParseFiles("templates/main.tpl"))现在您可以像这样在模板中调用静态函数{{static "css/style.css"}}。调用将转换为/static/css/style.d41d8cd98f00b204e9800998ecf8427e.css.
随时随地看视频慕课网APP

相关分类

Go
我要回答