Skip to content

Commit b1746a9

Browse files
Prerendering (#61)
1 parent 3b23662 commit b1746a9

File tree

8 files changed

+102
-17
lines changed

8 files changed

+102
-17
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
This project is an example of using GitHub Actions to automatically deploy a .NET 9 [MudBlazor](https://mudblazor.com/) WebAssembly SPA (Single Page Application) to GitHub Pages. For a live demo, check the following link:
77

8-
https://mudblazorgithubpages.github.io
8+
https://theotherstuff.github.io/MudBlazorGitHubPages
99

1010
Microsoft Docs already contains a [general overview](https://learn.microsoft.com/en-us/aspnet/core/blazor/host-and-deploy/webassembly?view=aspnetcore-8.0#github-pages)
1111
of the steps needed for a successful deploy.

src/MudBlazorGitHubPages/AppSettings.cs renamed to src/MudBlazorGitHubPages/ClientSettings.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Text.Json.Serialization;
1+
using MudBlazorGitHubPages.Util;
2+
using System.Text.Json.Serialization;
23

34
namespace MudBlazorGitHubPages;
45

@@ -8,7 +9,7 @@ public enum ExampleEnum
89
FirstValue = 1,
910
}
1011

11-
public class AppSettings
12+
public class ClientSettings
1213
{
1314
[JsonPropertyName("stringValue")]
1415
[ConfigurationKeyName("stringValue")]
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<MudOverlay Visible="@(!_pageLoaded)" DarkBackground="true" Absolute="false">
2+
<MudProgressCircular Color="Color.Secondary" Indeterminate="true" />
3+
</MudOverlay>
4+
5+
@code{
6+
private bool _pageLoaded;
7+
8+
protected override void OnAfterRender(bool firstRender)
9+
{
10+
if (_pageLoaded)
11+
{
12+
return;
13+
}
14+
15+
_pageLoaded = true;
16+
_ = this.InvokeAsync(this.StateHasChanged);
17+
}
18+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
@* This component was copied from https://gist.github.com/EngstromJimmy/e51b8166cf2fb61f8760c5ea20d575af *@
2+
3+
@typeparam T
4+
@inject PersistentComponentState _persistentComponentState
5+
@implements IDisposable
6+
7+
@ChildContent(_state)
8+
9+
@code {
10+
[Parameter, EditorRequired]
11+
public RenderFragment<T> ChildContent { get; set; }
12+
13+
[Parameter, EditorRequired]
14+
public Func<Task<T>> GetState { get; set; }
15+
16+
[Parameter, EditorRequired]
17+
public string StateKey { get; set; }
18+
19+
private T _state;
20+
private PersistingComponentStateSubscription _subscription;
21+
protected override async Task OnInitializedAsync()
22+
{
23+
_subscription = _persistentComponentState.RegisterOnPersisting(SaveState);
24+
25+
if (_persistentComponentState.TryTakeFromJson<T>(StateKey, out var storedState) && storedState != null)
26+
{
27+
_state = storedState;
28+
}
29+
else
30+
{
31+
_state = await GetState.Invoke();
32+
}
33+
34+
await base.OnInitializedAsync();
35+
}
36+
37+
private Task SaveState()
38+
{
39+
_persistentComponentState.PersistAsJson(StateKey, _state);
40+
return Task.CompletedTask;
41+
}
42+
43+
void IDisposable.Dispose()
44+
{
45+
_subscription.Dispose();
46+
}
47+
}

src/MudBlazorGitHubPages/Layout/MainLayout.razor

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1-
@inherits LayoutComponentBase
1+
@using MudBlazorGitHubPages.Components
2+
@inherits LayoutComponentBase
23
@inject NavigationManager NavigationManager
34

45
<MudThemeProvider />
56
<MudPopoverProvider />
67
<MudDialogProvider />
78
<MudSnackbarProvider />
89

10+
<OverlayLoader />
11+
912
<div class="page mud-layout">
1013

1114
<div class="sidebar mud-elevation-1">

src/MudBlazorGitHubPages/MudBlazorGitHubPages.csproj

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
1+
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
22

33
<PropertyGroup>
44
<TargetFramework>net9.0</TargetFramework>
@@ -7,6 +7,8 @@
77
<ServiceWorkerAssetsManifest>service-worker-assets.js</ServiceWorkerAssetsManifest>
88
<AssemblyVersion>1.0.0</AssemblyVersion>
99
<GHPages>true</GHPages>
10+
<BlazorWasmPrerenderingDeleteLoadingContents>true</BlazorWasmPrerenderingDeleteLoadingContents>
11+
<BlazorWasmPrerenderingMode>WebAssemblyPrerendered</BlazorWasmPrerenderingMode>
1012
</PropertyGroup>
1113

1214

@@ -16,6 +18,7 @@
1618

1719
<ItemGroup>
1820
<PackageReference Include="Blazored.LocalStorage" Version="4.5.0" />
21+
<PackageReference Include="BlazorWasmPreRendering.Build" Version="5.0.1" />
1922
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="9.0.4" />
2023
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="9.0.4" PrivateAssets="all" />
2124
<PackageReference Include="MudBlazor" Version="8.5.1" />

src/MudBlazorGitHubPages/Program.cs

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,36 @@
88
using Serilog;
99

1010
var builder = WebAssemblyHostBuilder.CreateDefault(args);
11-
builder.RootComponents.Add<App>("#app");
12-
builder.RootComponents.Add<HeadOutlet>("head::after");
1311

14-
var http = new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) };
15-
builder.Services.AddScoped(sp => http);
12+
// Determine whether root components are already registered via prerednered HTML contents.
13+
// See https://github.com/jsakamoto/BlazorWasmPreRendering.Build
14+
if (!builder.RootComponents.Any())
15+
{
16+
builder.RootComponents.Add<App>("#app");
17+
builder.RootComponents.Add<HeadOutlet>("head::after");
18+
}
1619

17-
var appSettings = await http.GetFromJsonAsync<AppSettings>("appsettings.json", new System.Text.Json.JsonSerializerOptions() { Converters = { new UnknownEnumConverter() } });
18-
builder.Services.AddSingleton(appSettings ?? new());
19-
20-
builder.Services.AddMudServices();
21-
22-
builder.Services.AddBlazoredLocalStorage();
20+
// Do not change this line, it's for prerendering. See https://github.com/jsakamoto/BlazorWasmPreRendering.Build
21+
ConfigureServices(builder.Services, builder.HostEnvironment.BaseAddress, builder.Configuration);
2322

2423
Log.Logger = new LoggerConfiguration()
2524
.MinimumLevel.Verbose()
2625
.WriteTo.BrowserConsole()
2726
.CreateLogger();
2827

2928
await builder.Build().RunAsync();
29+
30+
// This method signature follows a convention to enable prerendering.
31+
// See https://github.com/jsakamoto/BlazorWasmPreRendering.Build
32+
static void ConfigureServices(IServiceCollection services, string baseAddress, IConfiguration configuration)
33+
{
34+
var http = new HttpClient { BaseAddress = new Uri(baseAddress) };
35+
services.AddScoped(sp => http);
36+
37+
var clientSettings = configuration.Get<ClientSettings>();
38+
39+
services
40+
.AddSingleton(clientSettings!)
41+
.AddMudServices()
42+
.AddBlazoredLocalStorage();
43+
}
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
{
22
"stringValue": "Example String Value",
33
"intValue": 4,
4-
"enumValue": "FirstValue",
5-
"nonexistentEnumValue": "TheNonexistentEnumValue"
4+
"enumValue": "FirstValue"
65
}

0 commit comments

Comments
 (0)