blazor is two components
a javascript engine that sends events to blazor, and manages updates to the dom. via javascript interop, it can execute javascript commands sent by the blazor engine
the blazor component engine that send html updates to javascript engine.
blazor server:
if blazor is hosted on the server, the javascript engine opens signal/r connection to the server which hosts the blazor engine. all communication is over the signal/r connection. the blazor engine has all the state.
The blazor code has full access to server services, and .net libraries.
blazor client:
the blazor code is compiled to WASM. the javascript engine is responsible for loading the blazor code, which is just a url. the javascript and blazor communicate over the browser messaging services. no signal/r is required. actually no server code is required at all, it can be a static site.
if the blazor client needs to call a server, it can use any method supported by the javascript, as WASM is a sandbox with no network access. HttpClient for example uses javascript interop to make network calls.
Because of the sandbox, and the reduced services of the blazor WASM runtime support, many nuget packages will not work with blazor client.
when creating a blazor wasm project you have two options:
1) standalone static blazor site
2) a blazor static site and webapi project to host the blazor static site. the blazor code would use httpclient to call the webapi server.