只需要装两个 go 的库,执行下面两步,就可以把你的网站(SPA更佳)封装到一个单文件的可执行客户端程序里啦!不需要厚重的 Electron,二进制程序大小仅 10 M 左右。
适用于那种功能很简单,只想加个壳让用户不用再打开浏览器的轻量级网站。
Step 1 打包静态资源
要想打包成单个文件,首先得把网站的静态资源 html,js,css,图片 等等一起搞到二进制文件里去
提供这种功能的包有好几个,这里以 go.rice
为例。
安装
go get github.com/GeertJohan/go.rice
go get github.com/GeertJohan/go.rice/rice
使用
写代码
代码里可以这么用:
import (
"github.com/GeertJohan/go.rice"
"net/http"
)
func main() {
http.Handle("/", http.FileServer(rice.MustFindBox("http-files").HTTPBox()))
http.ListenAndServe(":8080", nil)
}
上面的代码做了什么? 假设当前目录里的 http-files
里面是一堆静态文件,这两行代码就是把文件读进来,然后起一个 HTTP 服务。
想了解更加复杂的使用方法去看文档,RTFM!
打包
写完代码还没完,还需要把文件打包进去。之前安装了一个 rice 二进制文件就是干这个的。
在刚才写好的目录里执行:
rice embed-go
执行完之就会发现多了一个 rice-box.go
, 文件都在里面了
然后再
go build
就可以把文件打包进去啦
Warning! 如果用 windows 最好把rice.exe
复制到当前目录里面用,不然容易出问题。
Step 2 给网站加个壳
这一步用到另一个包,webview
第一步已经能够在本地起了一个 HTTP 服务了,只要用这个包做个客户端访问上面的服务就好了
简单使用也是只要一行代码, 其他功能 RTFM!
举个栗子
假设目录结构是这样:
├── main.go # 代码
└── www # 静态文件
├── index.html
└── static
main.go 这么写
package main
import (
"github.com/GeertJohan/go.rice"
"github.com/zserge/webview"
"log"
"net"
"net/http"
)
func serve() {
ln, err := net.Listen("tcp", "127.0.0.1:0")
if err != nil {
log.Fatal(err)
}
defer ln.Close()
go func() {
http.Handle("/", http.StripPrefix("/", http.FileServer(rice.MustFindBox("www").HTTPBox())))
log.Fatal(http.Serve(ln, nil))
}()
webview.Open("Example", "http://"+ln.Addr().String(), 800, 600, true)
}
func main() {
serve()
}
然后执行第一步说的命令
rice embed-go
go build
这样就得到了编译好的二进制文件啦! 打开之后就相当于一个全屏的浏览器
需要注意的是不同平台用的是系统自己的渲染引擎
It uses Cocoa/WebKit on macOS, gtk-webkit2 on Linux and MSHTML (IE10/11) on Windows.
想要跨平台还得兼容IE,哇哈哈哈