NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

是否可以在应用的一部分使用 Blazor?

  • 2020-03-30
  • 本文字数:2746 字

    阅读完需:约 9 分钟

是否可以在应用的一部分使用 Blazor?

Blazor 被设计成一个可以创建完整网页应用的平台,你可以看到最近我们为我的博客创建的独立搜索网站就是一个 Blazor实践。 但是就像你工具箱里的任意一个工具一样,它可能不总是适用于你的工作。


以我的博客举例,它更多的是一个只读形式的内容存储在Github上的网站,它将 markdown 格式文件转换成 HTML 文件。 并不确定,我们可能把它做成一个 Blazor WASM 应用,使用一个.NET 的 markdown 库去动态生成页面,但这可能对于运行我的网站并带给读者一个良好体验来说是一个不高效的方法。


但是如果我们想要集成一个我们已有的搜索应用,我们又该如何决策呢?

了解 Blazor 是如何开始的

想知道我们要如何在另一个应用里运行 Blazor WebAssembly。我们需要先学习一下 Blazor WebAssessbly 应用是如何运行的。


当你创建一个新的项目,里面包含一个你或许从未打开过的文件 wwwroot/index.html , 但这是拼图很重要的一片。这个文件看起来就像:


<!DOCTYPE html><html><head>    <meta charset="utf-8" />    <meta name="viewport" content="width=device-width" />    <title>Project Name</title>    <base href="/" />    <link href="css/bootstrap/bootstrap.min.css" rel="stylesheet" />    <link href="css/site.css" rel="stylesheet" /></head><body>    <app>Loading...</app>
<script src="_framework/blazor.webassembly.js"></script></body></html>
复制代码


实际上,它非常简单,我们需要的重要代码是这两行:


<app>Loading...</app>
<script src="_framework/blazor.webassembly.js"></script>
复制代码


在快速找到<app>元素之前,我们首先看一下 JavaScript 文件。你或许会注意到这个文件并没有出现在硬盘里,这是因为它是属于构建输出的部分。你可以在 ASP.NET Core 的 Github 仓库src/Components/Web.JS/src/Boot.WebAssembly.ts里找到它的源码(at the time of writing anyway)。此文件与 Blazor 服务器共享一部分内容,但是与使用MonoPlatform的最大区别是它进行一堆 WASM 交互操作。


这个文件至关重要,没有它你的 Blazor 应用将无法启动,它先负责(通过注入一个脚本文件到DOM)初始化托管在 Mono 的 WASM 环境。然后它使用另一个生成的文件 _framework/blazor.boot.json去找出需要将哪些.NET dll 文件加载到 Mono/WASM 环境中。


因此你需要把这个 js 文件包含在内,同时把_framework文件夹放在根路径下以确保它可以找到 JSON 文件(见 此评论)。

延迟加载 Blazor

我在钻研源代码时发现的一个有趣的题外话是,你可以通过添加autostart="false"<script>标签里来延迟 Blazor 的加载。就像这里提到的一样,然后使用 JavaScript 调用window.Blazor.start()以启动 Blazor 应用。


我不打算使用它来进行这种集成,但很容易理解你可以用一个用户启动的初始化过程,而不是在页面中加载。

放置你的 Blazor 应用

既然我们已经明白了是什么使 Blazor 应用开始运行,那么我们如何了解它出现在 DOM 的何处呢?那就是我们 HTML 文件里<app>元素的用处,但是 Blazor 又怎么知道它呢?


事实证明,那是我们通过Startup 类控制的一些事情:


using Microsoft.AspNetCore.Components.Builder;using Microsoft.Extensions.DependencyInjection;
namespace DemoProject{ public class Startup { public void ConfigureServices(IServiceCollection services) { }
public void Configure(IComponentsApplicationBuilder app) { app.AddComponent<App>("app"); } }}
复制代码


可以看到在 14 行的位置我们使用了AddComponent并指定一个 DOM selector app。这就是它如何知道应用启动时 DOM 里有哪些元素。这些操作你是可以修改的,或许修改 selector 为一个 DOM 元素的 ID 或者一个<div>,又或者是任意你想要的内容,但那都不重要,因此我将它叫做<app>


题外话:我并没有进行尝试,但考虑到你指定了 DOM 元素和入口组件(通过泛型,上面例子中指向App.razor)你可以在页面上运行多个 Blazor 应用程序。至于为什么这个么做我不知道,但理论上你是可以这么做的。

托管 Blazor

当托管一个 Blazor WASM有一些可选项的时候,我想专注于Azure Storage 静态站点的方法,这也是我的博客托管的方法。


首先我们要做的事情是使用命令dotnet publish --configuration Release发布应用。然后我们可以得到bin/Release/{TARGET FRAMEWORK}/publish/{ASSEMBLY NAME}/dist/_framework文件夹的内容,包括:blazor.boot.json, blazor.server.js, blazor.webassembly.js,一个叫做_bin的文件夹和一个叫做wasm的文件夹。


我们将拷贝这个_framework文件夹并防止在静态站点的根目录下,维护所有的路径,以确保 Blazor 可以启动。


注意:根据文档使用dotnet run托管站点时你是可以修改content-rootpath-base,但我没有发现他们发布后也可以正常工作。此外,Hugo 非常积极使用绝对路径,因此我发现最简单的办法是把我的 WASM 文件放在和dotnet run使用的相同的结构中。


