当前位置: 首页 > news >正文

【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
}

遗憾的是

  1. 微软放弃了webview2在mac和linux上的支持,并未开放渲染引擎和接口。
  2. 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
    在这里插入图片描述
  3. 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;}})()`)
  1. 如果将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 数据准备 计算新变量(转换 -> 计算变量&#xff0…...

嵌入式软件的一些常用调试测试方法

嵌入式软件的仿真调试测试是确保软件质量和功能正确性的关键步骤。以下是几种常见的仿真调试测试方式: 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反射之类反射、方法反射、字段反射

话不多说&#xff0c;直接上代码&#xff1a; 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阵列离线硬盘强制上线失败如何恢复数据?

服务器数据恢复环境&#xff1a; 某品牌2850服务器上有一组由6块SCSI硬盘组建的raid5磁盘阵列&#xff0c;上层操作系统为Redhat linuxext3文件系统。 服务器故障&初检&#xff1a; 服务器在运行过程中突然瘫痪&#xff0c;管理员对服务器中的raid进行检查后发现有两块硬盘…...

FastAPI+Vue3零基础开发ERP系统项目实战课 20240815上课笔记 列表和字典相关方法的学习和练习

昨日回顾 1、大小写转换2、去除空格3、判断是否为数字4、前缀后缀 昨日练习题进度 练习&#xff1a;判断验证码是否正确 1、生成一个由四个字符组成的验证码字符串&#xff0c;要求有大写有小写&#xff0c;要求左右两边有空格2、打印到控制台3、让用户输入这个验证码&…...

基于微信小程序的诗词智能学习系统的设计与实现(全网独一无二,24年最新定做)

文章目录 前言&#xff1a; 博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为…...

httplib库:用C++11搭建轻量级HTTP服务器

目录 引言 一. httplib库概述 二. httplib核心组件 2.1 数据结构 2.2 类和函数 2.3 服务器搭建 ​编辑 结语 引言 在现代软件开发中&#xff0c;HTTP服务是网络应用的基础。对于需要快速搭建HTTP服务器或客户端的场景&#xff0c;使用成熟的第三方库可以极大提高开发效…...

基于嵌入式C++、SQLite、MQTT、Modbus和Web技术的工业物联网网关:从边缘计算到云端集成的全栈解决方案设计与实现

一、项目概述 1.1 项目目标与用途 随着工业4.0时代的到来&#xff0c;传统工业设备与现代信息技术的结合越来越紧密。物联网工业网关作为连接工业设备与云端平台的桥梁&#xff0c;在工业自动化、设备监控、远程运维等方面发挥着至关重要的作用。本项目旨在设计并实现一个能够…...

Chapter 38 设计模式

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、单例模式二、工厂模式 前言 在软件开发中&#xff0c;设计模式提供了一种可重用的解决方案&#xff0c;以应对在特定环境中反复出现的问题。这些模式是基于经验总结…...

Redis5主备安装-Redis

本次Redis有两台服务器及3个独立IP&#xff1a;主服务器的ip地址是192.168.31.190&#xff0c;从服务器的IP地址是192.168.31.191&#xff0c;vipIP地址是192.168.31.216 主备方案承载Redis最大的好处是无需考虑Redis崩后无法访问。 前提是需要优先安装keepalived&#xff0c;…...

C++票据查验、票据ocr、文字识别

现在&#xff0c;80、90后的人们逐渐过渡为职场上的主力人员&#xff0c;在工作中当然也会碰到各种各样的问题。比如&#xff0c;当你的老板给你一个艰难的任务时&#xff0c;肯定是不能直接拒绝的。那么我们该怎么做呢&#xff1f;翔云建议您先认真考虑老板说的任务的难度&…...

pytest.ini介绍

1.pytest.ini是什么 &#xff1f; pytest.ini文件是pytest的主配置文件&#xff1b;pytest.ini文件的位置一般放在项目的根目录下&#xff0c;不能随便放&#xff0c;也不能更改名字。在pytest.ini文件中都是存放的一些配置选项 &#xff0c;这些选项都可以通过pytest -h查看到…...

从FPGA到ASIC:实战中如何为你的IP核选择合适的Wishbone互联拓扑?

从FPGA到ASIC&#xff1a;实战中如何为你的IP核选择合适的Wishbone互联拓扑&#xff1f; 在复杂SoC设计中&#xff0c;总线架构的选择往往决定了系统性能的上限。Wishbone作为轻量级片上总线协议&#xff0c;其灵活的互联拓扑为工程师提供了四种截然不同的设计范式&#xff1a;…...

DeepSeek-R1-Distill-Qwen-7B实测:推理能力超强的7B小模型

DeepSeek-R1-Distill-Qwen-7B实测&#xff1a;推理能力超强的7B小模型 1. 模型概述 DeepSeek-R1-Distill-Qwen-7B是DeepSeek团队推出的轻量级推理模型&#xff0c;基于Qwen架构蒸馏而来。这个7B参数规模的模型在保持较小体积的同时&#xff0c;展现了令人印象深刻的推理能力。…...

多平台网盘直链解析工具:技术原理与应用指南

多平台网盘直链解析工具&#xff1a;技术原理与应用指南 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改&#xff08;改自6.1.4版本&#xff09; &#xff0c;自用&#xff0c;去推广&#xff0c;无…...

MCP服务器开发踩坑实录,深度解析asyncio+FastAPI+MCPv0.5兼容性难题及热修复方案

第一章&#xff1a;MCP服务器开发踩坑实录&#xff0c;深度解析asyncioFastAPIMCPv0.5兼容性难题及热修复方案在基于MCP&#xff08;Model Context Protocol&#xff09;v0.5规范构建异步AI服务代理时&#xff0c;我们发现FastAPI 0.115 与标准asyncio事件循环存在隐式冲突&…...

BilibiliDown终极指南:三步搞定B站视频下载,支持批量收藏夹与UP主作品

BilibiliDown终极指南&#xff1a;三步搞定B站视频下载&#xff0c;支持批量收藏夹与UP主作品 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https:…...

从零理解自然数系统:用Python类模拟皮亚诺公理(含加法乘法实现)

从零构建自然数系统&#xff1a;用Python类实现皮亚诺公理与算术运算 在计算机科学中&#xff0c;自然数系统的构建是一个令人着迷的基础课题。当我们抛开编程语言内置的数字类型&#xff0c;仅用最基本的类和递归概念来重新定义自然数时&#xff0c;会惊讶地发现数学的抽象之美…...

203 异构车辆队列分布式 MPC 优化控制约束复现之旅

203 异构车辆队列分布式 MPC 优化控制约束 复现的代码 .m 文件在自动驾驶和智能交通领域&#xff0c;异构车辆队列的分布式模型预测控制&#xff08;MPC&#xff09;是个热门话题。今天就来聊聊基于复现代码&#xff08;.m文件&#xff09;对203异构车辆队列分布式MPC优化控制约…...

从模板到成品:5分钟搞定Java动态填充Word合同(基于Apache POI和DOCX模板)

从模板到成品&#xff1a;5分钟搞定Java动态填充Word合同&#xff08;基于Apache POI和DOCX模板&#xff09; 每次手动调整Word格式就像在玩“大家来找茬”——明明只是改个客户名称&#xff0c;整个文档排版却突然崩坏。去年我们团队处理了超过2000份合同&#xff0c;直到发现…...

六自由度机械臂的模型预测控制(MPC)探索

六自由度机械臂模型预测控制mpc在机器人领域&#xff0c;六自由度机械臂凭借其高度的灵活性&#xff0c;广泛应用于工业生产、医疗手术、科研探索等众多场景。而要精准操控这样复杂的机械臂&#xff0c;模型预测控制&#xff08;MPC&#xff09;无疑是一种强大的策略。 六自由度…...

终极Vorpal错误恢复指南:7个关键策略构建健壮CLI应用

终极Vorpal错误恢复指南&#xff1a;7个关键策略构建健壮CLI应用 【免费下载链接】vorpal Nodes framework for interactive CLIs 项目地址: https://gitcode.com/gh_mirrors/vo/vorpal Vorpal是Node.js生态系统中构建交互式命令行应用的首选框架&#xff0c;提供了强大…...