上一篇我们学习了如何创建和使用Razor类库,这一篇我们了解下WebAssembly是什么,以及创建第一个Blazor WebAssembly应用。

什么是WebAssembly?

WebAssembly 是一种开放的文本程序集语言,具有专用于实现快速下载和近乎本机性能的精简二进制格式,它用于定义旨在 Web 浏览器中运行的程序的可移植代码格式。Blazor 是在 .NET 和 Razor 上构建的用户界面框架。Blazor 应用程序可以在服务器上作为 ASP.NET 应用程序的一部分运行,也可以部署为在用户计算机上的浏览器中运行(类似于单页应用程序)。在之前的学习之旅中,我们一直使用的 Blazor Server 模式,它会使用 ASP.NET Core SignalR 来维护双向通信管道。除此之外,Blazor还提供了另一种模式,就是我们今天要学习的 Blazor WebAssembly

Blazor WebAssembly(有时简称为 Blazor WASM)是 Blazor 用户界面框架的实现,在所有新式浏览器中均包含的 HTML5 标准 WebAssembly 运行时上运行。应用程序的二进制输出,即 DLL 文件,将传输到浏览器,并运行经过优化以使用 WebAssembly 运行时的 .NET 版本,无需考虑浏览到该网站的设备的基础操作系统。

话外音:首次应用访问时下载量比较大,影响性能,这可能是最大的缺点。但它支持离线运行。

由于 WebAssembly 是一种完全在浏览器中运行的技术,因此,可以使用 Web 服务器不分析或与其交互的文件来部署 Blazor 应用程序的此模型。这种“静态”方法降低了对 Web 服务器的要求,并且将应用程序的所有处理都转移到用户计算机。

高级处理和逻辑可以在浏览器中进行。当应用程序需要数据或与其他服务交互时,可以使用标准 Web 技术与 HTTP 服务通信。

总结下:Blazor WebAssembly 是一种SPA(单页应用)框架,使用的是 WebAssembly 开放标准,无需安装任何插件或代码生成,完全在浏览器中运行。

对比下:Blazor WebAssembly 是真正的SPA,页面的渲染在前端实现,可以实现真正的前后端分离设计。而Blazor Server 可以认为是前者的服务端渲染版本,它使用SignalR实现了客户端的实时通讯,它的计算跟渲染都在服务端处理。当然,这两种类型都不需要你有太多甚至都可以没有JavaScript的知识就可以完成全栈开发,无论是SPA还是MPA,这是Blazor对于.NET开发者最大的意义!

接下来,我们就来使用Blazor WebAssembly来体验一下。

创建一个WASM项目

这次,我们在Visual Studio中创建一个“Blazor WebAssembly”类型的应用,并暂且给它取名为“EDT.BlazorWasm.App”。

选择".NET 6框架",“身份验证类型”设置为“无”,取消“ASP.NET Core托管”复选框,然后点击创建。

F5开始运行,浏览器会显示一定时间(大概好几秒钟)的Loading,在Blazor WebAssembly首次访问时需要下载相比Blazor Server更多的文件到浏览器。

Loading完成后,就显示我们的应用内容了:

于是,你的第一个Blazor WebAssembly应用程序就运行好了。

使用HttpClient获取数据

在创建的Blazor WebAssembly项目中,自带的模板已经给我们演示了一个 FeatchData.razor页,它演示的是我们如何在SPA这种前后端分离项目中,前端如何从后端获取数据,这也是我们日常开发中的重点工作。

首先,在Program.cs中已经帮我们注入一个HttpClient,它指向的是本项目的地址。

var builder = WebAssemblyHostBuilder.CreateDefault(args);
......
builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
......

NOTE:在实际开发中,我们会注入真实的后端WebAPI项目的真实地址,而且会使用HttpClientFactory而不是直接使用HttpClient,如下所示:

