首页 Go问答

Go语言如何实现html页面静态化

pyweeX 发布于 03-02
Go问答
pyweeX

Go语言如何实现页面静态化?市面上的CMS都有页面静态化功能,这些CMS一般都是php做的,性能相对比较慢,所以都有自动生成静态HTML文件的功能。

用Go语言实现静态化其实更加简单,直接将文件缓存起来就可以了。


先来看一下常规的html渲染,它是动态渲染,每次请求都是直接从硬盘里面获取 html 文件,再将数据解析出来。

  1. type HTMLData struct{
  2. Title string
  3. }
  4. func Index(w http.ResponseWriter, r *http.Request) error {
  5. // 解析模板和数据
  6. htmlFiles := []string{
  7. "index.html",
  8. "head.html",
  9. "foot.html",
  10. }
  11. h, err := template.ParseFiles(htmlFiles...)
  12. if err != nil {
  13. return err
  14. }
  15. if _, err = h.Execute(w, &HTMLData{
  16. Title: "网站标题",
  17. }); err != nil {
  18. return err
  19. }
  20. }

为了避免每次都从硬盘里面读取模板文件,也避免每次都要解析数据,可以将这些数据一次性存入到中间件里面,我这里以redis为例。

  1. type HTMLData struct{
  2. Title string
  3. }
  4. func Index(w http.ResponseWriter, r *http.Request) error {
  5. // 查找缓存
  6. key := "html:cache:index"
  7. buf,err := rdsCli.Get(key).Bytes()
  8. if err != nil {
  9. return err
  10. }
  11. if len(buf) > 0 {
  12. _, err = w.Write(buf)
  13. return err
  14. }
  15. // 解析模板和数据
  16. htmlFiles := []string{
  17. "index.html",
  18. "head.html",
  19. "foot.html",
  20. }
  21. h, err := template.ParseFiles(htmlFiles...)
  22. if err != nil {
  23. return err
  24. }
  25. var buffer *bytes.Buffer
  26. if _, err = h.Execute(buffer, &HTMLData{
  27. Title: "网站标题",
  28. }); err != nil {
  29. return err
  30. }
  31. // 写入缓存 保存半小时
  32. _ = rds.Set(key, buffer.Bytes(), time.Second*1800)
  33. }

当然如果没有中间件,也可以将它保存成一个文件,每次请求就直接读取这个html文件,这就和 CMS 一样了,同样也能大幅度提高访问速度,因为少了数据解析组装这一套逻辑。

原理是一样的,使用 os.OpenFile 函数创建静态文件即可。

  1. fileName := "index.html"
  2. file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, os.ModePerm)
  3. if err != nil {
  4. return err
  5. }
  6. defer file.Close()
  7. template.Execute(file, &HTMLData{Title: "go语言网站"})

如果页面对实时性要求不高,就很适合对这些html做静态化处理,本站(go语言编程)也是使用了这样的逻辑。生产环境使用的时候最好将缓存模块封装在最外层,这样就不需要每个接口都写一次缓存逻辑了。

声明: 因编程语言版本更新较快,当前文章所涉及的语法或某些特性相关的信息并不一定完全适用于您当前所使用的版本,请仔细甄别。文章内容仅作为学习和参考,若有错误,欢迎指正。

讨论 支持 Markdown 语法 点击演示
回复
评论预览框
#1 pyweeX 03-02 golang-pyweeX

页面静态化一般是直接生成一个个html文件保存在某个目录,当用户访问的时候直接访问这些目录下的文件。现在这里用的是redis作为html缓存,原理是一样的。但不需要像cms那样专门去手动生成了。

回复 赞(1)

开发者

开发者·注册登录
  • 获取验证码
  • 取消