美文网首页GoGo语言实践Golang 入门资料+笔记
go 1.16 embed 实现资源文件(html, css,

go 1.16 embed 实现资源文件(html, css,

作者: 生活简单些 | 来源:发表于2021-02-19 23:49 被阅读0次

  Golang 发布1.16,如今通过//go:embed 注解内嵌资源文件并打包到二进制文件,关于//go:embed的使用网上很多教程,我想也不需要我在此在啰嗦一遍,今天的重点:用go开发网站时候内嵌的css、html、js以及图片等资源如何内嵌和渲染到网页

含有资源文件的demo项目结构

1. 在没有//go:embed支持之前的实现serve文件的方式如下:

package main

import (
    "log"
    "net/http"
)

func main() {
    mux := http.DefaultServeMux

    mux.Handle("/web/js/", http.StripPrefix("/web/js/", http.FileServer(http.Dir("static/js/"))))
    mux.Handle("/web/css/", http.StripPrefix("/web/css/", http.FileServer(http.Dir("static/css/"))))
    mux.Handle("/web/img/", http.StripPrefix("/web/img/", http.FileServer(http.Dir("static/img/"))))

    log.Fatal(http.ListenAndServe(":8080", mux))
}

这种实现方式需要打包后将资源文件一并拷贝且要求放指定目录,否则程序找不到对应文件,然后报错。

或许: pattern和prefix的设置可以简化些,比如:
mux.Handle("/js/", http.StripPrefix("/js/", http.FileServer(http.Dir("static/js/")))),
然后URL访问也能简化成: http://localhost:8080/js/bootstrap.bundle.min.js, 但这不是重点,重点是虽然URL多了一个结点,但下面的实现代码简化了很多还支持了//go:embed.

测试:浏览器访问http://localhost:8080/web/js/bootstrap.bundle.min.js即可访问到对应文件,想必不太陌生吧。

2. 在支持//go:embed之后实现方式如下:

package main

import (
    "embed"
    _ "embed"
    "log"
    "net/http"
)

//go:embed template static
var Assets embed.FS

func main() {
    mux := http.DefaultServeMux
    mux.Handle("/web/", AssetHandler("/web/", Assets, "./static"))

    log.Fatal(http.ListenAndServe(":8080", mux))
}

测试:浏览器访问http://localhost:8080/web/js/bootstrap.bundle.min.js即可访问到对应文件,访问url一样,不同的是资源文件会在go build打包后全部内嵌。

3. 之所embed的资源文件还能被serve,多亏了AssetHandler的功劳,实现如下:

package main

import (
    "embed"
    "io/fs"
    "net/http"
    "path"
)

type fsFunc func(name string) (fs.File, error)

func (f fsFunc) Open(name string) (fs.File, error) {
    return f(name)
}

// AssetHandler returns an http.Handler that will serve files from
// the Assets embed.FS. When locating a file, it will strip the given
// prefix from the request and prepend the root to the filesystem.
func AssetHandler(prefix string, assets embed.FS, root string) http.Handler {
    handler := fsFunc(func(name string) (fs.File, error) {
        assetPath := path.Join(root, name)

        // If we can't find the asset, fs can handle the error
        file, err := assets.Open(assetPath)
        if err != nil {
            return nil, err
        }

        // Otherwise assume this is a legitimate request routed correctly
        return file, err
    })

    return http.StripPrefix(prefix, http.FileServer(http.FS(handler)))
}

相关文章

  • go 1.16 embed 实现资源文件(html, css,

      Golang 发布1.16,如今通过//go:embed 注解内嵌资源文件并打包到二进制文件,关于//go:e...

  • go embed

    Go Embed 概览 go在1.16之后引入了一个新包 embed。它使我们访问工程内的代码变的相对容易 概览 ...

  • go embed失效不生效的问题(embed使用注意事项)

    embed是go1.16引入的库,允许我们编译的时候内嵌文件到go的二进制文件, 最典型的应用,就是web服务器把...

  • 嵌入静态资源到Go可执行文件

    环境:go v1.15 为什么需要将资源嵌入到可执行文件 举例说明 嵌入web前端资源, 如js/css/html...

  • 动静分离

    1. 动静分离的实现思路 动静分离是将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应...

  • go1.16新特性 内置内嵌资源文件的支持

    go1.16已经入冻结阶段,这一次较重大的更新是对内嵌资源文件的支持。 内嵌资源文件 典型场景:当你需要在云应用程...

  • webpack配置图片和字体

    前端开发中在css代码和html文件中会需要引用图片进行展示,而css代码和html文件引用图片资源分别需要配置不...

  • 浏览器资源加载顺序

    资源加载顺序 在加载web资源时,首先下载html文件,进行html解析,在遇到javascript或css标签时...

  • Linux_210_浏览器解析HTML

    浏览器解析HTML 浏览器拿到index.html文件之后,解析html网页文件,遇见静态资源(js、css、im...

  • 【渲染】文档流渲染

    浏览器获取到html文档,同步下载的css和js文件,以及静态资源文件, css下载完成后,文件将会被解析成css...

网友评论

    本文标题:go 1.16 embed 实现资源文件(html, css,

    本文链接:https://www.haomeiwen.com/subject/eouzxltx.html