Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates Go HTML模板中的自动资产修订文件名_Templates_Go_Assets - Fatal编程技术网

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

Templates Go HTML模板中的自动资产修订文件名,templates,go,assets,Templates,Go,Assets,我正在寻求帮助,以实现在Go HTML模板中自动包含版本化文件名的功能。例如,在我的模板中,我的头部有如下内容: <link rel="stylesheet" href="{{ .MyCssFile }}" /> 这样做的目的是确保浏览器能够接收到新的更改,但也允许缓存。以下是Django中的一个示例实现,以便更好地解释: StaticFilesStorage后端的一个子类,通过将文件内容的MD5哈希附加到文件名来存储它处理的文件名。例如,

我正在寻求帮助,以实现在Go HTML模板中自动包含版本化文件名的功能。例如,在我的模板中,我的头部有如下内容:

<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")
)