In .Net 8 Blazor app how to fetch data only on client, while keeping prerender on the server

3 min read 04-10-2024
In .Net 8 Blazor app how to fetch data only on client, while keeping prerender on the server


Introduction

In modern web applications, achieving an efficient balance between server-side prerendering and client-side data fetching is crucial for optimizing performance and user experience. This article will explain how to implement client-side data fetching in a .NET 8 Blazor app while still utilizing server-side prerendering.

Understanding the Problem

You might be looking to leverage the benefits of server-side rendering for SEO and initial load performance while ensuring that additional data is fetched on the client side for dynamic user interactions. The challenge lies in structuring your Blazor app to allow for server-side prerendering without compromising on the client-side data fetching capabilities.

The Scenario

Imagine you have a Blazor application where you want the initial render of your component to be done on the server. This gives you faster load times and enhances SEO. However, once the component is rendered on the client side, you wish to fetch additional data from an API to populate the component without requiring a full page reload.

Here’s a simplified code example of how you might start:

@page "/example"

@inject HttpClient Http

<h3>Data Example</h3>

@if (data == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <ul>
        @foreach (var item in data)
        {
            <li>@item.Name</li>
        }
    </ul>
}

@code {
    private List<MyData> data;

    protected override async Task OnInitializedAsync()
    {
        // Server-side prerendering will happen here
        data = await FetchDataAsync();
    }

    private async Task<List<MyData>> FetchDataAsync()
    {
        // This method will be called on the client side
        return await Http.GetFromJsonAsync<List<MyData>>("https://api.example.com/data");
    }
}

In the above code, OnInitializedAsync is executed both on the server and client. However, we can tweak this to ensure that client-side data fetching occurs after the prerendering is complete.

Analysis and Unique Insights

What Happens During Prerendering?

When a Blazor component is prerendered on the server, the OnInitializedAsync method executes on the server. By default, this method will run both on the server and the client when the component is hydrated. If you only want server-side prerendering initially, then separate your concerns clearly.

Utilizing a Flag for Client-Side Execution

To effectively distinguish between server-side and client-side execution, you can check if the app is running in a WebAssembly or Server scenario. By using a flag or condition, you can control when to fetch data.

Example Implementation

Below is an improved code structure that optimally fetches data only on the client side after prerendering:

@page "/example"

@inject HttpClient Http

<h3>Data Example</h3>

@if (data == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <ul>
        @foreach (var item in data)
        {
            <li>@item.Name</li>
        }
    </ul>
}

@code {
    private List<MyData> data;

    protected override async Task OnInitializedAsync()
    {
        // Only fetch data if running on the client
        if (await IsClientAsync())
        {
            data = await FetchDataAsync();
        }
    }

    private async Task<bool> IsClientAsync()
    {
        return await Task.Run(() => 
            Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_WASM") == "true");
    }

    private async Task<List<MyData>> FetchDataAsync()
    {
        return await Http.GetFromJsonAsync<List<MyData>>("https://api.example.com/data");
    }
}

In this code:

  • We added an IsClientAsync method to determine if the code is being executed on the client side.
  • The data fetching occurs only when the client is detected, ensuring server-side prerendering remains intact.

Conclusion

Fetching data on the client side while keeping the benefits of server-side prerendering is achievable in a Blazor app by incorporating conditional checks. This approach ensures a responsive user experience without sacrificing SEO benefits.

Additional Resources

By understanding and implementing these concepts, you can build a Blazor application that takes full advantage of both server-side prerendering and client-side data fetching.