【译】来看看WebWindow,一个跨平台的.NET Core webview 库

本文翻译自 ASP.NET 项目组的 Steve Sanderson 的博客,发表于 2019 年 11 月 18 日。Steve Sanderson 是 Blazor 最早的创造者。


它类似于 Electron,但没有捆绑 Node.js 和 Chromium,也没有大部分 API。

我的上一篇文章研究了如何用 web 渲染的 UI 构建一个 .NET Core 桌面或控制台应用程序,而不需要引入全部的 Electron 部件。这似乎引起了很多人的兴趣,所以我决定将其升级到新的技术并添加跨平台支持。

最终成果是一个名为 WebWindow[1] 的小 NuGet 包,你可以将它添加到任何 .NET Core 控制台应用程序中。它可以打开一个包含基于 web 的 UI 的本机操作系统窗口(Windows/Mac/Linux),而无需您的应用程序绑定 Node 或 Chromium。

我还把它和 Blazor 解耦了。您现在可以在窗口内托管任何类型的 web UI。repo 中包含一个使用 Vue 的示例,还有一个使用了 Blazor。

注意: 这个库是超前 alpha 质量的。如果你想用它来构建一些真实的东西,请看这篇文章末尾的注释。到目前为止,这只是另一个原型。

“Hello World” 示例

创建一个新的 .NET Core 3 C# 控制台应用程序,然后添加一个引用到 WebWindow NuGet 包:

<ItemGroup><PackageReference Include="WebWindow" Version="0.1.0-20191120.3" />
</ItemGroup>

接下来,将代码添加到 Program 类中的 Main 方法。

static void Main(string[] args)
{var window = new WebWindow("My super app");window.NavigateToString("<h1>Hello, world!</h1> This window is from a .NET Core app.");window.WaitForExit();
}

这样就完成了!现在根据你运行的操作系统,你的应用程序会显示如下窗口:

这个示例使用 NavigateToString(html) 从硬编码的 .NET 字符串渲染 HTML。你也可以:

  • 使用 NavigateToUrl(url) 来显示来自 HTTP 服务器的内容(本地或远程)

  • 使用 NavigateToLocalFile(path) 来显示来自本地磁盘的 HTML 文件,其中 path 是绝对路径或相对于当前工作目录的路径。示例在这里[2]

作为一个稍微高级一些的选项,您可以配置 WebWindow 来处理自定义协议,如 myapp://,并指定一个委托(回调),它可以为该协议中的每个 URL 返回任意内容。示例在这里[3]和这里[4]

一旦您的 web 内容正在运行,JavaScript 和 .NET 之间的底层通信方式就是在 JS 中使用 window.external.sendMessage/receiveMessage API(示例[5])和在.NET 中使用 webWindowInstance.SendMessagewebWindowInstance.OnWebMessageReceived API -(示例[6])。但是,如果您正在构建一个 Blazor 应用程序,则不需要使用这些底层 API,而可以使用 Blazor 常规的 JS 互操作特性。

托管一个 Blazor 应用程序

WebWindow 并没有与 Blazor 耦合。这里是一个使用 Vue.js 在 WebWindow 内呈现一个简单的目录资源管理器应用程序的例子[7]

但如果你真的想用 Blazor,那是非常整洁和简单的。我还做了一个小插件包,WebWindow.Blazor[8],它可以让你在你的 Program.Main 中只用一行代码就能运行一个 Blazor 应用程序。

static void Main(string[] args)
{ComponentsDesktop.Run<Startup>("My Blazor App", "wwwroot/index.html");
}

概括地说,这 并不 涉及 WebAssembly、Node.js 或者是一份私有绑定的 Chromium。它只是在本地运行 .NET Core,直接与操作系统自己的 web 渲染技术进行通信。这一次在 macOS 上的运行结果是:

完整的 WebWindow+Blazor 示例在这里[9]

他是如何工作的

  • Windows 上,WebWindow 通过 `webview2` 使用新的基于 Chromium 的 Edge[10],假设你已经安装了那个浏览器(如果你不安装,它可能会退回到旧的 Edge,但我还没有实现)

  • Mac 上,它使用了操作系统内置的WKWebView[11],这与 Safari 背后的技术相同

  • Linux 上,它使用了 WebKitGTK+2[12],这也是一种基于 WebKit 的技术

这一切的关键在于,与使用 Electron 相比,开发出下载体积更小和内存使用更少的应用程序。但事实果真如此吗?以下是下载大小的统计数据:

正如您所看到的,无论您选择“独立”(捆绑了.NET Core 运行时的一个副本)还是“依赖于框架”(依赖于已安装在目标系统中的 .NET Core),都会对最终的应用程序大小产生巨大的影响。依赖于框架的 WebWindow 应用程序真的可以很小,因为它们只包含您自己的应用程序的二进制文件,并且没有捆绑运行时或浏览器。

接下来,是内存使用统计:

