【译】探索更轻量的Electron替代品来托管Blazor桌面应用程序

本文翻译自 ASP.NET 项目组的 Steve Sanderson 的博客,发表于 2019 年 11 月 1 日。Steve Sanderson 是 Blazor 最早的创造者。这篇文章发布后还有一篇后续,是介绍一个在本文提到的跨平台 webview 概念的落地项目 WebWindow ,我也会接着翻译过来。


我们能否以更少的资源消耗,获得 Electron 的利用 web 技术构建的桌面应用程序的优势?

Electron 在 2014 首次开源,作为一种使用 Web 技术(HTML+CSS+JS)构建桌面应用程序的方式,它迅速流行起来。其设计的核心思想是将可预测的环境捆绑在一起:

  • 它捆绑了自己的 Chromium 副本, 因此,你可以确定你的 HTML/CSS 将如何被渲染,不必担心 IE 浏览器(等) 随机的旧版本。

  • 它捆绑了自己的 Node.js 副本, 因此,你拥有已知的一个可移植编程平台的版本,它超越了浏览器沙箱,可以直接与本机系统交互。

这些选择在五年前很有价值,但到了 2019 年底,你可能会做出不同的选择。这些选择也是为什么 Electron 对资源极度渴求却也会闻名的关键。默认的空白 Electron 8.0.0 应用程序需要下载 164MB(压缩后 66MB),并作为 4 个单独的进程运行,总共消耗 150MB。

这些数字在您看来完全可以满足您的场景。如果是这样,那太好了!这篇文章并不是要抨击 Electron,它是一个运行良好的项目,人们显然已经成功地使用了它。在这篇文章中,我只是想思考一下我们还有什么其他的选择。

它能有多轻?

假如...

  • ...我们没有绑定 Chromium, 而是使用了操作系统中已经存在的 webview?到了 2019 年,几乎所有的桌面操作系统都将拥有一个足够现代的、通常基于 Chromium 的浏览器可以拿来即用。对于你的应用程序来说,它是上周的 Chromium 还是去年的都不重要。

  • ... 我们没有绑定 Node, 而是使用了操作系统中已经存在的编程环境,或者选择引入一个不同的?一个框架相关的 .NET Core 应用程序的大小可以很容易地在 1MB 以下,而一个独立的 .NET Core 应用程序(即绑定了自己的 .NET Core 副本)经链接和压缩后可以减少到约 20MB。

各种 Electron 的轻量替代项目已经如雨后春笋般涌现出来[1]。当然,也包括 PWA,但这不是这篇文章的目的,因为 PWA 不能进行对底层操作系统的本机访问。

Electron 上的 Blazor

我们对使用 Blazor 构建跨平台的桌面应用程序很感兴趣。这并不奇怪:将 C#/.NET 的性能和生产率,与熟悉的 HTML/CSS UI 渲染结合在一起是强大的和有吸引力的。

因此,我们发布了一个示例和一个实验性的包来托管 Electron 上的 Blazor[1]。这里的关键创新之处在于它不是运行在 WebAssembly 上,而是使用普通的跨平台的 .NET Core 运行时来实现完全的原生 .NETb 性能,并在不受任何浏览器沙箱限制的情况下完全访问本机操作系统。

你今天可以试试。但要注意,这只是一个“asplabs”项目,因为我们还没有作出任何承诺,以推出和支持这项技术。

纯 webview 上的 Blazor

不难想象,一个 Blazor 混合桌面应用程序将如何进一步大幅减小体积。我们可以用一个纯粹的系统原生的 web view 替换掉 Electron,因为在 2019 年,在你的目标机器上总会有一个足够好的来用的。另外,我们并不需要 Node 作为跨平台的编程环境,因为 .NET Core 已经为我们扮演了这样的角色。

为了验证这一点,我构建了 一项名为 BlazorDesktop 的实验[2]。这与 BlazorElectron[3] 非常相似,实际上大部分代码都是复制粘贴过来的。同样,它运行在原生的 .NET Core 上(所以不是在 WebAssembly 上),但是现在它运行在一个更小的渲染堆栈上,没有任何的 Chromium 或 Node.js 绑定。

这是一个功能齐全的 Blazor 应用程序,你可以在其中添加任何基于 .NET Core 的原生功能,并作为一个非常轻量级的桌面应用程序运行——具体数字见下文。与 PWA 不同,它不局限于浏览器沙箱。

如果您有兴趣尝试一下,请注意这只是一个概念验证,目前仅适用于 Windows。将其扩展为跨平台并不难(我将使用诸如 webview 之类的东西来添加 Mac+Linux 支持),但是我现在还没有在积极地做这件事。如果您感兴趣,请提交一份 PR。

统计数据

毫不奇怪,这个最小的 Blazor + webview 应用程序比构建在整个 Chromium + Node 技术栈上的应用程序要小得多,也不需要太多内存:

.NET Core 的好处之一是,通过一个简单的开关,您可以控制生成的输出是否绑定了它自己的 .NET Core 运行时副本(也称为独立的),或者它是否假设运行时已经安装在目标 OS 上(也称为依赖于框架)。在上面的第一个图中可以看到这一点,您可以看到它对输出大小有很大的影响,因为 Blazor 库本身非常紧凑。

在企业环境中,如果您知道已经安装了某些软件,那么可以安全地分发与框架相关的小于 1MB 的应用程序,其中相同的二进制文件可以在任何受支持的操作系统上运行。但是对于公共发行版,您很可能会发布一个独立的应用程序——为每个 Windows、Mac 和 Linux 用户分别生成不同的二进制文件。

请注意,上述压缩的 Blazor webview 应用程序大约有 200KB 的大小,其中还包含了 Bootstrap 样式,因此如果您正在使用其他的则可以删除它。

需要做什么才能使其可行

正如我所说的,Blazor Desktop 目前只是一个快速的概念验证,完全是在我从 NDC Sydney[4] 返回的旅途中开发的。要成为可行的产品还有很长的路要走。

它需要:

  • 跨平台支持, 例如使用 webview

  • Edge (Chromium) 支持,因此,在 Windows 10 上,我们使用的是操作系统自己的基于 Chromium 的浏览器,而不是我的原型中使用的基于 Edge 的 webview。

  • 处理找不到合适的 webview 的情况。在极少数情况下,用户的操作系统没有提供可接受的 webview 技术,我们可以提示用户并下载一个独立的 Chromium 发行版(可能通过 CEF)。

  • 桌面 API ——一个重大的需求,需要付出高成本地从零开始实现。Electron 不只是使用 Node 作为通用的编程环境;它还提供了一组跨平台的 api,用于与桌面操作系统进行交互,执行诸如复制到剪贴板、更改任务栏或 dock 图标、显示本机下拉菜单、显示本机提示或对话框等任务。.NET Core 本身提供了大量应用程序需要的 API,但是目前它并没有解决很多桌面应用的问题,因为现在还没有任何标准的基于.NET Core 的跨平台 UI 技术。但是任何实际的应用程序都需要这些功能。可以想象,仅仅为了获得这些 API 的跨平台实现而绑定 Node 也是值得的(但仍然不绑定 Chromium)。

  • 自动发布和下载更新

反馈要求

我写这篇文章的原因主要是为了更多地了解开发人员社区对这些技术的感受。你有使用 .NET+HTML+CSS 构建混合桌面应用程序的场景吗?你会乐意将 Blazor 与 Electron 一起使用,还是认为有必要更轻量?

注脚:现有的 Electron 替代品

多年来,许多人都在考虑制造更轻的 Electron 替代品。现在有各种各样的开源项目,尽管还不清楚是否有关键的真正去大规模采用的动力。其中一些,如 Chromely[5],移除了 Node,只捆绑了 Chromium。其他的,如 Neutralino[6],则消除了 Chromium,只将基于 Node 的编程模型与本机操作系统的浏览器技术捆绑在一起。在最基本的方面,webview[7] 只是对 webview 概念的一个抽象:它以构建在主机操作系统中的任何浏览器技术来显示 HTML/CSS,并且不提供任何自己的跨平台编程模型。


本文翻译自:https://blog.stevensanderson.com/2019/11/01/exploring-lighter-alternatives-to-electron-for-hosting-a-blazor-desktop-app/

参考资料

[1]

一个示例和一个实验性的包来托管 Electron 上的 Blazor: https://github.com/aspnet/AspLabs/tree/master/src/ComponentsElectron

[2]

一项名为 BlazorDesktop 的实验: https://github.com/steveSandersonMS/BlazorDesktop

[3]

BlazorElectron: https://github.com/aspnet/AspLabs/tree/master/src/ComponentsElectron

[4]

NDC Sydney: https://ndcsydney.com/

[5]

Chromely: https://github.com/chromelyapps/Chromely

[6]

Neutralino: https://github.com/neutralinojs/neutralinojs

[7]

webview: https://github.com/zserge/webview

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

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

相关文章

MATLAB-矩阵基本语法知识

数组创建 1.要创建每行包含四个元素的数组,请使用逗号 (,) 或空格分隔各元素。 这种数组为行向量。 要创建包含多行的矩阵,请使用分号分隔各行。 a [1 2 3; 4 5 6; 7 8 10] 2.创建矩阵的另一种方法是使用 ones、zeros 或 rand 等函数。例如&#x…

mysql 剔除不可见字符_不可见字符,Excel里最隐蔽的坑

小伙伴们好啊,我是流浪铁匠,今天为大家介绍的是excel数据整理时一类最常见的坑——不可见字符。从unichar函数对应的uincode字符集结果来说,excel大约有111万个字符,其中有不少字符的性质千奇百怪,由于unichar/unicode…

同为Chromium浏览器,Edge却被“特别关照”

