别了,JavaScript;你好,Blazor

Web开发与JavaScript开发向来是同义词。直到WebAssembly的横空出世,WebAssembly (Wasm)是一种在浏览器中可以执行的二进制指令。WebAssembly 的 官方工具链 能够编译 C/C++ 代码,但许多社区也提供了不同语言的编译器,如 Rust,Python,Java 和 Blazor(C#)。特别是 Rust 社区非常活跃,可以开始看到完整的前端框架,如 Yew 和 Dodrio,这为基于浏览器的应用带来了更多新的可能性,只要测试一些使用 WebAssembly 构建的优秀应用,就可知道基于浏览器的近乎原生的应用现在已经成为现实,例如 Sketchup 或 Magnum。
WebAssembly被设计为可以和JavaScript一起协同工作——通过使用WebAssembly的JavaScript API,你可以把WebAssembly模块加载到一个JavaScript应用中并且在两者之间共享功能。这允许你在同一个应用中利用WebAssembly的性能和威力以及JavaScript的表达力和灵活性,即使你可能并不知道如何编写WebAssembly代码。

2017年 微软开始尝试基于WebAssembly使用Mono运行时让.NET进入浏览器,Mono为.NET运行库(.dll)提供了基于WebAssembly运行的环境。运行在Mono之上的是Blazor,一个构建于.NET的单页Web应用开发框架,通过Mono的WebAssembly运行时在浏览器中运行。经过了3年时间的开发,2020年5月19日在微软年度技术大会Build上正式发布,我们来看一看Blazor将如何改变Web开发。

Blazor是什么?

Blazor 允许您使用 C# 而不是 JavaScript 构建交互式 Web UI。

  • Blazor 应用由使用 C#、HTML 和 CSS 实现的可重用 Web UI 组件组成。

  • 客户端和服务器代码都用 C# 编写,允许您共享代码和库。

在很长一段时间内,我们构建了仅在服务器上运行的应用程序,使用ASP.NET、PHP 等技术,在服务端生成了要推送到浏览器的 HTML 文件。我们始终与 JavaScript 和 AJAX 有一些交互性,但多年来,大多数业务逻辑都处理在服务器本身上,吐出 HTML 页面进行交互,浏览器只是一个文档查看器。

浏览器里很多年也是IE 当道,直到Chrome 这个浏览器的出现,IE 11之后微软重新用Chrome的心脏置换了Microsoft Edge,慢慢的改变了我们前端开发的模式,进入了单页面应用程序时代,这个时代的典型代表就是Angular,React和Vue。我们在浏览器里运行JavaScript构建的完整应用程序,见过大量的.NET程序员转战前端战场。我们拆分业务逻辑,做到前后端分离架构,以便某些逻辑在浏览器上运行,有些在服务器上运行。JavaScript 应用程序运行客户端并使用消息传递与"服务器"通信。您可以轻松地将"服务器"替换为云中的服务或应用程序,但模型仍然相同。

Blazor 借助于WebAssembly技术 改进这种前后端分离的模式,他有两种模式支持:Blazor WebAssembly 应用和Blazor Server ,个人认为Blazor Webassembly 模式的应用才是这种前后端分离的正途:

浏览器充当应用程序的宿主。在 Blazor WebAssembly 应用程序中构建的文件将编译并发送到浏览器。然后,浏览器在浏览器的执行沙盒中运行您的 JavaScript、HTML 和 C#。它甚至运行 .NET 运行时的版本,这个运行时处理 JavaScript 互操作,并提供基本服务(如垃圾回收)和更高级别的功能(布局、路由和用户界面小部件等)。换句话说,blazor使用了一个驻留在另一个虚拟机中的虚拟机,堪称《盗梦空间》级别的悖论,也是一种在浏览器中运行非 JavaScript 应用程序框架的巧妙方法。这意味着您可以在浏览器中执行对 .NET 的调用,并且它是浏览器中成熟的应用程序。它甚至可以脱机运行。

运行时使得blazor 和 WebAssembly 上运行的其他语言与众不同,MonoCLR 编译为WebAssembly。任何.NET Standard 2.1的代码都可以在上面运行,这样就可以把.NET生态的大量库带到前端开发,其他的语言只实现了直接编译为WebAssembly,blazor当前利用WebAssembly 的一个独特创新。

为什么这是很酷的:
  • 您可以在任何静态文件服务器上运行它(Nginx、ISS、Apache、S3、Heroku 等)

  • 它以WebAssembly 运行 JS,以接近本机的速度运行 C#。

  • 您可以使用 C# 开发丰富的前端应用程序。

  • 后端的API服务可以是任何语言,比如Java,PHP,Python,go

  • 重用 .NET 组件

  • 使用 Microsoft 工具(Visual Studio和Visual Studio Code)和调试

这非常适合低延迟应用程序,如游戏。如果您不需要与服务器通信,则无需与服务器通信。您可以下载应用程序并在浏览器中脱机运行该应用程序。

一些缺点:
  • 首次需要下载 .NET 框架和其他运行时文件(一次)

  • 您仅限于浏览器的功能

  • 在本地下载的所有机密(凭据、API 密钥等)

  • 并非兼容所有 .NET 框架组件

有这些缺点也正是Blazor Server应用程序模型可以弥补,可以拥有要.NET的全部功能和瘦客户端。

.NET切入Web开发的一个特殊优势,就是有了可以替换npm和WebPack的工具。作为一个多年的.NET程序员,我可以向NuGet(包管理程序)和MSBuild招手了。对我而言,这些工具问题少,更熟悉,且效率也高得多。尽管没有完美的事物,但我使用NuGet和MSBuild的体验一直是很好的。这里不要误解我的意思,不是npm和Webpack不好,希望大家放弃它们,但反之也一样。npm和WebPack都是伟大的工具,还会存在相当长的时间。如果你的JavaScript工具用来创建Web应用很好使,那没问题。基于我对Web开发多年的认知,我明白为什么会出现npm和WebPack,也对它们取得的成熟和将要做出的贡献表示赞赏,微软也是花了大价钱把npm的提供商收至麾下,微软肯定不是傻子。
Blazor让我非常震撼的是它使用起来非常简单。公平地说,我承认Blazor的生态还不够完善,大量的利用前端技术圈的成果的开源项目正在不断涌现。Blazor把简单易用的Razor(UI)与其他.NET核心概念组合起来:依赖注入、配置、路由。而且从Angular及React等流行JavaScript框架借用了最佳模式,同时利用了Razor模板,并提供了与其他.NET惯例的一致性。这些功能的组合支持前所未有的技能重用。
使用WebAssembly并不意味着可以抛弃JavaScript。WebAssembly眼下还只能被JavaScript加载和编译。(没错,这有点乱。)虽然未来的计划让WebAssembly模块可以像ES6模块一样被浏览器加载,但JavaScript还是启动WebAssembly必需的。JavaScript的必要性还不止于此。WebAssembly自身无法访问任何平台API,而要访问这些API,JavaScript也是必要的。开发者可以通过Blazor interop在 WebAssembly自身不足时把JavaScript作为后备,此外这个交互机制也是一个抽象层,很多使用C#的程序员都会用到,他们不必担心底层运行的还是JavaScript。
是不是使用C#开发Web 让你激动, WebAssembly及ASP.NET Core的Blazor等框架就值得投入一些时间了呢?至少我学了那么多年.NET,现在终于可以用它来更快地做Web开发了,还是很值得炫耀的,这也是我有动力写这篇文章的原因。不仅如此,我其实也很熟悉JavaScript,而且还在不断学习。作为一个工程师,拥有这些技能就有了解决问题的思路。

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

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

相关文章

[Java基础]接口组成(默认方法,静态方法,私有方法)

默认方法: 代码如下: package MyInterfacePack;public interface MyInterface {void show1();void show2();// void show3();public default void show3(){System.out.println("show3");};}package MyInterfacePack;public class MyInterfaceImplOne implements …

linux jdk1.7 tomcat mysql_Linux环境搭建 jdk+tomcat+mysql

好久之前搭建的,现在记录下 防止下次配置去找安装jdk(jre也行),tomcat MySQL一、jdk安装及环境变量配置:我是用 jdk-8u191-linux-x64.tar.gz 安装的安装之前提前下载好 jdk版本 看你用什么版本吧 都一样的步骤 按照下面的步骤操作 要确保完全是一个新环境…

Eight HDU - 1043(八数码+搜索)

题意: 就是还原八数码。输出操作。 题目: The 15-puzzle has been around for over 100 years; even if you dont know it by that name, youve seen it. It is constructed with 15 sliding tiles, each with a number from 1 to 15 on it, and all …

开源 一套 Blazor Server 端精致套件

Blazor 作为一种 Web 开发的新技术已经发展有一段时间了,有些人标称 无 JS 无 TS,我觉得有点误导新人的意味,也有人文章大肆宣传 Blazor 是 JavaScript 的终结者,是为了替代 JavaScript 而生的,我认为这些言论都太激进…

[Java基础]函数式接口

代码如下: package MyInterfacePack01;FunctionalInterface public interface MyInterface {void show(); }package MyInterfacePack01;public class MyInterfaceDemo {public static void main(String[] args){MyInterface my ()->System.out.println("hello world&q…

mysql单库用户隔离_Mysql数据库隔离级别

数据库事务四大特性(ACID)原子性(Atomicity)原子性是指事务中的操作要么全部成功,要么失败回滚。一致性(Consistency)一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。拿转…

Tree Cutting POJ - 2378(树形DP)

题意:有n个谷仓有n-1条路连接,问最少删除哪几个点才能使得删除点后得到的连通图的加点数不大于n/2. 分析:求树的重心的变形题,poj3107的简单版,一遍dfs从叶子到根转移找出找到以每个节点为根的子树的结点数&#xff0…

从零搭建分布式文件系统MinIO比FastDFS要更合适

前两天跟大家分享了一篇关于如何利用FastDFS组件来自建分布式文件系统的文章,有兴趣的朋友可以阅读下《用asp.net core结合fastdfs打造分布式文件存储系统》。通过留言发现大家虽然感兴趣,但是都觉得部署比较麻烦。的确,fastdfs的部署很繁琐&…

ember.js mysql_用AWS部署ember.jspadrino应用系列之一

aws提供了一年免费试用服务。这里,记录下,配置aws和部署开源cms程序——维卡币操盘手的整个过程。主要内容包括:EC2实例的创建和设置——ruby环境和nginx配置,部署ruby应用。RDS实例的创建和使用——mysql数据库参数组的使用。S3库…

[Java基础]方法引用

代码如下: package PrintablePack;public interface Printable {void printString(String s);}package PrintablePack;public class PrintableDemo {public static void main(String[] args){usePrintable(s-> System.out.println(s));usePrintable(System.out::println);/…

Maximum Sum UVA - 108(连续子序列最大和—变形之子矩阵最大和)

题目大意:给出 n*n 的矩阵,找每隔数字之和最大的子矩阵,输出最大和。 解题思路:枚举矩阵左上和右下的坐标,分别合并子矩阵的每列,使得二维转化为一维,然后利用连续子序列最大和去做就行。 Tim…

甲方爸爸,大概你要的是代码生成器吧?

作者:邹溪源,长沙资深互联网从业者,架构师社区特邀嘉宾!一1)有一天,我的朋友Y童鞋分享了他正在做的一个内部开源项目,这个开源项目从外表上看,跟目前市场上那些代码生成器本没有特别…

使用pdf.js来预览pdf文件_适用于Dynamics365与PowerApps的注释预览组件

powerapps/dynamics365适用的注释预览/批量下载组件自定义组件为预览功能原生预览支持的文件类型:图像,zip,音频,pdf支持批量打包注释为zip下载到本地使用浏览器预览支持:音频,视频,图像,pdf,文本,xml,json等,理论上只需要浏览器支持打开的文件类型,均可预览使用方法:1.导入解决…

[PAT乙级]1001 害死人不偿命的(3n+1)猜想

卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n1。卡拉兹在 1950 年的世界数学家大会上公布了…

Sticks UVA - 307(切木棍 线性区间dp,线性dp,区间思想。)

题目大意:将n节木棒接成m个长度相等的木条,要求木条的长度尽可能的短 Time limit 3000 ms OS Linux George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return st…

消息队列,我只选RabbitMQ!

高并发架构是架构师的必修课,而消息队列,则是王冠上最闪亮的那颗明珠!能否驾驭消息队列这款高并发神器,亦成为架构师的试金石。作为专注.NET领域十多年的老架构师,下面从队列本质、技术选型、实战应用三个方面&#xf…

python比较三个数_python经典练习题(三)

人生苦短,你需要python继续学习python第一题题目:输入三个整数 x,y,z,请把这三个数由小到大输出不借助sortnum1 int(input("请输入第一个数"))num2 int(input("请输入第二个数"))num3 int(input("请输入第三个数&qu…

[PAT乙级]1002 写出这个数

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10​100​​。 输出格式: 在一行内输出 n 的各位数字之和的…

ROADS POJ - 1724(限制条件的最短路)【邻接表+深搜】

思路:先说下题意,题意第一行给了一个k,代表你有k的钱数,下一行有一个n,代表n个点,然后一个m,代表m条边,然后接下来m行,每行有四个数,分别代表起点、终点、路径长度和要花费的钱数,题…

使用Jexus 容器化您的 Blazor 应用程序

在本文中,我们将介绍如何将 Blazor 应用程序放入Jexus 容器以进行开发和部署。我们将使用 .NET Core CLI,因此无论平台如何,使用的命令都将是相同的。Blazor 托管模型Blazor 有两个托管模型,它们的要求不同,本文主要基…