由于这是一个搜索应用,我们来创建一个新的搜索页,并把它放在我们需要的 HTML 文件里:


<app></app>
<script src="/_framework/blazor.webassembly.js"></script>
复制代码


现在生成你的静态站点(或者任意你选择的托管方式)并导航至/search路径下。


如果一切都没有问题你将会收到一个错误页面!


抱歉,这个地址没有任何内容。


Blazor 路由

如果你记得我们上一篇博客我们了解了 Razor 组件中的@page指令。此处你指定的路由对应的页面将匹配已有的@page "/"。但是我们现在的路由是/search,并且 Blazor 的路由引擎找到了 URL 并执行你的App.razor组件:


<Router AppAssembly="@typeof(Program).Assembly">    <Found Context="routeData">        <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />    </Found>    <NotFound>        <LayoutView Layout="@typeof(MainLayout)">            <p>Sorry, there's nothing at this address.</p>        </LayoutView>    </NotFound></Router>
复制代码


Router无法找到一个匹配的路由去使用RouteView,它就会被丢往NotFound页面,这就是我们收到这个错误页面的原因。


别担心,这个很容易修复,只需要更新@page指令以匹配您希望它在已发布网站中匹配的路由 ,或者简化 App.razor 以不关心路由。


一旦一个新的版本发布完成,并且文件拷贝完成,这个页面就会正常呈现。

结论

Blazor 是一个构建应用非常棒的方法,但是相比创建应用程序,在提前生成静态内容并使用 Blazor 增强现有应用程序更有价值。


我们研究了一下在 HTML 页面中运行 Blazor 应用所需要的重要文件,同时研究了将其放入其它类型应用需要什么。


原文链接https://www.aaron-powell.com/posts/2019-12-10-can-you-use-blazor-for-only-part-of-an-app/


2020-03-30 19:14933

评论

发布
暂无评论
发现更多内容

【全球年青人召集令】Hello World,Hello 2050

阿里巴巴云原生

容器 开发者 云原生 活动

【AI全栈二】视频流多目标多类别无延迟高精度高召回目标追踪

cv君

音视频 目标检测 视频跟踪 引航计划

奇绩创坛2021秋季创业营开始报名

奇绩创坛

【提纲】专访融云CTO杨攀 | 技术型人才的自我修炼

Python研究所

调查采访能力考核

如何从零开始学Python:(3)划重点:使用IDLE创建列表时需要注意的地方

广之巅

Python 4月日更

简单了解InnoDB底层原理

leonsh

MySQL 数据库 innodb

百度大脑3月新品推荐:EasyDL视频目标追踪全新发布

百度大脑

百度大脑 EasyDL

面试4轮字节Java研发岗,最终拿下Offer(原题复盘)

码农之家

编程 程序员 互联网 面试 字节

Excelize 2.4.0 正式版发布, 新支持 152 项公式函数

xuri

GitHub 开源 Excel Go 语言 Excelize

对话声网 Agora 首席科学家钟声 :声网的未来规划和人才建议

小诚信驿站

采访 调查采访能力考核

python 变量作用域和列表

若尘

变量 Python编程 作用域

浅谈JVM和垃圾回收

leonsh

Java JVM JVM虚拟机原理 垃圾回收算法

翻译:《实用的Python编程》09_03_Distribution

codists

Python

斗智亦斗棋,零售云市场的“楚河汉界”突围赛

脑极体

为什么微服务一定要有 API 网关?

xcbeyond

微服务 api 网关 4月日更

《采访彩食鲜 CTO 乔新亮:IT 团队从 100 到 10000 的管理心得》(采访提纲)

程序员历小冰

调查采访能力考核

融合趋势下基于 Flink Kylin Hudi 湖仓一体的大数据生态体系

Apache Flink

flink

为什么我愿意持续做这样一件看似没有价值的事情

帅安技术

坚持 持续写作 长期价值

方寸之间,书写天地

石云升

4月日更 1 周年盛典 我和写作平台的故事 InfoQ 写作平台 1 周年

浅谈在探索数分之路上的“数据思维”论述

小飞象@木木自由

数据分析 数据分析体系 数据思维 数据分析方法论

Lombok初始使用及遇到的问题

风翱

lombok 4月日更

朱嘉明:算力产业正面临着一个十年的长周期

CECBC

数字经济

深入理解Java虚拟机-HotSpot

华章IT

Java JVM 虚拟机

精通比特币:为什么它对自由、财务和未来至关重要(上篇)

CECBC

比特币

关于数字人民币、加密货币,央行前行长周小川、副行长李波博鳌论坛发声

CECBC

数字货币

开源 1 年半 star 破 1.2 万的 Dapr 是如何在阿里落地的?

阿里巴巴云原生

Java 微服务 云原生 中间件 API

欢迎参与 KubeVela 官方文档翻译活动

阿里巴巴云原生

容器 云原生 开发工具 OAM 资源调度

推进智慧城市建设 博睿数据亮相长三角城市数字化转型高峰论坛

博睿数据

数字化转型高峰论坛

使用Agora SDK开发React Native视频通话App

声网

RTC React Native 声网 RTE

架构实战营 模块2 课后作业

༺NPE༻

Python 爬虫实战(一) 爬取自如网租房信息

U2647

python 爬虫 4月日更

是否可以在应用的一部分使用 Blazor?_文化 & 方法_Azure 中文精选_InfoQ精选文章