Go语言如何实现html页面静态化
Go语言如何实现页面静态化?市面上的CMS都有页面静态化功能,这些CMS一般都是php做的,性能相对比较慢,所以都有自动生成静态HTML文件的功能。
用Go语言实现静态化其实更加简单,直接将文件缓存起来就可以了。
先来看一下常规的html渲染,它是动态渲染,每次请求都是直接从硬盘里面获取 html 文件,再将数据解析出来。
type HTMLData struct{
Title string
}
func Index(w http.ResponseWriter, r *http.Request) error {
// 解析模板和数据
htmlFiles := []string{
"index.html",
"head.html",
"foot.html",
}
h, err := template.ParseFiles(htmlFiles...)
if err != nil {
return err
}
if _, err = h.Execute(w, &HTMLData{
Title: "网站标题",
}); err != nil {
return err
}
}
为了避免每次都从硬盘里面读取模板文件,也避免每次都要解析数据,可以将这些数据一次性存入到中间件里面,我这里以redis为例。
type HTMLData struct{
Title string
}
func Index(w http.ResponseWriter, r *http.Request) error {
// 查找缓存
key := "html:cache:index"
buf,err := rdsCli.Get(key).Bytes()
if err != nil {
return err
}
if len(buf) > 0 {
_, err = w.Write(buf)
return err
}
// 解析模板和数据
htmlFiles := []string{
"index.html",
"head.html",
"foot.html",
}
h, err := template.ParseFiles(htmlFiles...)
if err != nil {
return err
}
var buffer *bytes.Buffer
if _, err = h.Execute(buffer, &HTMLData{
Title: "网站标题",
}); err != nil {
return err
}
// 写入缓存 保存半小时
_ = rds.Set(key, buffer.Bytes(), time.Second*1800)
}
当然如果没有中间件,也可以将它保存成一个文件,每次请求就直接读取这个html文件,这就和 CMS 一样了,同样也能大幅度提高访问速度,因为少了数据解析组装这一套逻辑。
原理是一样的,使用 os.OpenFile 函数创建静态文件即可。
fileName := "index.html"
file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, os.ModePerm)
if err != nil {
return err
}
defer file.Close()
template.Execute(file, &HTMLData{Title: "go语言网站"})
如果页面对实时性要求不高,就很适合对这些html做静态化处理,本站(go语言编程)也是使用了这样的逻辑。生产环境使用的时候最好将缓存模块封装在最外层,这样就不需要每个接口都写一次缓存逻辑了。
声明: 因编程语言版本更新较快,当前文章所涉及的语法或某些特性相关的信息并不一定完全适用于您当前所使用的版本,请仔细甄别。文章内容仅作为学习和参考,若有错误,欢迎指正。