Blazor_WASM之3:项目结构

简介: Blazor WebAssembly项目模板可选两种,Blazor WebAssemblyAPP及Blazor WebAssemblyAPP-Empty

Blazor_WASM之3:项目结构

Blazor WebAssembly项目模板可选两种,Blazor WebAssemblyAPP及Blazor WebAssemblyAPP-Empty

  • 如果使用Blazor WebAssemblyAPP模板,则应用将填充以下内容:
  • 一个 FetchData 组件的演示代码,该组件从静态资产 (weather.json) 加载数据,且用户与 Counter 组件交互。
  • Bootstrap前端工具包。
  • 如果使用 blazorwasm-empty 模板,则无需演示代码和 Bootstrap 即可创建应用。

项目结构

Pages目录

包含构成 Blazor 应用的可路由组件/页面 (.razor),每个页面的路由使用 @page指令指定,目录下的Index 组件 (Index.razor)为Home 页。

每个razor都会在后台编译成一个类,以自带的Counter.razor为例。

Counter.razor文件

@page "/counter"

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<prole="status">Current count: @currentCount</p>

<buttonclass="btn btn-primary"@onclick="IncrementCount">Click me</button>

@code {

   private int currentCount = 0;

   private void IncrementCount()

   {

       currentCount++;

   }

}

反编译后

[Route("/counter")]

publicclassCounter : ComponentBase

{

   privateintcurrentCount=0;

   protectedoverridevoidBuildRenderTree(RenderTreeBuilder__builder)

   {

       __builder.OpenComponent<PageTitle>(0);

       __builder.AddAttribute(1, "ChildContent", (RenderFragment)delegate(RenderTreeBuilder__builder2)

       {

           __builder2.AddContent(2, "Counter");

       });

       __builder.CloseComponent();

       __builder.AddMarkupContent(3, "\r\n\r\n");

       __builder.AddMarkupContent(4, "<h1>Counter</h1>\r\n\r\n");

       __builder.OpenElement(5, "p");

       __builder.AddAttribute(6, "role", "status");

       __builder.AddContent(7, "Current count: ");

       __builder.AddContent(8, currentCount);

       __builder.CloseElement();

       __builder.AddMarkupContent(9, "\r\n\r\n");

       __builder.OpenElement(10, "button");

       __builder.AddAttribute(11, "class", "btn btn-primary");

       __builder.AddAttribute(12, "onclick", EventCallback.Factory.Create<MouseEventArgs>((object)this, (Action)IncrementCount));

       __builder.AddContent(13, "Click me");

       __builder.CloseElement();

   }

   privatevoidIncrementCount()

   {

       currentCount++;

   }

}

通过对比,Razor组件会自动继承自ComponentBase,并且@code中的代码完全移入了编译后的类,而各种标签会在BuildRenderTree方法中用方法的形式进行输出。

PlaunchSettings.json

设置开发环境配置

Shared目录

  • MainLayout 组件 (MainLayout.razor):应用的布局组件。
  • MainLayout.razor.css:应用主布局的样式表。
  • NavMenu 组件 (NavMenu.razor):实现边栏导航。 包括 NavLink组件,该组件可向其他 Razor 组件呈现导航链接。
  • NavMenu.razor.css:应用导航菜单的样式表。
  • SurveyPrompt 组件 (SurveyPrompt.razor):Blazor 调查组件。

App.razor

应用的根组件,用于使用 Router 组件来设置客户端路由。app.razor中代码

<RouterAppAssembly="@typeof(App).Assembly">

   <FoundContext="routeData">

       <RouteViewRouteData="@routeData"DefaultLayout="@typeof(MainLayout)"/>

       <FocusOnNavigateRouteData="@routeData"Selector="h1"/>

   </Found>

   <NotFound>

       <PageTitle>Not found</PageTitle>

       <LayoutViewLayout="@typeof(MainLayout)">

           <prole="alert">Sorry, there's nothing at this address.</p>

       </LayoutView>

   </NotFound>

</Router>

如果发现有相应的组件则跳转过去,如果没有则会出现Sorry, there's nothing at this address.

wwwroot

应用的 Web 根目录文件夹,其中包含应用的公共静态资产,其中index.html 网页是实现为 HTML 页面的应用的根页面:

  • 最初请求的任何页面,都会呈现此页面。
  • 此页面指定 App 组件的呈现位置。 使用 appid (<div id="app">...</div>) 在 div DOM 元素的位置呈现组件。

index.html