在 Windows 上,WebWindow 和 Electron 使用的是相同的浏览器技术(Chromium),这种技术占用了大部分内存。这就解释了为什么他们之间的差异并不是很大。在 Linux 和 Mac 上,使用自绑定浏览器(指 Electron)与使用操作系统内置技术之间的区别更为明显。

这个项目会得到支持和维护吗?

目前我还没有做出任何承诺!现在最好把它看作是另一个实验。如果有足够多的人想参与进来,就有可能创建一个合适的开源社区项目。

最迫切需要的是有 C++ 经验的人来重写我的原型质量的 C++ 和 Objective-C 代码,使其真正完善。我已完成所有内存管理的概率接近于 0。也许它也应该使用 CMake 或其他健全的构建配置系统。(注意:它确实有一个基于 Azure DevOps 的跨平台 CI[13]。)

如果您打算在生产中使用它,那么您还需要添加大量的特性。例如,设置应用程序图标、添加本地菜单栏等功能。如果您有兴趣贡献这样的功能,并将使其跨平台工作,请来这个 repo[14]


本文翻译自:https://blog.stevensanderson.com/2019/11/18/2019-11-18-webwindow-a-cross-platform-webview-for-dotnet-core/

参考资料

[1]

WebWindow: https://www.nuget.org/packages/WebWindow

[2]

示例在这里: https://github.com/SteveSandersonMS/WebWindow/blob/a01537a9328b085075866a965191d6323ad2cf7d/samples/HelloWorldApp/Program.cs#L11

[3]

这里: https://github.com/SteveSandersonMS/WebWindow/blob/a01537a9328b085075866a965191d6323ad2cf7d/testassets/HelloWorldApp/Program.cs#L14

[4]

这里: https://github.com/SteveSandersonMS/WebWindow/blob/a01537a9328b085075866a965191d6323ad2cf7d/testassets/HelloWorldApp/wwwroot/index.html#L11

[5]

示例: https://github.com/SteveSandersonMS/WebWindow/blob/a01537a9328b085075866a965191d6323ad2cf7d/testassets/HelloWorldApp/wwwroot/index.html#L14-L20

[6]

示例: https://github.com/SteveSandersonMS/WebWindow/blob/a01537a9328b085075866a965191d6323ad2cf7d/testassets/HelloWorldApp/Program.cs#L21-L24

[7]

使用 Vue.js 在 WebWindow 内呈现一个简单的目录资源管理器应用程序的例子: https://github.com/SteveSandersonMS/WebWindow/tree/master/samples/VueFileExplorer

[8]

WebWindow.Blazor: https://www.nuget.org/packages/WebWindow.Blazor

[9]

WebWindow+Blazor 示例在这里: https://github.com/SteveSandersonMS/WebWindow/tree/master/samples/BlazorDesktopApp

[10]

通过 webview2 使用新的基于 Chromium 的 Edge: https://docs.microsoft.com/en-us/microsoft-edge/hosting/webview2

[11]

WKWebView: https://developer.apple.com/documentation/webkit/wkwebview

[12]

WebKitGTK+2: https://webkitgtk.org/

[13]

基于 Azure DevOps 的跨平台 CI: https://dev.azure.com/SteveSandersonMS/WebWindow/_build?definitionId=2

[14]

来这个 repo: https://github.com/SteveSandersonMS/WebWindow

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql if 和insert_拼多多面试:Mybatis是如何实现SQL语句复用功能的?

在工作中&#xff0c;往往有这样的需求&#xff0c;对于同一个sql条件查询&#xff0c;首先需要统计记录条数&#xff0c;用以计算pageCount&#xff0c;然后再对结果进行分页查询显示&#xff0c;看下面一个例子。<sql id"studentProperties"><!--sql片段-…

代码演示C#各版本新功能

代码演示C#各版本新功能C#各版本新功能其实都能在官网搜到&#xff0c;但很少有人整理在一起&#xff0c;并通过非常简短的代码将每个新特性演示出来。代码演示C#各版本新功能C# 2.0版 - 2005泛型分部类型匿名方法可以为null的值类型迭代器协变和逆变C# 3.0版 - 2007自动实现的…

《C++ Primer》1.52节练习

练习1.23 #include <iostream> #include "Sales_item.h"using namespace std;int main() {Sales_item trans1, trans2;cout << "请输入若干销售记录:" << endl;if (cin >> trans1) {int num 1;while (cin >> trans2)if (t…

ASP.NET Core 反向代理部署知多少

引言最近在折腾统一认证中心&#xff0c;看到开源项目[IdentityServer4.Admin&#xff1a;https://github.com/skoruba/IdentityServer4.Admin]集成了IdentityServer4和管理面板&#xff0c;就直接拿过来用了。在尝试Nginx部署时遇到了诸如虚拟目录映射&#xff0c;请求头超长、…

函数传参string_JavaScript 高阶函数入门浅析

原文&#xff1a;https://www.freecodecamp.org/news/a-quick-intro-to-higher-order-functions-in-javascript-1a014f89c6b/译者&#xff1a;jingruzhang校对者&#xff1a;acusp高阶函数高阶函数可以接收函数作为参数&#xff0c;同时也可以返回一个新的函数。高阶函数之所以…

