【go语言】go-webview2用法(持续更新)
文章目录
- 背景
- 核心接口和方法
- 扩展接口
- 遗憾的是
背景
目前为止,已经有很多优秀的electron应用。但其特点也很明显:使用html+css+js构建的布局很精致,但是体积不容小觑(最新版electron-egg打包出来的程序已经300MB+)。
- vscode: 微软开源的编辑器工具,支持各类插件。
- draw.io: 流程图绘制工具
- tabby: 一款ssh连接工具
- termius:ssh以及sftp连接工具
- typora:一款markdown编辑器
- 微信小程序开发工具: 基于nw.js, 本质和electron差不多。
而webview2是微软基于chromium做的一个渲染引擎,相当于将electron的公共部分抽离到一个目录下:C:\Program Files (x86)\Microsoft\EdgeWebView\Application,然后你的核心程序只需要几M即可运行。

经过UPX压缩后的exe程序,仅需要1.9MB就可跑起一个helloworld页面。

PS:基于webview2的还有wails这个框架,但是框架变动太频繁, wails2.5的程序升级到2.9就跑不起来了,很难受。
核心接口和方法
而go语言方面,已经有人封装了调用webview2来构建exe程序的库。
github.com/jchv/go-webview2
- New():
功能: 创建一个新的 WebView2 实例。
用法: webview, err := webview2.New()
- Destroy():
功能: 销毁 WebView2 实例。
用法: webview.Destroy()
SetTitle(title string):
功能: 设置 WebView2 窗口的标题。
用法: webview.SetTitle(“窗口标题”)
- SetSize(width, height int, hint webview2.Hint):
功能: 设置 WebView2 窗口的大小。
用法: webview.SetSize(800, 600, webview2.HintNone)
- Navigate(url string):
功能: 导航到指定的 URL。
用法: webview.Navigate(“https://example.com”)
- Eval(script string):
功能: 执行 JavaScript 代码。
用法: webview.Eval(“alert(‘Hello, world!’);”)
- Run():
功能: 运行 WebView2 实例,进入事件循环。
用法: webview.Run()
- Bind(name string, fn interface{}):
功能: 将 Go 函数绑定到 JavaScript,以便从 JavaScript 调用 Go 方法。
用法: webview.Bind(“functionName”, func() { /* Go code */ })
扩展接口
通过go调用win32 api可以扩展更多的功能。
- 提示框(windows原生版本)
/*** @description: 调用window原生消息弹框* @param {uintptr} hwnd* @param {*} text 消息内容* @param {string} caption* @param {uint} uType* @return {*}*/
func ShowMessage(hwnd uintptr, text, caption string, uType uint) int {ret, _, _ := procMessageBoxW.Call(hwnd,uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(text))),uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(caption))),uintptr(uType),)return int(ret)
}
- 文件选择框
/*** @description: 选择一个文件, import 一下"github.com/sqweek/dialog"* @return {string, error} 文件路径,错误信息*/
func OpenFileDialog() (string, error) {filePath, err := dialog.File().Title("选择").Load()if err != nil {return "", err}return filePath, nil
}
遗憾的是
- 微软放弃了webview2在mac和linux上的支持,并未开放渲染引擎和接口。
- go语言库github.com/jchv/go-webview2并不支持win7,会报错:kernel32.dll加载失败。可能需要重新配置Webview2Loader.dll。(win7需要109版本以下的。)
官方nuget仓库:https://www.nuget.org/packages/Microsoft.Web.WebView2/1.0.2730-prerelease#versions-body-tab

