Templates Go HTML模板中的自动资产修订文件名
我正在寻求帮助,以实现在Go HTML模板中自动包含版本化文件名的功能。例如,在我的模板中,我的头部有如下内容:Templates Go HTML模板中的自动资产修订文件名,templates,go,assets,Templates,Go,Assets,我正在寻求帮助,以实现在Go HTML模板中自动包含版本化文件名的功能。例如,在我的模板中,我的头部有如下内容: <link rel="stylesheet" href="{{ .MyCssFile }}" /> 这样做的目的是确保浏览器能够接收到新的更改,但也允许缓存。以下是Django中的一个示例实现,以便更好地解释: StaticFilesStorage后端的一个子类,通过将文件内容的MD5哈希附加到文件名来存储它处理的文件名。例如,
<link rel="stylesheet" href="{{ .MyCssFile }}" />
这样做的目的是确保浏览器能够接收到新的更改,但也允许缓存。以下是Django中的一个示例实现,以便更好地解释:
StaticFilesStorage后端的一个子类,通过将文件内容的MD5哈希附加到文件名来存储它处理的文件名。例如,文件css/styles.css也将另存为css/styles.55e7cbb9ba48.css
此存储的目的是继续为旧文件提供服务,以防某些页面仍然引用这些文件,例如,因为它们是由您或第三方代理服务器缓存的。此外,如果您希望将far future Expires头应用于部署的文件,以加快后续页面访问的加载时间,这将非常有用
现在我想知道如何在围棋中做到最好?我打算提供来自内置服务器的文件
我目前的想法是:
- 有一个循环,用于检查目录中的最新样式表文件。听起来很慢
- 对一个通用命名的文件进行某种重定向/重写(比如file.css是在请求文件hash.css时提供的)
- 让我们管理资产命名本身,添加哈希或时间戳
- 也许使用nginx或其他更好
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
}
func解析名称(p字符串)(字符串,错误){
i:=strings.LastIndex(p,“.”)
如果i<0{
i=len(p)
}
g:=p[:i]+“-*”+p[i:]
匹配项,错误:=filepath.Glob(g)
如果错误!=零{
返回“”,错误
}
如果len(匹配)!=1{
返回“”,fmt.Errorf(“%s”的%d个匹配项),len(匹配项),p)
}
返回匹配项[0],无
}
以下是注册为函数“resolveName”时如何在模板中使用它:
此函数用于在每次呈现模板时解析文件名。一个更聪明的函数可能会在解析名称时对其进行缓存,或者在启动时遍历目录树以预构建缓存。我知道它太旧了,但可能会对您有所帮助。它允许收集和散列静态文件。它还具有将文件路径从原始位置反转到散列位置的功能:
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
在Go中,您可以在应用程序启动时遍历资产目录,并将哈希文件名输出到(例如)/public/dist
,同时生成原始文件名(键)和哈希文件名(值)的映射初始化模板时作为模板.FuncMap
应用。让funcmap接受字符串参数并用哈希替换它-例如,应用funcmap后,{{{hashed“style.css”}
变成/public/dist/stylesheet-d861367de2.css
。或者,使用诸如webpack之类的JS工具编译SASS/uglify JS,生成清单,并让您的Go程序读取清单。(这里可以找到一个很好的示例:+相关代码)非常好,谢谢。这个例子很有帮助,效果很好!你知道有没有一个简单的方法来获取最新的(修改过的)文件?还是我必须统计一切
<link rel="stylesheet" href="{{ .MyCssFile | resolveName }}" />
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")
)