把网站封装成PC端单文件客户端程序(非Electron)

经验

只需要装两个 go 的库,执行下面两步,就可以把你的网站(SPA更佳)封装到一个单文件的可执行客户端程序里啦!不需要厚重的 Electron,二进制程序大小仅 10 M 左右。

适用于那种功能很简单,只想加个壳让用户不用再打开浏览器的轻量级网站。

Step 1 打包静态资源

要想打包成单个文件,首先得把网站的静态资源 html,js,css,图片 等等一起搞到二进制文件里去

提供这种功能的包有好几个,这里以 go.rice 为例。

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

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,哇哈哈哈