17次发布

0.6.2 2021年2月23日
0.6.1 2020年12月9日
0.6.0 2020年11月13日
0.5.1 2020年6月4日
0.1.0 2018年5月7日

#805GUI

Download history 460/week @ 2024-03-13 438/week @ 2024-03-20 467/week @ 2024-03-27 513/week @ 2024-04-03 278/week @ 2024-04-10 407/week @ 2024-04-17 377/week @ 2024-04-24 350/week @ 2024-05-01 421/week @ 2024-05-08 339/week @ 2024-05-15 359/week @ 2024-05-22 430/week @ 2024-05-29 357/week @ 2024-06-05 347/week @ 2024-06-12 397/week @ 2024-06-19 320/week @ 2024-06-26

1,484 每月下载量
18 个包 中使用 (2 个直接使用)

MIT 许可证

110KB
2.5K SLoC

C 1.5K SLoC // 0.0% comments C++ 517 SLoC // 0.0% comments Rust 453 SLoC // 0.0% comments

web-view .github/workflows/ci.yml 最新版本

重要: 需要 Rust 1.30 稳定版或更高版本。

此库为webview的原始实现提供Rust绑定,webview是一个小巧的跨平台库,可以将基于Web的GUI渲染为桌面应用程序。

screenshot

通过外部JS对象和webview.eval Rust函数,您的Rust和JavaScript代码之间的双向绑定变得简单。我们有一些工作示例,但核心如下

// ... Simplified for the sake of brevity.
web_view::builder()    
    .invoke_handler(|webview, arg| {
        match arg {
            "test_one" => {
                // Do something in Rust!
            }
            "test_two" => {
                // Invoke a JavaScript function!
                webview.eval(&format!("myFunction({}, {})", 123, 456))
            }
            _ => unimplemented!(),
        };
    })
// Executes our "invoke_handler" - passing the value "test_one" as the second parameter.
external.invoke('test_one');

// Executes our "invoke_handler", which in turn calls "myFunction" below.
external.invoke('test_two');

function myFunction(paramOne, paramTwo) {
    console.log(paramOne);
    console.log(paramTwo);
}

此外,通过依赖宿主操作系统的默认渲染引擎,您应该会遇到一个比像Electron这样的替代方案更瘦的二进制文件,这些替代方案需要将Chromium捆绑到每个分发中。

您还应看到相对较低的内存使用量,本节将在适当的时候通过基准测试来强调这一点。

最后,支持的平台和您预期可以渲染应用程序内容的引擎如下

操作系统 使用的浏览器引擎
Windows MSHTML或EdgeHTML
Linux Gtk-webkit2
OSX Cocoa/WebKit

注意:默认情况下,Windows 上使用 MSHTML (IE) 渲染引擎来显示应用程序。如果您想使用 EdgeHTML (Edge),则需要通过功能开关启用它(参见安装和配置部分)。

先决条件

如果您计划针对 Linux,您必须确保已经安装并可通过 pkg-config 命令发现 Webkit2gtk

如果您跳过此步骤,您将看到以下类似格式的错误消息,告知您缺少什么

Compiling webview-sys v0.3.3
error: failed to run custom build command for `webview-sys v0.3.3`
Caused by:
process didn't exit successfully: `/home/username/rust-projects/my-project/target/debug/build/webview-sys-9020ddaf41e4df7d/build-script-build` (exit code: 101)
--- stderr
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Command { command: "\"pkg-config\" \"--libs\" \"--cflags\" \"webkit2gtk-4.0\" \"webkit2gtk-4.0 >= 2.8\"", cause: Os { code: 2, kind: NotFound, message: "No such file or directory" } }', src/libcore/result.rs:1165:5

安装和配置

让我们从基本的 Rust 应用程序开始。在您选择的壳中运行 cargo new my-project 并切换到 my-project 目录。

由于此库可以在 Rust 社区注册表 中找到,因此您要添加此依赖项,只需更新您的 Cargo.toml 文件,在依赖项部分包含以下内容

[dependencies]
web-view = { version = "0.7" }

如果您想在 Windows 环境中使用 Edge,您需要通过 Visual Studio 安装程序安装 Windows 10 SDK,并使用以下语法

[dependencies]
web-view = { version = "0.7", features = ["edge"] }

现在让我们编写一些使用库的 Rust 代码。使用您选择的编辑器打开 main.rs 文件

vim src/main.rs

并将内容替换为以下内容

use web_view::*;

fn main() {
    let html_content = "<html><body><h1>Hello, World!</h1></body></html>";
	
    web_view::builder()
        .title("My Project")
        .content(Content::Html(html_content))
        .size(320, 480)
        .resizable(false)
        .debug(true)
        .user_data(())
        .invoke_handler(|_webview, _arg| Ok(()))
        .run()
        .unwrap();
}