谷歌会在 Microsoft Edge 用户访问 Chrome Web Store(Chrome 网上应用商店) 时发去一条通知提醒,建议用户切换到 Google Chrome 以安全地使用扩展程序,通知还提供了下载 Google Chrome 的链接。不过有趣的是,其他 Chro…

数据结构-查找-总结归纳知识点

//第八章 查找 //基于线性表的查找 // 1.顺序查找法 //思想:所给的关键字和表中元素的关键字逐个比较 分为:设置监视哨和不设监视哨 监视哨:r[0]防止越界 //2.折半查找法 要求:顺序储存结构(不能链表),按照关键字大小有序排列(正序和逆序) 思想:利用mid(highlow)/2(整数). …

噪声与振动控制工程手册_声学分享客噪声与振动控制篇大型隔振工程案例介绍...

第一期《声学分享客--噪声与振动控制篇》将于今日上午10:00~11:00,在线直播,欢迎各位上线交流。主讲人:苏宏兵报告内容:大型隔振工程案例介绍报告人介绍:苏宏兵,工学硕士&#xff0c…

微软推出全新的Windows 10系统图标

微软已开始通过 Fast Ring 向 Insider 用户推出新的 Windows 10 系统图标,这些新图标基于 Fluent 设计。更改从邮件和日历等程序开始,微软将陆续推出更多彩色图标。这些图标将在接下来的几个月中通过 Microsoft Store 的应用更新和 Windows 10 的发布预览…

python123读取文本文件并排序输出_Python按字段对文本文件排序

按某个字段对文本文件中的数据进行排序时遇到问题。以后可能会有多个字段。txt是数千行代码。我是python新手,所以我的代码可能有点混乱。例如,这是我将从中读取的文本文件:stuff123 1200 id-aaaa stuarttest.com322 1812 id-wwww machine-sw…

.NET Core开发实战(第9课:命令行配置提供程序)--学习笔记

09 | 命令行配置提供程序:最简单快捷的配置注入方法这一节讲解如何使用命令行参数来作为配置数据源命令行配置(提供程序的)支持三种格式的命令1、无前缀的 keyvalue 模式2、双中横线模式 --keyvalue 或 --key value3、正横杠模式 /keyvalue 或…

数据结构-第九章 内部排序-知识点总结1

第九章 内部排序 排序:重点在于对于记录的关键字进行排序,得到按关键字有序记录序列 分为: A.内部排序: 排序过程在内存中进行 B.外部排序: 待排序记录数据量过大,需要借助外部存储设备 排序的稳定性:排序后有相同关键字的记录顺序不变就是稳定的排序 插入类排序: 1…

python文本替换 数据库_在Python中使用ASCII文件中的注释查找/替换子...

在我正在研究的生物信息学项目中,我遇到了一些编码问题.基本上,我的任务是从数据库中提取基序序列并使用该信息来注释序列比对文件.对齐文件是纯文本,因此注释不会是任何复杂的,最好只是用对齐文件本身中的星号替换提取的序列.我有一个脚本扫描数据库文件,提取我需要的所有序列…

gRPC in ASP.NET Core 3.x - gRPC 消息定义

之前写了几篇关于 Protoco Buffer 的文章。gRPC in ASP.NET Core 3.x - gRPC 简介(1)gRPC in ASP.NET Core 3.x - gRPC 简介(2)当gRPC使用Protocol Buffer作为传输协议的时候,Protocol Buffer里所有的规则仍然都适用。…

哈希表创建哈希表(Hash Table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构.typedef enum{ HASH_OK-icoding-数据结构-C

哈希表创建 typedef enum{HASH_OK,HASH_ERROR,HASH_ADDED,HASH_REPLACED_VALUE,HASH_ALREADY_ADDED,HASH_DELETED,HASH_NOT_FOUND, } HASH_RESULT; typedef struct __HashEntry HashEntry; struct __HashEntry{union{char *str_value;double dbl_value;int int_value;}…

10个用于C#.NET开发的基本调试工具

在调试软件时,工具非常重要。获取正确的工具,然后再调试时提取正确的信息。根据获取的正确的错误信息,可以找到问题的根源所在。找到问题根源所在,你就能够解决该错误了。你将看到我认为最基本的解决在C# .NET 中错误问题的工具的…

python面向对象语言_Python语言基础之——面向对象编程

1.类属性1)类属性:直接定义在类中的变量是类属性类属性的值不会因为对象不同而不一样2)对象属性通过 self.属性名 值 定义在init函数中的属性对象属性的值会因为对象不同而不一样2.对象属性的增删改查1.查对象.属性 - 获取对象中指定属性对应的值,属性不存在会报错…

[蓝桥杯2015初赛]移动距离

题目描述 X星球居民小区的楼房全是一样的,并且按矩阵样式排列。 其楼房的编号为1,2,3… 当排满一行时,从下一行相邻的楼往反方向排号。 比如:当小区排号宽度为6时,开始情形如下: 1 2 3 4 5 6 12 11 10 9 8 7 13 14 15 …