为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
RISEBY 2021-12-06 16:37:58
我正在寻找有关实现在 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/#manifeststaticfilesstorageStaticFilesStorage 存储后端的子类,它通过将文件内容的 MD5 哈希附加到文件名来存储它处理的文件名。例如,文件 css/styles.css 也将保存为 css/styles.55e7cbb9ba48.css。此存储的目的是继续提供旧文件,以防某些页面仍然引用这些文件,例如因为它们被您或第 3 方代理服务器缓存。此外,如果您想将远期的 Expires 标头应用于已部署的文件以加快后续页面访问的加载时间,这将非常有用。现在我想知道如何最好地在 Go 中实现这一点?我打算从内置文件服务器提供文件。我目前的想法是:有一个循环来检查目录中的最新样式表文件。听起来很慢。对通用命名的文件进行某种重定向/重写(如 file.css 是根据对 file-hash.css 的请求提供的)。让 Go 自己管理资产命名,附加哈希或时间戳。也许它用 nginx 或其他东西处理得更好?
查看完整描述

2 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

编写一个模板函数来解析名称。这是一个示例模板函数:


func resolveName(p string) (string, error) {

  i := strings.LastIndex(p, ".")

  if i < 0 {

    i = len(p)

  }

  g := p[:i] + "-*" + p[i:]

  matches, err := filepath.Glob(g)

  if err != nil {

    return "", err

  }

  if len(matches) != 1 {

    return "", fmt.Errorf("%d matches for %s", len(matches), p)

  }

  return matches[0], nil

}

以下是注册为函数“resolveName”时如何在模板中使用它:


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

playground example


每次渲染模板时,此函数都会解析文件的名称。更聪明的函数可能会在解析名称时缓存名称,或者在启动时遍历目录树以预构建缓存。


查看完整回答
反对 回复 2021-12-06
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

我知道它太旧了,但也许这个图书馆会帮助你。它允许收集和散列静态文件。它还具有将文件路径从原始位置反转到散列位置的功能:


staticFilesPrefix := "/static/"

staticFilesRoot := "output/dir"


storage := NewStorage(staticFilesRoot)

err := storage.LoadManifest()


funcs := template.FuncMap{

    "static": func(relPath string) string {

        return staticFilesPrefix + storage.Resolve(relPath)

    },

}

tmpl := template.Must(

    template.New("").Funcs(funcs).ParseFiles("templates/main.tpl")

)

现在您可以像这样在模板中调用静态函数{{static "css/style.css"}}。调用将转换为/static/css/style.d41d8cd98f00b204e9800998ecf8427e.css.


查看完整回答
反对 回复 2021-12-06
  • 2 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信