现在您应该能够运行 cargo build 并看到以下类似的输出

$ cargo build
Updating crates.io index
Compiling pkg-config v0.3.17
Compiling cc v1.0.47
Compiling boxfnonce v0.1.1
Compiling urlencoding v1.0.0
Compiling webview-sys v0.3.3
Compiling web-view v0.5.4
Compiling my-project v0.1.0 (C:\Users\Username\source\rust-projects\my-project)
Finished dev [unoptimized + debuginfo] target(s) in 8.36s

假设您构建成功,现在您只需运行它:cargo run。希望您能看到以下相同的输出

screenshot

有关更多信息,请参阅示例原始 README

已知问题和限制

  • Edge 功能开关在 Windows 10 上如果以 Administrator 运行则不起作用。这是#96 中提出的问题的根本原因,是 Microsoft.Toolkit.Win32 中的一个错误,该错误在这里被跟踪。

  • Edge 沙盒限制。如果您决定使用嵌入式 Web 服务器来返回内容,您需要运行以下命令来绕过阻止与 localhost 通信的限制

    $ # Requires administrative privileges.
    $ CheckNetIsolation.exe LoopbackExempt -a -n="Microsoft.Win32WebViewHost_cw5n1h2txyewy"
    

    这通常用于 Windows IoT Core,当允许两个进程之间的 TCP/IP 连接时。您可以在Microsoft 文档中了解更多关于此的信息。

  • IE 在兼容性格式中渲染内容。默认情况下,在 Web 浏览器控件中渲染的内容将在兼容性模式下完成(特别是 IE7)。要在没有 Edge 的 Windows 系统上解决这个问题,您可以通过注册表调整强制使用安装的最高版本 IE。

建议

  • 如果您喜欢类型安全,请使用 ElmPureScript* 编写前端,或者使用编译为 asm.js 的 Rust 前端框架,例如 yew
  • 使用 parcel 打包并压缩您的前端代码。
  • 使用 inline-assets 将所有资源(css、js、html)内联到一个 index.html 文件中,并使用 include_str!() 在您的 Rust 应用中嵌入。
  • 如果您的应用程序在 Windows 上运行,请 添加图标,使它看起来更专业™
  • 使用自定义 npm 脚本或 justcargo-make 来自动化构建步骤。
  • 使用前端中的 localStorage 或后端中的 rustbreak 在会话之间持久化应用程序状态。
  • 顺便说一下,您也可以通过本地 http 服务器(例如绑定到临时端口)提供应用程序资源,而不是通过 js api 注入应用程序资源。
  • 祝您编码愉快 :)

* 免费的 PureScript By Example 书籍包含几个适用于 PureScript 初学者的实用项目。

贡献机会

  • 为任何问题创建一个问题
  • 文档
  • 对此库的 API 和代码的反馈
  • 在非 Windows 平台上测试它,报告您发现的任何问题
  • 展示您的应用程序
  • 添加一个使用 Elm 或 Rust 编译为 asm.js 的示例
  • 添加一个与后端双向通信的 PureScript 示例
  • 为原始 webview 库做出贡献:例如,在 Windows 上添加 HDPI 支持
  • 使创建的 webview 窗口成为给定父窗口的子窗口成为可能。这将使 webview 能够用于 Rust 中的 VST 音频插件的 GUI(Rust)。

应用程序想法

  • Rust IDE(通过将 xi-electron 端口到 web-view)
  • 用于 Rust 的数据可视化/绘图库,使 Rust 更适用于数据科学
  • 加密货币钱包
  • IRC 客户端或其他聊天协议的客户端
  • Midi 歌曲编辑器,VJ 控制器
  • Rust 项目模板向导:通过用户友好的步骤从模板生成新的 Rust 项目
  • pijul 的 GUI
  • 使用 web-viewclap-rs 实现 Gooey 的替代方案

展示

如果您想在此处列出您的项目,请随时提交 PR!

  • Juggernaut - 无坚不摧的程序员编辑器
  • FrakeGPS - 模拟简单的 GPS 设备
  • Compactor - Windows 10 文件系统压缩工具
  • neutrino - 基于 web-view 的 Rust GUI 前端
  • SOUNDSENSE-RS - Dwarf Fortress 的音效工具
  • WV Linewise - 在您的 UNIX 管道中添加自己的交互式 HTML/CSS/JS
  • Bloop - 开发者的轻量级美学记事本

欢迎贡献和反馈 :)



lib.rs:

webview的原始FFI绑定。

要使用自定义版本的webview,请定义一个环境变量WEBVIEW_DIR,其值为源代码目录的路径。

依赖项

~0–1.2MB
~22K SLoC