builder.Services.AddHttpClient(name: "product", c =>
{
c.BaseAddress = new Uri("https://api-gateway/product/api");
};

其次,在FetchData.razor页面中,它通过注入HttpClient实例,并且重写OnIntializedAsync方法来调用HttpClient的GetFromJsonAsync方法完成从后端的数据获取。

@page "/fetchdata"
@inject HttpClient Http ...... @code {
private WeatherForecast[]? forecasts; protected override async Task OnInitializedAsync()
{
forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("sample-data/weather.json");
} public class WeatherForecast
{
public DateTime Date { get; set; } public int TemperatureC { get; set; } public string? Summary { get; set; } public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
}

需要注意的是,在这个模板示例中,它并没有真正的调用API,而只是通过HttpClient从该项目的服务器端目录下直接获取了一个json数据文件内容。这个weather.json文件位于wwwroot/sample-data目录下

NOTE:在实际开发中,我们通常注入HttpClientFactory实例,然后通过HttpClientFactory来创建HttpClient实例。

@inject IHttpClientFactory HttpClientFactory
......
@code {
......
protected override async Task OnInitializedAsync()
{
var httpClient = HttpClientFactory.CreateClient(name: "product");
forecasts = await httpClient.GetFromJsonAsync<IList<Product>>("v1/product");
}
......
}

当然,我更建议使用NCC的开源项目WebApiClient来实现这类型的操作,编码体验会更将良好。

最后,一起来看看这个页面的效果:

可以看到,这个页面成功获取了数据并进行了绑定。

小结

本篇,我们了解了什么是WebAssembly以及什么是Blazor WebAssembly,然后通过创建第一个Blazor WebAssembly了解了如何快速创建一个SPA单页应用应用,了解了如何通过HttpClient来获取后端API提供的数据,相信会对你开始使用WebAssembly有帮助。

参考代码

GitHub:https://github.com/EdisonChou/BlazorSamples/tree/main

参考资料

Microsoft Doc,《使用Blazor构建Web应用程序

强力推荐上面这个微软官方的学习路径“使用Blazor构建Web应用程序”,我也刚刚完成该学习路径,我的Blazor学习之旅系列都是该学习路径的学习笔记和总结。

作者:周旭龙

出处:https://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

Blazor学习之旅 (14) Blazor WebAssembly的更多相关文章

  1. 笔记-JavaWeb学习之旅14

    JSTL:JavaServer Pages Tag Library JSP标准标签库 if标签 <%@ page import="java.util.ArrayList" % ...

  2. [推荐]大量 Blazor 学习资源(一)

    前言 / Introduction Blazor 是什么? Blazor 允许您使用 C# 而不是 JavaScript 构建交互式 Web UI. Blazor 应用由使用 C#.HTML 和 CS ...

  3. [推荐]大量 Blazor 学习资源(二)

    继上一篇<[推荐]大量 Blazor 学习资源(一)>之后,社区反应不错,但因个人原因导致这篇文章姗姗来迟,不过最终还是来了!这篇文章主要收集一些常用组件.书籍和电子书. 资料来源:htt ...

  4. 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(完)

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  5. 学习ASP.NET Core Blazor编程系列一——综述

    一.NET 6概述 .NET 6 是微软统一.Net Core与.Net Framework 两大框架的第二个版本,微软在 .NET 5 中开始进行这两大框架的统一之路. .NET 6 将作为长期支持 ...

  6. 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(上)

    学习ASP.NET Core Blazor编程系列一--综述 一.概述 Blazor 是一个生成交互式客户端 Web UI 的框架: 使用 C# 代替 JavaScript 来创建信息丰富的交互式 U ...

  7. 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(中)

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 四.创建一个Blazor应用程序 1. 第一种创 ...

  8. 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(下)

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  9. 022年9月12日 学习ASP.NET Core Blazor编程系列三——实体

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  10. 学习ASP.NET Core Blazor编程系列四——迁移

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

随机推荐

  1. 【Python】Python实现解压rar文件

    Python实现解压rar文件 零.需求 最近在开发一个填分数的应用,需要用到selenium,那么自然需要用到浏览器,浏览器内置到应用中,但是上传到GitCode的时候被限制了,单个文件大小只能是1 ...

  2. 【UWB】DWM1000 室内定位串口协议说明

    UWB室内定位串口协议说明 通过串口发送的测距报告消息有三种: "mr"信息包括标签到锚定原始范围 "mc"标签到锚定范围偏差修正范围 - 用于标签位置 &qu ...

  3. Linux | 如何创建一个 home 目录在 /data 磁盘的 sudo 用户

    需求: 拿到了 boss 的服务器账号 ssh boss@172.16.1.100,需要登录 boss 的账号,然后为自己创建一个账号,实现 ssh <user_name>@172.16. ...

  4. JBoltAI 与 AIGS 的深度融合:重构企业数智化未来

    在企业数智化转型浪潮中,JBoltAI 凭借其独特的 AIGS(AI Generate Service)解决方案,正成为连接大模型能力与企业实际需求的桥梁.其核心价值在于通过技术框架的重构,将 AI ...

  5. astc内存大小计算方式

    https://www.cnblogs.com/bylle/p/12212823.html

  6. day11”函数“入门

    函数 函数的作⽤ 函数的使⽤步骤 函数的参数作⽤ 函数的返回值作⽤ 函数的说明⽂档 函数嵌套 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利 ...

  7. zabbix 之安装采坑记

    很久没有安装过zabbix,理论上应该是很简单,但是还是遇到好几个小问题,导致浪费了两个小时时间了要,特此记录一下 如果没有研发源码的能力,建议选择LTS版本 zabbix 4.0 官方安装文档: h ...

  8. AutoFac(五)——通过lambda表达式灵活注册

    按参数值不同实现不同的注册 一.定义接口 public interface InterfaceDao { public virtual void DoSomething(string type) { ...

  9. python初学之random()模块

    ##python小脚本 random()是不能直接访问的,需要导入 random 模块,然后通过 random 静态对象调用该方法. random.random()用于生成 一个指定范围内的随机符点数 ...

  10. 在Ubuntu Server上安装Checkmk监控系统

    一.安装前准备 更新系统并安装依赖: sudo apt update && sudo apt upgrade -y sudo apt install -y wget apt-trans ...