.NET Core开发实战(第13课:配置绑定:使用强类型对象承载配置数据)--学习笔记...

13 | 配置绑定&#xff1a;使用强类型对象承载配置数据要点&#xff1a;1、支持将配置值绑定到已有对象2、支持将配置值绑定到私有属性上继续使用上一节代码首先定义一个类作为接收配置的实例class Config {public string Key1 { get; set; }public bool Key5 { get; set; }pub…

工业互联网白皮书_发布|《工业互联网平台安全白皮书(2020)》发布

12月4日&#xff0c;2020年中国工业信息安全大会暨全国工控安全深度行(京津冀站)在北京国际会议中心举行。大会由国家工业信息安全发展研究中心、工业信息安全产业发展联盟主办&#xff0c;以“贯彻总体国家安全观&#xff0c;把牢工控安全基准线”为主题。会上&#xff0c;国家…

ASP.NET Core Razor 视图预编译、动态编译

0x01 前言ASP.NET Core在默认发布情况下&#xff0c;会启动预编译将试图编译成xx.Views.dll,也许在视图中打算修改一处很细小的地方我们需要再重新编译视图进行发布。下面我将从 ASP.NET Core 3 之前版本到 ASP.NET Core 3X 之后版本的一个配置列下下方供大家参考。0x02 预编译…

《C++ Primer》2.1.2节练习

练习2.3 #include <iostream> using namespace std;int main() {unsigned u 10, u2 42;cout << u2 - u << endl;cout << u - u2 << endl;int i 10, i2 42;cout << i2 - i << endl;cout << i - i2 << endl;cout <…

如何构建基于.NET Core和云环境下的微服务技术体系?

这个内核用处不大&#xff0c;但.NET 内核却666随着业务需求的增长&#xff0c;我们现在开发非常大型和复杂的项目&#xff0c;需要更多时间来构建和部署。每当质量检查报告任何问题时&#xff0c;我们都需要对其进行调试或修复&#xff0c;然后部署整个代码。为了降低这些复杂…

UVA - 11059 Maximum Product-暴力枚举

输入n个元素组成的序列s,找出一个乘积最大的连续子序列&#xff0c;如果这个子序列不是整数&#xff0c;则输出0. 解题思路&#xff1a; 枚举起点和终点&#xff0c;把中间的数相乘&#xff0c;然后找到最大的结果。 代码如下&#xff1a; #include <iostream> using…

好用的vp n推荐2020_哪个牌子的沐浴露好,2020年最新沐浴露选购测评,好用好闻易清洗沐浴露品牌推荐...

您好&#xff0c;感谢您关注并阅读本文。声明&#xff1a;本文系作者原创&#xff0c;未经作者授权不得转载、引用。如果您看完本文觉得对您有帮助&#xff0c;请点赞、收藏和关注&#xff0c;作者感激不尽。本文详细地介绍一下沐浴露使用方法和选购建议指南&#xff0c;以及沐…

【朝夕Net社区技术专刊】Core3.1 WebApi集群实战专题---WebApi环境搭建运行发布部署篇...

欢迎大家阅读《朝夕Net社区技术专刊》第1期我们致力于.NetCore的推广和落地&#xff0c;为更好的帮助大家学习&#xff0c;方便分享干货&#xff0c;特创此刊&#xff01;很高兴你能成为首期读者&#xff0c;文末福利不要错过哦&#xff01;本文通过5大部分进行解读&#xff1a…

【朝夕Net社区技术专刊】Core3.1 WebApi集群实战专题-Corre3.1WebApi配置集成日志/配置Swagger...

欢迎大家阅读《朝夕Net社区技术专刊》第2期我们致力于.NetCore的推广和落地&#xff0c;为更好的帮助大家学习&#xff0c;方便分享干货&#xff0c;特创此刊&#xff01;很高兴你能成为首期读者&#xff0c;文末福利不要错过哦&#xff01;本文通过3大部分进行解读&#xff1a…

一文读懂开源许可证异同

对开源许可证异同的对比并非源自担忧。对开源许可证进行比较并不容易&#xff0c;什么 copyleft 啦&#xff0c;什么宽松许可证啦&#xff0c;光 GNU 就有 GPL 2 和 GPL 3 之分&#xff0c;OSI 批准的许可证就有八十多个&#xff0c;而开源生态下存在了数百个许可证。对于我们这…

WARNING: Ignoring invalid distribution -ip

原因: 之前安装插件失败/中途退出&#xff0c;导致插件安装出现异常导致 解决方案: 进入你的项目里面,进入venv文件夹,进入Lib,进入site-packages,删除~ip开头的文件如图所示

根据后序和中序求二叉树的层序

题目描述&#xff1a;给出二叉树的后序和中序序列&#xff0c;输出二叉树的层序遍历序列。 题目分析&#xff1a;中序遍历为左根右&#xff0c;后序遍历为左右根&#xff0c;所以后序遍历的最后一个节点为根节点&#xff0c;在中序遍历上找出根节点的位置&#xff0c;将树分为…