Vugu 示例构建与运行完全指南:mage 自动化与手工构建两条路径
前端Web框架【免费下载链接】vuguVugu: A modern UI library for GoWebAssembly (experimental)项目地址https://gitcode.com/gh_mirrors/vu/vugu点击查看免费下载本篇指南以 VuguGo WebAssembly 前端 UI 库官方示例集为核心完整讲解两条构建与运行路径基于mage Docker 的一键自动化方式以及脱离mage的手工复刻方式。读完本文你将掌握如何克隆仓库、构建全部或单个示例、启动本地 nginx 容器并在浏览器中调试示例同时理解 mage 底层每一步的真实实现能够根据自身构建工具链自由选择。关联文档v2/examples/Readme.md一、示例集的获取方式与前置准备Vugu 的示例代码位于仓库的v2/examples目录下当前仓库包含 7 个示例模块compound-component组件交互、dom-eventsDOM 事件、embed-and-translate嵌入与多语言、html-form表单、simple最小示例、vg-for列表渲染、vg-if条件渲染。关键前提示例无法通过go get直接获取。获取示例的唯一方式是克隆整个 Vugu 仓库git clone https://github.com/vugu/vugu cd vugu/v2克隆完成后示例代码就在examples目录中。你可以选择在原位置就地构建也可以根据需要把某个示例单独复制到别处使用。注意示例的go.mod中使用了本地replace指令指向父目录例如 vg-if 示例的 go.mod 中的replace github.com/vugu/vugu/v2 ../..因此脱离仓库目录后需自行调整模块依赖。两种构建方式都需要先满足工具前置条件方式一推荐需要预装docker与mage由 mage 自动完成全部构建与容器编排方式二不使用 mage手工复刻 mage 的执行步骤只要本地有 Go 工具链即可。二、方式一使用 mage 一键构建与运行示例mage是 Vugu 项目首选的构建工具负责处理构建和运行示例的全部复杂性。mage 的所有目标定义在仓库根目录的 v2/magefiles/magefile.go 中构建约束为//go:build mage。2.1 构建并运行全部示例在克隆仓库后进入vugu/v2目录执行mage Examples该目标会依次完成安装 vugu 工具链、拉取 nginx 镜像、启动本地 nginx 容器、扫描examples目录下所有 Go module 并逐个构建 WebAssembly 二进制。执行成功后终端会输出Local nginx container started. Connect to http://localhost:8889/example-test-directory-name e,g. http://localhost:8889/fetch-and-display To stop the local nginx container please run: mage StopLocalNginxForExamples此时在浏览器中访问http://localhost:8889/示例目录名/即可查看对应示例。2.2 构建并运行单个示例只想运行某个示例时使用SingleExample目标参数为示例的完整 Go module 路径mage SingleExample github.com/vugu/vugu/v2/examples/vg-if例如构建vg-if示例后浏览器访问 http://localhost:8889/vg-if/ 即可运行。2.3 修改示例后的重新构建修改了示例源码后需要重新构建才能看到效果。重新执行mage Examples或mage SingleExample 模块名然后在浏览器中刷新页面让浏览器重新加载新的 WebAssembly 文件.wasm。SingleExample命令会同时构建该示例以及全部 vugu 工具确保示例始终使用最新版本的 vugu 工具链进行编译。2.4 停止本地 nginx 容器所有示例共享同一个本地 nginx 容器容器名为vugu-nginx-examples映射宿主机端口 8889。停止它执行mage StopLocalNginxForExamples该目标内部通过docker stopdocker rm清理容器见 v2/magefiles/dockercmd.go 中的stopContainerForExamples且即使容器未运行也不会报错可以重复执行。2.5 常用 mage 目标速查目标作用mage Examples构建并启动 nginx 容器服务全部示例mage SingleExample 模块名构建并服务单个示例mage StartLocalNginxForExamples仅启动本地 nginx 容器安全可重复执行会先停掉旧容器mage StopLocalNginxForExamples停止本地 nginx 容器mage Clean递归删除工作目录下所有*.wasm文件mage CleanAutoGeneratedFiles递归删除所有*_gen.go生成文件mage ExamplesWithGeneratedFilesCheck构建示例并额外校验生成文件与已提交版本一致三、方式二不使用 mage 的手工构建流程如果你必须使用其他构建工具例如 CI 环境不便安装 mage可以手工复刻 mage 的执行步骤。以下步骤是 mage 内部流程的概要若存在疑问以顶层 v2/magefiles/magefile.go 中的实现为准。3.1 安装 vugu 工具链构建示例依赖 vugu 包本身及vugugen代码生成工具# 安装 vugu 包本身后续步骤依赖它 go install github.com/vugu/vugu/v2 # 安装 vugugen 代码生成工具 go install github.com/vugu/vugu/v2/cmd/vugugen说明vugu/v2 模块中的 CLI 入口为 v2/cmd/vugu/vugu.go其中gen子命令别名g负责递归地从当前目录下所有.vugu文件生成 Go 代码。mage 实际执行的就是vugu gen这一命令。3.2 进入示例目录并生成代码以vg-if为例从克隆仓库的根目录vugu/v2进入示例目录cd examples/vg-if运行vugugen从*.vugu文件生成对应的*_gen.go文件vugugen生成结果示例root.vugu对应的 root_gen_js_wasm.go文件头注明Code generated by vugu via vugugen DO NOT EDIT。生成代码中可以看到root.vugu中的click事件被转换为DOMEventHandlerSpec事件类型click 回调c.ToggleShow()vg-if与vg-for被转换为 Go 的if分支与for pos, value : range c.List()循环——这正是示例模板向可执行 Go 代码的映射关系。3.3 交叉编译 WebAssembly现在目录中已具备全部*.go源文件可以构建 WebAssembly 二进制。注意必须向go build传入模块名而非源文件列表GOOSjs GOARCHwasm go build -o ./main.wasm github.com/vugu/vugu/v2/examples/vg-if该命令在当前目录生成main.wasm文件。从 mage 的runGoBuildInModuleDir见 v2/magefiles/modulehandler.go可以确认其内部正是设置GOOSjs、GOARCHwasm后执行go build -o ./main.wasm 模块名与上述命令完全一致。3.4 准备 wasm_exec.js 胶水文件浏览器运行 WebAssembly 还需要 Go 官方提供的wasm_exec.js胶水文件。mage 的做法是从 Go 安装目录go env GOROOT下复制lib/wasm/wasm_exec.jsGo 1.24 的路径布局到示例目录具体实现在copyWasmExecJSFromGoRootv2/magefiles/modulehandler.go中。手工流程中你需要自行执行等价复制例如cp $(go env GOROOT)/lib/wasm/wasm_exec.js .vg-if 示例的 index.html 中正是通过script src/vg-if/wasm_exec.js/script加载该文件再以WebAssembly.instantiateStreaming(fetch(/vg-if/main.wasm), go.importObject)加载并运行 wasm 二进制。3.5 用 Web 服务器托管示例拿到main.wasm后还需要一个 Web 服务器来托管 wasm 文件、index.html以及其他 HTML 与样式表。Vugu 项目使用运行在容器中的 nginx 完成此任务。对于vg-if示例mage 实际执行的 docker 命令为# vugu-examples 是容器名 # 将整个 examples 目录绑定挂载进容器因此该命令可服务 examples 目录中的任意已构建示例 # 8889 是暴露给宿主机的端口 docker run --name vugu-examples --mount typebind,source./examples,target/usr/share/nginx/html,readonly -p 8889:80 -d nginx挂载采用readonly只读模式-p 8889:80将容器的 80 端口映射到宿主机 8889 端口。启动后浏览器访问 http://localhost:8889/vg-if/ 即可运行vg-if示例。说明mage 内部实际的容器名为vugu-nginx-examples见 v2/magefiles/consts.go且会额外挂载wasm-test-suite/nginx-test.conf配置文件手工执行时若需自定义 nginx 配置可通过增加一个绑定挂载参数的方式传入自定义配置。3.6 使用其他 Web 服务器如果不用 nginx改用其他 Web 服务器如 Caddy、Python http.server 等整体流程是类似的只要正确提供.wasm文件与index.html即可。核心要求是index.html、wasm_exec.js、main.wasm三者的 URL 路径与页面内引用保持一致示例中以/vg-if/为前缀。四、mage 自动化背后的实现原理理解 mage 的实现细节有助于你在脱离 mage 时准确复刻流程也有助于排查构建问题。4.1 示例模块的自动发现Examples与SingleExample目标都依赖modulesUnderDir函数v2/magefiles/modulehandler.go它会进入examples目录遍历每个子目录通过go list -m -f {{.Path}}与go list -m -f {{.Dir}}获取每个子模块的模块路径与源码目录并用 map 去重因为子目录中的纯包目录会重复返回外层模块信息。这也是SingleExample需要传入完整模块名如github.com/vugu/vugu/v2/examples/vg-if的原因——它用该名称在发现的模块列表中精确匹配。4.2 单个模块的完整构建流水线无论构建示例还是 wasm 测试套件最终都收敛到doBuildAndTestModulev2/magefiles/modulehandler.go其步骤为在模块目录内运行vugu gen等价于手工流程的vugugen运行go mod tidy整理依赖从 Go 安装目录复制wasm_exec.js到模块目录运行GOOSjs GOARCHwasm go build -o ./main.wasm 模块名测试场景下运行go test -v 模块名。4.3 nginx 容器的启动逻辑StartLocalNginxForExamples先通过mg.SerialDeps(PullLatestNginxImage)拉取nginx:latest镜像然后调用startContainerForExamplesv2/magefiles/dockercmd.go。其中htmlMountArg构造为typebind,source./examples,target/usr/share/nginx/html,readonly——因为 docker 的 bind mount 要求绝对路径所以代码特意给examples加上了./前缀。容器启动前会先停止旧容器保证该目标可安全重复执行。五、示例源码与运行效果对照以vg-if为例可以直观看到模板文件与 Go 逻辑的配合root.vugu 声明了vg-ifc.Show c.ListLength() 0的条件渲染、vg-forpos, value : range c.List()的列表渲染以及四个click事件按钮root.go 中Root结构体的Show字段带有vugu:data标签保证 DOM 能感知状态变化Init()生命周期方法负责初始化ToggleShow、Push、Pop、Reverse则实现交互逻辑main_wasm.go 通过domrender.New(#vugu_mount_point)挂载到 index.html 中idvugu_mount_point的 div 上并循环执行buildEnv.RunBuildrenderer.Render完成页面更新。提示示例中组件方法内的fmt.Printf输出会出现在浏览器的 JavaScript 控制台中例如ToggleShow方法中的c.Show: true这是调试示例逻辑的便捷手段。六、常见问题与注意事项端口冲突示例 nginx 容器固定使用宿主机 8889 端口若该端口被占用容器启动会失败需先释放端口或修改 v2/magefiles/consts.go 中的VuguNginxExamplesContainerPort。docker 未安装CheckRequiredCmdsExist目标会检查docker与git是否在 PATH 中见 v2/magefiles/helpers.go 的checkAllCmdsExist缺失时 mage 会直接报错。如果无法安装 docker请改用第三节的手工构建流程。生成文件勿手改*_gen.go由vugu gen自动生成修改后会被覆盖改动示例行为应修改*.go组件逻辑与*.vugu模板文件再重新构建。浏览器兼容示例index.html会检测WebAssembly支持情况不支持 WebAssembly 的旧浏览器会显示提示信息而无法运行示例。赞分享前端Web框架【免费下载链接】vuguVugu: A modern UI library for GoWebAssembly (experimental)项目地址https://gitcode.com/gh_mirrors/vu/vugu点击查看免费下载相关推荐Vugu 示例程序构建与运行完全指南mage 自动化与手工编译双路线Vugu 示例程序构建与运行完全指南mage 自动化与手工编译双路线 导读 Vugu 是一个基于 Go WebAssembly 的实验性 UI 库仓库前端Web框架Vugu 复合组件compound-component示例解析父子组件动态通信与 mage 构建运行实战Vugu 复合组件compound component示例解析父子组件动态通信与 mage 构建运行实战 Vugu 是一个使用 Go WebAssem前端Web框架网页视频下载总是失败猫抓Cat-Catch浏览器资源嗅探扩展从零上手网页视频下载总是失败猫抓Cat Catch浏览器资源嗅探扩展从零上手 猫抓Cat Catch是一款免费开源的浏览器资源嗅探扩展专治网页视频无法下载音视频上一篇karmadactl create secret generic 详解在 Karmada 联邦集群中从文件、目录与字面量创建通用 Secret下一篇Serial Studio 时序图历史缓冲的级联包络金字塔EnvelopeRing 设计与实现解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考