返回 登录
1

.NET和WebAssembly——这会是前端的未来吗?

原文:.NET and WebAssembly - Is this the future of the front-end?
作者:Scott Hanselman
翻译:Diwei

译者注:作者在本文详细介绍了.NET是如何与WebAssembly进行结合的,描绘了一幅前端世界美好的蓝图。以下为译文。

6年前,Erik Meijer和我谈论了JavaScript是如何成为一种汇编语言的。最终这个话题变成了一个有趣的讨论/争论(有些人不这么觉得),但是辩论还是在继续发生着。目前,WebAssembly正在向前发展,已经可以支持Chrome、Firefox了,而且还支持在Edge、Opera和Safari中进行开发。

在2017年的今天,WebAssemblyy绝对是一件值得关注的事情,你可以在http://webassembly.org上对它进行了解。我甚至和Mozilla同事David Bryant一起做了一个关于WebAssembly的播客(你真的应该看看我的播客,我为它感到骄傲。做的真的很好。)



上面的图片来自于Steve Sanderson的NDC演示。他正在开发的应用就属于典型的客户端JavaScript ToDo应用,只有一点比较例外,就是他是用C#写的代码。

WebAssembly是什么?

webassmbly或wasm是一种低级的字节码格式,用于浏览器的客户端脚本,由JavaScript演变而来。”现在你可以很容易地从C和C++编译成WebAssmbly。每天都有更多的语言把WebAssmbly包含进来作为目标。

因为我在开源.NET里面工作,而且即将发布的.NET Core 2.0是支持跨平台的,所以我认为很值得探索WebAssmbly与.NET是在哪里开始融合的。

以下是一些我认为有助于在.NET和WebAssembly之间架起桥梁的项目。我认为在接下来的18个月时间里这些都会是热门领域

适用于.NET的WEBASSEMBLY