- go-webview2这个库将函数绑定到了前端的window对象下, 这就导致了前端原生js编写的函数, 不能与go注入的函数同名,不然就gg。可以尝试将go注入的函数放到window.GoMethods下。替换webview.go 467行
w.Init("(function() { var name = " + jsString(name) + ";" + `var RPC = window._rpc = (window._rpc || {nextSeq: 1});if (!window.GoMethods) window.GoMethods = {};window.GoMethods[name] = function() {var seq = RPC.nextSeq++;var promise = new Promise(function(resolve, reject) {RPC[seq] = {resolve: resolve,reject: reject,};});window.external.invoke(JSON.stringify({id: seq,method: name,params: Array.prototype.slice.call(arguments),}));return promise;}})()`)
- 如果将vue2打包的dist目录内嵌到go-webview2生成的exe中,需要一个httpServer来代理静态文件,这样就会占用至少一个本地端口,显然不合适。
似乎wails解决了这个问题:
- https://github.com/wailsapp/wails/blob/release/2.7.0/v2/pkg/assetserver/assetserver_webview.go#L25C13-L25C79
- wails目前开发流程,webview dev时加载vite的http://127.0.0.1:5173,build时实现了一个无本地端口占用,并加载dist内文件的方案,可惜我还没看懂其逻辑。
相关文章:
【go语言】go-webview2用法(持续更新)
文章目录 背景核心接口和方法扩展接口遗憾的是 背景 目前为止,已经有很多优秀的electron应用。但其特点也很明显:使用htmlcssjs构建的布局很精致,但是体积不容小觑(最新版electron-egg打包出来的程序已经300MB)。 vs…...
KNN 图像识别
KNN(K-Nearest Neighbors,K最近邻)算法是一种简单而有效的分类算法,也可以用于图像识别。它的基本思想是通过计算样本之间的距离,将待分类的样本归为其在训练集中最相近的K个样本所属的类别中最常见的类别 1. 准备工作…...
基于STM32和云平台的花卉养护系统设计(微信小程序)(209)
文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】设计实现的功能【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】ESP8266工作模式配置1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要【5】选题背景【6】国内外技术发展现状1.4 开发工具的…...
编程语言进化史
编程语言多到你想象不到。 图片来自: 程序设计语言概念 发展历史 自从1946年冯诺依曼原理被提出,计算机数据和指令是通过二进制形式以及后来的汇编语言(二进制助记符),但依然没有改变容易出错的本质。1951年Rutishauser提出的用编译程序实现高级语言的思…...
vuex的原理和使用方法
简介 Vuex 是 Vue.js 应用的状态管理模式,它为应用内的所有组件提供集中式的状态(数据)管理。可以帮我们管理 Vue 通用的数据 (多组件共享的数据)。 Vuex的构成 state:state 是 Vuex 的数据中心,也就是说state是用来…...
(javaweb)SpringBootWeb案例(毕业设计)案例--文件上传
1.简介 前端程序和服务端程序 对于前端 html文件放在static目录下 location---文件提交的位置 右键--copy value -------------c盘目录下 2.本地上传--文件存储 1. 2. 使用uuid:保证文件名是唯一的 此时 并没有文件的拓展名--所以需要---写后缀 用字符串截取 此时图…...
数据库之存储过程和函数
目录 一、存储过程和函数概述 二、创建并调用存储过程和函数 1.创建存储过程 2.创建存储函数 3.调用存储过程和函数 三、关于存储过程和函数的表达式 1.变量 1.变量的分类 2.在存储过程和函数中应用变量 2.定义条件和处理程序 1.定义条件 2.定义处理程序 3.游标的…...
《SPSS零基础入门教程》学习笔记——02.数据管理
文章目录 2.1 连续变量的离散化2.2 自动重编码、编秩与数值计数2.3 几个常用过程2.4 多个数据文件的操作2.5 数据字典2.6 数据核查(1)数据验证模块(2)数据检验 2.7 数据准备 计算新变量(转换 -> 计算变量࿰…...
嵌入式软件的一些常用调试测试方法
嵌入式软件的仿真调试测试是确保软件质量和功能正确性的关键步骤。以下是几种常见的仿真调试测试方式: 1.集成开发环境(IDE)调试: 使用IDE(如IAR EWARM、Keil MDK、Eclipse等)内置的调试器进行断点设置、单…...
Android T about screen rotation(二)
需求:客户因为模具问题,屏幕方向需要动态的变动.(方向: 0 , 90 , 180 ,270) 拆分:设备开机过程中图像显示可分为三个阶段,boot logo(1)->kernel logo(2),这一段的处理需要驱动层,所以暂时忽略. 开机动画 Bootanimation(3)阶段 和 Home Launcher应用显示(4)阶段是需要修改的…...
qt反射之类反射、方法反射、字段反射
话不多说,直接上代码: main.cpp: #include < QCoreApplication > #include “fstudent.h” #include “manage.h” int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); //注册类型 qRegisterMetaType(“FStudent”); Manage m…...
服务器数据恢复—raid5阵列离线硬盘强制上线失败如何恢复数据?
服务器数据恢复环境: 某品牌2850服务器上有一组由6块SCSI硬盘组建的raid5磁盘阵列,上层操作系统为Redhat linuxext3文件系统。 服务器故障&初检: 服务器在运行过程中突然瘫痪,管理员对服务器中的raid进行检查后发现有两块硬盘…...
FastAPI+Vue3零基础开发ERP系统项目实战课 20240815上课笔记 列表和字典相关方法的学习和练习
昨日回顾 1、大小写转换2、去除空格3、判断是否为数字4、前缀后缀 昨日练习题进度 练习:判断验证码是否正确 1、生成一个由四个字符组成的验证码字符串,要求有大写有小写,要求左右两边有空格2、打印到控制台3、让用户输入这个验证码&…...
基于微信小程序的诗词智能学习系统的设计与实现(全网独一无二,24年最新定做)
文章目录 前言: 博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为…...
httplib库:用C++11搭建轻量级HTTP服务器
目录 引言 一. httplib库概述 二. httplib核心组件 2.1 数据结构 2.2 类和函数 2.3 服务器搭建 编辑 结语 引言 在现代软件开发中,HTTP服务是网络应用的基础。对于需要快速搭建HTTP服务器或客户端的场景,使用成熟的第三方库可以极大提高开发效…...
基于嵌入式C++、SQLite、MQTT、Modbus和Web技术的工业物联网网关:从边缘计算到云端集成的全栈解决方案设计与实现
一、项目概述 1.1 项目目标与用途 随着工业4.0时代的到来,传统工业设备与现代信息技术的结合越来越紧密。物联网工业网关作为连接工业设备与云端平台的桥梁,在工业自动化、设备监控、远程运维等方面发挥着至关重要的作用。本项目旨在设计并实现一个能够…...
Chapter 38 设计模式
欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能! 文章目录 前言一、单例模式二、工厂模式 前言 在软件开发中,设计模式提供了一种可重用的解决方案,以应对在特定环境中反复出现的问题。这些模式是基于经验总结…...
Redis5主备安装-Redis
本次Redis有两台服务器及3个独立IP:主服务器的ip地址是192.168.31.190,从服务器的IP地址是192.168.31.191,vipIP地址是192.168.31.216 主备方案承载Redis最大的好处是无需考虑Redis崩后无法访问。 前提是需要优先安装keepalived,…...
C++票据查验、票据ocr、文字识别
现在,80、90后的人们逐渐过渡为职场上的主力人员,在工作中当然也会碰到各种各样的问题。比如,当你的老板给你一个艰难的任务时,肯定是不能直接拒绝的。那么我们该怎么做呢?翔云建议您先认真考虑老板说的任务的难度&…...
pytest.ini介绍
1.pytest.ini是什么 ? pytest.ini文件是pytest的主配置文件;pytest.ini文件的位置一般放在项目的根目录下,不能随便放,也不能更改名字。在pytest.ini文件中都是存放的一些配置选项 ,这些选项都可以通过pytest -h查看到…...
为什么 AI 框架几乎全选 Python,而不选 C#?| 技术深度分析
关键词:Python AI、C# AI开发、PyTorch、Semantic Kernel、Microsoft Agent Framework、ML.NET这不是 C# 的失败,而是一场"不公平竞争"的历史必然。先看数据:Python 在 AI 领域有多统治?不是我吹,数据摆在这…...
诈骗分子利用微软内部账户发垃圾链接,微软能否解决安全漏洞?
诈骗事件曝光 几个月来,诈骗分子利用漏洞,从微软内部通常用于发送合法账户提醒的电子邮件地址发送垃圾邮件。目前不清楚他们如何利用系统,但能像新客户一样创建新微软账户,并以微软名义发邮件,易让人们误以为邮件真实。…...
Codex vs. Claude Code:我的发现
“你试过 Codex 搭配 GPT-5.5 了吗?我刚用 40 分钟重建了整个认证模块。上周用 Claude 做同样的事花了三个小时。” 我回复了一句"有意思",然后继续做手头的事。我使用 Claude Code 已近一年,已经围绕它建立了整套工作流——CLAUD…...
机器学习势函数评估新范式:从力误差到分子动力学模拟的物理性质验证
1. 项目概述与核心挑战在计算材料科学和凝聚态物理领域,分子动力学模拟是我们理解原子尺度下物质行为不可或缺的“显微镜”。它的核心在于求解牛顿运动方程,而驱动原子运动的力,则完全依赖于描述原子间相互作用的势能面。长久以来,…...
CleanMyWechat:你的微信磁盘空间救星,三步告别几十GB的缓存困扰
CleanMyWechat:你的微信磁盘空间救星,三步告别几十GB的缓存困扰 【免费下载链接】CleanMyWechat 自动删除 PC 端微信缓存数据,包括从所有聊天中自动下载的大量文件、视频、图片等数据内容,解放你的空间。 项目地址: https://git…...
3分钟快速上手:终极免费音乐解锁工具,让加密音频重获自由
3分钟快速上手:终极免费音乐解锁工具,让加密音频重获自由 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项…...
Java中的char[] 和 Character[]什么联系,StringBuilder 存在的意义,如何将 Character[] 数组转换成 String
在 Java 中,char[] 和 Character[] 虽然看起来很像,但它们在底层结构和使用场景上有本质区别。1. 核心区别:基本数据类型 vs. 包装类char[] (基本类型数组):这是一个由 基本数据类型 char 组成的数组。在内存中,它直接…...
Gemini从部署到退役的全周期价值追踪:3类企业实测数据揭示87%团队忽略的关键衰减点
更多请点击: https://kaifayun.com 第一章:Gemini从部署到退役的全周期价值追踪:3类企业实测数据揭示87%团队忽略的关键衰减点 在真实生产环境中,Gemini模型的价值并非随部署即达峰值,而是呈现典型的“倒U型衰减曲线”…...
长期使用Taotoken Token Plan套餐的成本节约体感
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用Taotoken Token Plan套餐的成本节约体感 在管理一个中型项目的AI模型调用成本时,我们经历了从按次、按量付费到…...
【ChatGPT多语言支持权威评测】:基于27种语言、146项指标的实测数据,揭晓真实可用性天花板
更多请点击: https://kaifayun.com 第一章:【ChatGPT多语言支持权威评测】:基于27种语言、146项指标的实测数据,揭晓真实可用性天花板 评测方法论与语言覆盖范围 本次评测严格采用双盲测试协议,覆盖联合国官方语言&a…...
