【免费下载链接】craft-launcherThe Craft App Launcher项目地址https://gitcode.com/gh_mirrors/cr/craft-launcher点击查看免费下载ArtCraft Launcher 是一款用 Rust 编写的 Craft App Suite 启动器负责安装、更新和打开 PhotoCraft、LightCraft、FilmCraft 等 12 款创意应用。它的 Web 版把同一套界面代码编译成 WebAssemblyWASM直接跑在浏览器里展示全套应用目录、自动识别访客的操作系统并给出对应的下载链接。这篇文章带你完整了解 Web 版能做什么、代码是怎么分层的以及如何构建部署。Web 版能做什么、不能做什么 浏览器不能操作本地文件系统所以 Web 版无法安装应用。它把自己定位成一个目录 下载中心功能桌面版Web 版展示 12 款应用目录与最新版本✅✅识别访客系统给出对应下载包✅✅一键安装 / 更新 / 启动 / 卸载✅❌改为下载按钮 GitHub 链接系统托盘、登录项、通知✅❌多语言界面含简体中文✅✅跟随浏览器语言记住你的设置✅本地文件✅浏览器 localStorage具体来看Web 版打开后会自动完成这几件事拉取最新 release逐个访问 GitHub REST APIapi.github.com允许跨域请求得到每款应用的最新版本号、发布时间和全部下载文件——不需要自己的后端服务器识别访客平台解析浏览器 User-Agent判断是 Windows / macOS / Linux / FreeBSD以及 x64 / ARM64 / RISC-V 架构据此为每个应用挑出正确的下载包.msi、.dmg、.AppImage……匹配界面语言优先读取地址栏里的?langru参数其次读浏览器的偏好语言加载提示文字也会用对应语言显示记住设置语言、视图方式等设置通过 eframe 的持久化机制存入浏览器 localStorage下次打开自动恢复。 一个小细节桌面版会用系统自带的 CJK 字体渲染中文、日文等文字而 Web 版没有这个条件——当系统无法提供字体时界面会退回英文并在设置里说明原因。界面可以在网格Grid和表格Table两种布局间切换支持排序与搜索这些交互逻辑在两个平台完全一致——因为它们本就是同一份 UI 代码。同一套代码的关键三层 Crate 架构整个项目是一个 Cargo 工作区见 Cargo.toml按职责拆成三层这是一套代码两端跑能成立的根本原因层位置内容能否编译到 WASMcorecrates/core/纯数据与逻辑应用目录、版本比较、GitHub release 解析、按平台挑选下载包✅ui-eguicrates/ui-egui/共享界面网格/表格视图、设置、主题、多语言✅nativecrates/native/桌面专属下载、安装、托盘、自更新❌artcraft-launcher-webapps/artcraft-launcher-web/Web 壳WASM 入口 浏览器后端仅约 260 行✅crates/core/src/lib.rs 开头就说明了设计意图core 里没有任何 I/O所以桌面版、Web 版和测试代码可以原样共享它。比如从一堆下载文件里挑出最适合当前平台的包这个逻辑两端都用同一个函数pick_assetcrates/core/src/platform.rs。UI 层与后端之间只通过一条清晰的协议对话定义在 crates/core/src/protocol.rsUI → 后端发送Command检查更新、安装、启动、配置……后端 → UI每帧拉取一次Event最新 release、进度、完成/失败。桌面后端在独立线程里干活Web 后端在 async 任务里干活两边都不阻塞渲染帧。还有一个巧妙的能力开关——Capabilities结构体。每个后端通过它告诉 UI 自己能干什么桌面版声明manage_apps: true按钮就是安装 / 更新 / 打开Web 版声明manage_apps: false见 apps/artcraft-launcher-web/src/web.rs同一份 UI 代码就会自动把主按钮换成下载并链接到对应的 GitHub 下载文件。UI 因此可以保持薄薄一层只负责画卡片、读状态、发命令完全不关心背后是操作系统还是浏览器。Web 壳的实现fetch、UA 与 localStorageWeb 壳的入口是 apps/artcraft-launcher-web/src/main.rs通过eframe::WebRunner把 egui 界面渲染到页面里的canvas上index.html 就只有一个画布和一个加载提示。真正有浏览器味道的代码都集中在 apps/artcraft-launcher-web/src/web.rs查最新版本用浏览器的fetch直接向 GitHub API 发 CORS 请求。对每个应用请求releases/latest把 JSON 交给 core 里现成的解析函数。遇到 403/429限流时会读取x-ratelimit-reset响应头把恢复时间告诉界面没登录的访客共享的是每 IP 每小时 60 次请求的额度所以界面会把限流情况说清楚而不是干转圈。猜访客平台visitor_platform函数apps/artcraft-launcher-web/src/web.rs检查 User-Agent 中的 windows、mac os、linux 等关键字来确定系统再用 aarch64 / arm64 / riscv 确定架构。语言检测detect_language函数apps/artcraft-launcher-web/src/web.rs在首帧之前执行把?langxx参数和navigator.languages一起交给 i18n 模块实现见 crates/ui-egui/src/i18n/detect.rs并同步更新页面的html lang属性和加载文字。设置持久化eframe 在 Web 上自动使用 localStorage所以保存设置只需一行eframe::set_value和桌面版共用同一个Settings结构体crates/ui-egui/src/settings.rs。如何构建并部署 Web 版 ️本地构建只需两条命令cargo install trunk --locked # 安装 WASM 构建工具 trunk rustup target add wasm32-unknown-unknown # 添加 WASM 目标 cd apps/artcraft-launcher-web trunk serve # 本地运行于 127.0.0.1:8766Trunk.toml 指定了两个关键设置输出目录为../../dist/webpublic_url ./让所有资源都走相对路径——这保证了站点无论是挂在域名根目录、子路径还是 CDN 桶里都能正常工作。apps/artcraft-launcher-web/Cargo.toml 里还有个值得注意的注释渲染走 wgpu浏览器里是WebGPU 优先、WebGL2 兜底所以无需担心老显卡。工作区 Cargo.toml 里的wasm-releaseprofile 开启了opt-level s按体积优化fatLTO尽量压缩最终的.wasm文件。产物是什么一个自包含的纯静态站点packaging/web/README.md 有完整说明文件说明index.html页面本身全部使用相对 URL 加载资源artcraft-launcher-web-hash.jswasm-bindgen 生成的胶水代码ES moduleartcraft-launcher-web-hash_bg.wasm应用主体egui 界面 业务逻辑_headers/.htaccessNetlify / Cloudflare Pages / Apache 的示例配置没有服务端代码也没有一行手写的 JavaScript——把文件夹上传到任何能托管静态文件的地方即可。官方构建脚本 packaging/web/package.sh 还会做两道具保险发现根绝对路径 URL 直接报错防止子路径部署翻车WASM 超过 24 MiB 也报错Cloudflare 单文件上限 25 MiB。部署时真正需要关心的是这几项详见 packaging/web/README.md.wasm的 MIME 类型必须是application/wasm否则浏览器拒绝流式编译对.wasm/.js/.html开启 gzip 或 Brotli 压缩带内容哈希的.wasm和.js可以设置一年 immutable缓存只有index.html需要no-cache应用不使用SharedArrayBuffer因此不需要 COOP/COEP 那套隔离头。想把它嵌进别的页面一个iframe即可沙箱化 iframe 至少需要allow-scripts allow-same-origin allow-popups其中allow-popups是为了让下载链接能打开。本地想先验证一下在站点目录里跑python3 -m http.server 8765然后打开http://localhost:8765/就够了。如何验证 WASM 构建没问题仓库的 CI 任务把 WASM 兼容性也纳入了日常检查xtask/src/main.rscargo xtask wasm会对必须能跑在浏览器里的 cratecore 与 web 应用执行cargo check --target wasm32-unknown-unknowncargo xtask ci则一次跑完格式检查、clippy、全部测试和 WASM 检查。这样任何误引入只有原生平台才有的依赖都会立刻被发现而不是等到上传部署时才爆炸。小结ArtCraft Launcher Web 版的做法可以概括为三句话纯逻辑下沉目录、版本、release 解析全部放进无 I/O 的 core 层天然可编译为 WASM协议隔离UI 只认Command/Event协议和Capabilities开关桌面后端与 Web 后端各写各的UI 一行不改静态站点交付trunk 构建出的 HTML JS WASM 三件套扔到任何静态托管上即可运行。对想给 Rust/egui 项目加浏览器版的开发者来说这套分层值得直接抄作业先想清楚哪部分代码不碰 I/O再把平台差异全部塞进 trait 的另一侧。赞分享【免费下载链接】craft-launcherThe Craft App Launcher项目地址https://gitcode.com/gh_mirrors/cr/craft-launcher点击查看免费下载相关推荐rust-libp2p 浏览器 WebRTC 示例用 wasm-pack 将 libp2p-webrtc-websys 跑进浏览器并 Ping 原生服务器rust libp2p 浏览器 WebRTC 示例用 wasm pack 将 libp2p webrtc websys 跑进浏览器并 Ping 原生服务器 e网络通信后端Panda CSS compiler-wasm让 Rust 编译引擎跑进浏览器与 Playground 的 WebAssembly 绑定解析Panda CSS compiler wasm让 Rust 编译引擎跑进浏览器与 Playground 的 WebAssembly 绑定解析 pandacs前端构建工具开发工具在浏览器中为 Rust 代码计时wasm-bindgen 的 web-sys performance.now 实战示例在浏览器中为 Rust 代码计时wasm bindgen 的 web sys performance.now 实战示例 导读 本文以 wasm bindgen开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考