<body>

   <divid="app">

       <!--等待进度框图片-->

       <svgclass="loading-progress">

           <circler="40%"cx="50%"cy="50%"/>

           <circler="40%"cx="50%"cy="50%"/>

       </svg>

       <divclass="loading-progress-text"></div>

   </div>

   <!--如果出现错误则会出现-->

   <divid="blazor-error-ui">

       An unhandled error has occurred.

       <ahref=""class="reload">Reload</a>

       <aclass="dismiss">🗙</a>

   </div>

   <scriptsrc="_framework/blazor.webassembly.js"></script>

</body>

_Imports.razor

包括要包含在应用组件 (.razor) 中的常见 Razor 指令,如 @using指令

Program.cs

应用入口点,.net 7使用了顶级语法

usingMicrosoft.AspNetCore.Components.Web;

usingMicrosoft.AspNetCore.Components.WebAssembly.Hosting;

varbuilder=WebAssemblyHostBuilder.CreateDefault(args);

builder.RootComponents.Add<App>("#app"); //将APP替换了index.html中id="app"的内容

builder.RootComponents.Add<HeadOutlet>("head::after");

//添加并配置了服务

builder.Services.AddScoped(sp=>newHttpClient { BaseAddress=newUri(builder.HostEnvironment.BaseAddress) });

awaitbuilder.Build().RunAsync();


相关文章
|
存储 Rust 前端开发
给 Web 前端工程师看的用 Rust 开发 wasm 组件实战
wasm 全称 WebAssembly,是通过虚拟机的方式,可以在服务端、客户端如浏览器等环境执行的二进制程序。它有速度快、效率高、可移植的特点
211 0
|
7天前
|
前端开发 JavaScript 安全
C#一分钟浅谈:Blazor WebAssembly 开发
Blazor WebAssembly 是一个客户端框架,允许开发者使用C#和Razor语法构建Web应用。本文介绍了Blazor WebAssembly的基本概念、常见问题及解决方案,包括路由配置、数据绑定、异步操作、状态管理和性能优化等方面的内容,并分享了一些易错点及如何避免的方法。希望这些内容能帮助你在Blazor WebAssembly开发中少走弯路,提高开发效率。
79 51
|
1月前
|
存储 Rust 前端开发
Tauri 开发实践 — Tauri 配置介绍
本文首发于微信公众号“前端徐徐”,主要讲解`package.json`、`Cargo.toml`及`tauri.conf.json`三个文件的配置。其中,`tauri.conf.json`最为复杂,涉及众多配置项。`package.json`用于配置前端依赖与脚本;`Cargo.toml`用于声明Rust应用依赖;`tauri.conf.json`则管理前端资源、API白名单等。这些配置对于Tauri应用的开发至关重要。
60 5
|
1月前
|
Rust 前端开发 JavaScript
Tauri 开发实践— Tauri 怎么样
Tauri 是一个用于构建高效、小型二进制文件的框架,适用于所有主流桌面及移动平台。开发人员可以利用任何可编译为 HTML、JavaScript 和 CSS 的前端框架构建应用,并借助 Rust、Swift 或 Kotlin 进行后端开发。Tauri 采用三层架构,包括 tauri-app、WRY(跨平台 Webview 库)和 TAO(跨平台窗口管理器)。相较于 Electron,Tauri 使用系统内置浏览器引擎执行 Web APP,具有更小的资源占用和更高性能。详情见:[Tauri 官网](https://tauri.app/)。
128 0
Tauri 开发实践— Tauri 怎么样
|
1月前
|
Rust 前端开发 iOS开发
Tauri 开发实践— Tauri 工程搭建
本文首发于微信公众号“前端徐徐”,介绍了在 macOS 环境下使用 Rust 和 Tauri 构建跨平台桌面应用的过程。首先需安装 Rust 及系统依赖,参考链接:[Rust 入门](https://www.rust-lang.org/zh-CN/learn/get-started) 和 [Tauri 前置条件](https://tauri.app/zh-cn/v1/guides/getting-started/prerequisites)。
36 0
Tauri 开发实践— Tauri 工程搭建
|
3月前
|
Rust 资源调度 内存技术
Tauri——如何创建一个tauri项目
Tauri——如何创建一个tauri项目
45 4
|
6月前
|
缓存 Rust 前端开发
【一起学Rust | 框架篇 | Tauri2.0框架】Tauri2.0环境搭建与项目创建
【一起学Rust | 框架篇 | Tauri2.0框架】Tauri2.0环境搭建与项目创建
640 0
|
5月前
|
开发框架 Rust Dart
Flutter、Electron 和 Tauri 框架简介
Flutter、Electron 和 Tauri 框架简介
178 0
|
6月前
|
前端开发 JavaScript 开发者
【第44期】一文了解全新框架Remix
【第44期】一文了解全新框架Remix
814 0
|
Web App开发 前端开发 JavaScript
用electron打包前端应用初体验
用electron打包开发桌面应用遇到的各种问题和解决办法
203 1