忽略它的名字,这个OSS项目的目的是为了消耗WASM二进制文件,并从.NET程序集中执行它们。需要澄清的是,这不是为了把.NET语言(C#, VB.NET, F#)给编译到WebAssembly里,而是为了使用WebAssembly。你一直想得到一个从.NET的调用中得到的已存在的WASM文件吗?这个就是。

有趣的是,这个项目并没有启动V8或Chakra JavaScript引擎来运行WASM,相反,而是用字节码对它进行读取,然后通过System.Reflection.Emit把它们给转换成.NET。

MONO和WEBASSEMBLY

.NET生态系统里面发生了一件很伟大的事情,就是现在已经有不止一个”.NET”了。过去.NET是只安装在Windows上的,这一点很多人都挺担心的。现在基本上每台Windows机器上面都会安装.NET 4.x+,而且还有了可以在Docker,在Mac、Windows和Linux平台上运行的.NET Core。即使是Raspberry Pi,现在也有了Mono,它是.NET的另外一种实例,可以在多个平台上面运行代码。

Mono项目有Mono和WebAssembly两个原型

第一个使用的是Mono的传统的全静态编译模式,它既编译了Mono C运行时和Mono类库以及用户代码到webassmbly代码。它生成一个大型静态编译的应用程序。您可以在这里尝试这个完全静态编译的Hello World。完整的静态编译现在在这里

这是一个全静态编译的Hello World。它是所有的Mono和你的应用程序。他们有另一个原型,有不同的观点:

第二个原型将Mono C运行时编译成web汇编,然后使用Mono的IL解释器来运行托管代码。虽然很小,但性能消耗很大。混合模式的执行原型现在在这里

他们就是用这种方式在Web汇编中有很多的Mono,但是IL代码是解释的。计算机科学的一个奇妙之处是,有不止一种方法可以做一些事情,而且它们通常都以各自的方式令人敬畏。

[“BLAZOR” - 基于浏览器运行.NET的实验性UI框架)

与Mono项目的第二个原型类似,Steve Sanderson又采取了另一个“.NET的实例”,已经6年的开源DotNetAnywhere(DNA)项目,并将其编译成Web Assembly。DNA是一种用portable C编写的解释性的.NET运行时,它采用标准的IL或CIL(通用的中间语言),在那些“不可能完整运行.NET运行时(例如Mono)的资源受限的设备上”运行。很聪明是吗?“6年后我们还有什么资源受限的设备?”为什么,因为这些设备只可能是小型虚拟机——你的浏览器已经拥有了JavaScript VM,现在是由一个称之为WebAssembly的标准字节码格式驱动。

为了证明这一概念,Steve将DotNetAnywhere编译为WASM,但随后又将其进一步推进。他将那些我们在web上看到的标准编程模型和比如Angular、KnockoutjsEmber给结合在一起了,而不是用JavaScript编写web应用程序的UI,而是用ca-a编写。网络语言。

在一些Razor的中间(基本上是带有C#内联的HTML)页面,他做的是对后端的调用。这是C#代码,但它将在一个Blazor应用程序的客户端上运行。



这将允许a。NET程序员可以在客户端和服务器上使用相同的数据模型——就像今天应该使用的JavaScript代码一样——也可以使用其他的数据模型。他们可能熟悉或熟悉的网络库。

为什么这个疯狂的事情?“看看这样的框架能有多好,以及有多少人会关心。”“这能走多远?”David Fowler已经在Visual Studio代码中进行了调试工作(这是所有的原型)。不要相信我的话,请观看史蒂夫在NDC大会上提出的这个概念

作为一个原型,许多人都很兴奋,最近有一个Blazor Hackthon制作了一些有趣的样本,包括一个成熟的应用程序

其它可能性?

还有其它很多正在编译成或转换成JavaScript的项目。它们会为了支持WebAssembly而进行修改吗?你可以使用F#语言,再使用F#的Fable工程将它编译成Javascript一些人已经询问了WebAssembly

在这一点上很明显,每个人都在进行原型设计和黑客活动,并享受着自己的乐趣

你对WebAssembly有什么看法?

网友精彩评论

MIKE-EEE:这里忽略的是成本的商业问题。微软在这一点上令人感到吃惊,虽然它是一家商业公司,但在却继续在提供昂贵的解决方案。当你将JavaScript与.NET项目结合时,实际上你是将开发人员必须编写和维护的代码量增加了一倍。值得注意的是,这是多年来的主流指导,而不是以某种方式提供支持.NET(由JSIL的一些非官方和人员不足的能力证明)。

一旦代码被封装起来,它的价值主张就是利用知识,在没有比这更大的例子中可以看到。2.0网络标准。基于javascript的应用程序根本不参与这种动态,因此在与.NET一起使用时,会增加时间和资源的额外成本。

这就是让Mono命题如此激动人心的原因,因为它会参与.NET标准2.0,并提供这样的配对所带来的成本节省。这就像回到过去的6年,再一次在Silverlight里工作,这是基于这样一个范例。只有这一次,我们将在现代用户体验时代拥有6年的经验,以改进其原有的愿景,并以更大胆、更好的形象打造出更大胆、更美好的东西.NET和microsoft。

Theo Albers:这种方法的一个危险是,在显示web页面之前我们必须等待下载先完成才可以。难道我们正在回到插件时代吗?在准备页面时,没有人喜欢cookie wall或繁忙的指示器。

web浏览器支持清晰地分离关注点(样式、结构、内容和行为),这提供了很大的灵活性。然而,我们很难在网站上有效地管理这种灵活性。这就是为什么我认为网络模型被打破了。

**Jesper:**WASM很棒,让C#的逻辑在其它后台运行,而不是CLR,但是我希望微软不要再尝试ActiveX或Silverlight了,这意味着尝试在上面运行你自己的UI堆栈,并“抽象”HTML、DOM和CSS。虽然Silverlight从一开始就注定要失败,因为行业的标题,这并没有阻止它从一个巨大的开发者努力同时焦油坑和那些不幸赌了两次——一次投资relitigate所有UI问题,再次离开。

我们这些做真正工作的人仍然需要把网络的其他部分当作平台来对待——在网络上,适应大量新标准、技术和设备的不断增加,这意味着你需要成为网络的一部分。无论你用什么样的方式解决问题,都应该与其他浏览器环境和周围的技术相吻合,否则这个东西就会死在水里。

Cristian Merighi:在我看来,微软是想要跳过日益增长的WebComponents时代,想直接进入到他们的时代。

听起来很合理,好像根本不是在抱怨(你必须进行研发和试验),但是首先要给优秀的开发者一个坚实的主流平台,这是非常感谢的。

我说的是(仍然)缺失的特性和(仍然)棘手的bug

(尽管这样我还是会试试)

Andrew:我很惊讶没有人提到过Wisej.com框架。他们设计了一款非常好的产品,在设计网页app时,它已经去掉了很多复杂的步骤。我从事的工作主要是用SQL去开发winforms业务应用程序,因此我几乎接触不到Wisej产品。

当安排我设计一个web应用程序时,我发现了这款产品,并查看了所有需要了解的web层,就像asp.net,html,java,jquery,typescript,angular,bootstrap等等那样,我认为肯定会有一个更简单的方法,结果的确是有!可以用C#或者VB.net进行开发,你可以像构建winforms应用一样去构建应用,所有这些都可以使用标准的类在VS中实现完整的智能感知。发布后的应用程序会基于浏览器进行运行。我现在已经有了一个完整的数据绑定业务产品,它可以在移动端和桌面操作系统上运行,将于下个月推出。它大概花了3个月的时间,我也不需要在调整什么了。这款产品不是免费的,但价格远低于1000美元。

如果你现在没有什么思路,或者需要开始一个新的项目,那绝对值得一看。

评论