如何将WebAssembly优化到1MB?

如何将WebAssembly优化到1MB?
Blazor WebAssembly加载优化方案
对于Blazor WebAssembly加载方案的优化是针对于WebAssembly首次加载,由于BlazorWebAssembly是在首次加载的时候会将.NET Core的所有程序集都会加载到浏览器中,并且在使用的时候可能引用了很多第三方的dll,导致加载缓慢;
优化方案 :
1. 压缩
发布 Blazor WebAssembly 应用时,将在发布过程中对输出内容进行静态压缩,从而减小应用的大小,并免去运行时压缩的开销。 使用以下压缩算法:
从 google/brotli GitHub repository 中获取 JavaScript Brotli 解码器。 缩小的解码器文件被命名为 decode.min.js,并且位于存储库的 js 文件夹中。
修改wwwroot/index.html 文件代码 ,添加autostart="false" ,阻住默认启动加载程序集
<script src="_framework/blazor.webassembly.js" autostart="false"></script>
在 Blazor 的 <script> 标记之后和结束 </body> 标记之前,添加以下 JavaScript 代码 <script> 块:
<script type="module"> import { BrotliDecode } from './decode.min.js'; Blazor.start({ loadBootResource: function (type, name, defaultUri, integrity) { // 注意:这里使用localhost的时候不会启动压缩
if (type !== 'dotnetjs' && location.hostname !== 'localhost') { return (async function () { const response = await fetch(defaultUri + '.br', { cache: 'no-cache' }); if (!response.ok) { throw new Error(response.statusText);
} const originalResponseBuffer = await response.arrayBuffer(); const originalResponseArray = new Int8Array(originalResponseBuffer); const decompressedResponseArray = BrotliDecode(originalResponseArray); const contentType = type ===
'dotnetwasm' ? 'application/wasm' : 'application/octet-stream'; return new Response(decompressedResponseArray,
{ headers: { 'content-type': contentType } });
})();
}
}
});
</script>压缩方案将减少加载时间,大概是压缩dll的三分之一大小,效果如图

在使用autostart="false"标记以后不会启动就加载,加载程序集将在上面的代码块中执行,默认是加载br;
2. 延迟加载程序集
通过等待应用程序集直到需要时才加载,提高 Blazor WebAssembly 应用启动性能,这种方式称为“延迟加载”。
将BlazorWebAssembly项目拆分细致,通过延迟加载程序集提升BlazorWebAssembly首次加载时间,我们将通过一个案例来讲解延迟加载程序集
创建一个空的Blazor WebAssembly项目: 项目名称Demand
取消HTTPS 使用渐进式Web应用程序

在创建Razor类库,项目名称:Demand.Components,然后默认选项创建项目

创建Components.razor文件,并且删除多余文件,效果如图:
在Components.razor添加以下代码:
@inject NavigationManager NavigationManager
@page "/components"<div>
<h1>
Components </h1>
</div><button @onclick="Goto">跳转到首页</button>@code
{
private void Goto()
{
NavigationManager.NavigateTo("/");
}
}在Demand项目中引用Demand.Components项目
修改App.razor文件 ,代码如下:
@using System.Reflection
@using Microsoft.AspNetCore.Components.WebAssembly.Services
@*
这里需要注意,WebAssembly是默认注入的但是Server并没有注入
在Server中手动注入
builder.Services.AddScoped<LazyAssemblyLoader>();
*@
@inject LazyAssemblyLoader AssemblyLoader<Router AppAssembly="@typeof(App).Assembly"
AdditionalAssemblies="@lazyLoadedAssemblies"
OnNavigateAsync="@OnNavigateAsync">
<Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
</Found>
<NotFound>
<PageTitle>Not found</PageTitle>
<LayoutView Layout="@typeof(MainLayout)">
<p role="alert">Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound></Router>@code {
private List<Assembly> lazyLoadedAssemblies = new();
private async Task OnNavigateAsync(NavigationContext args)
{
try
{
if (args.Path == "components")
{
// 这里自定义Demand.Components依赖的程序集,
var assemblies = await AssemblyLoader.LoadAssembliesAsync(new[] { "Demand.Components.dll" });
// 添加到路由程序集扫描中
lazyLoadedAssemblies.AddRange(assemblies);
}
}
catch (Exception ex)
{
}
}
}处理指定路由组件需要加载的程序集
打开Demand项目文件
如果在Debug模式下可以使用添加以下忽略列表:
<ItemGroup> <BlazorWebAssemblyLazyLoad Include="System.Xml.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Xml.XmlSerializer.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Xml.XmlDocument.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Xml.XPath.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Xml.XPath.XDocument.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Xml.XDocument.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Xml.Serialization.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Xml.ReaderWriter.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Xml.Linq.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Windows.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Net.Quic.dll" /> <BlazorWebAssemblyLazyLoad Include="System.IO.Compression.ZipFile.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Runtime.Numerics.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Collections.Immutable.dll" /> <BlazorWebAssemblyLazyLoad Include="Microsoft.Win32.Registry.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Web.HttpUtility.dll" /> <BlazorWebAssemblyLazyLoad Include="System.ValueTuple.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Security.AccessControl.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Net.Mail.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Net.NameResolution.dll" /> <BlazorWebAssemblyLazyLoad Include="System.IO.dll" /> <BlazorWebAssemblyLazyLoad Include="System.IO.UnmanagedMemoryStream.dll" /> <BlazorWebAssemblyLazyLoad Include="System.IO.Pipes.dll" /> <BlazorWebAssemblyLazyLoad Include="System.IO.Pipes.AccessControl.dll" /> <BlazorWebAssemblyLazyLoad Include="System.IO.Pipelines.dll" /> <BlazorWebAssemblyLazyLoad Include="System.IO.FileSystem.dll" /> <BlazorWebAssemblyLazyLoad Include="System.IO.FileSystem.Watcher.dll" /> <BlazorWebAssemblyLazyLoad Include="System.IO.FileSystem.Primitives.dll" /> <BlazorWebAssemblyLazyLoad Include="System.IO.FileSystem.DriveInfo.dll" /> <BlazorWebAssemblyLazyLoad Include="System.IO.FileSystem.AccessControl.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Data.Common.dll" /> <BlazorWebAssemblyLazyLoad Include="Microsoft.CSharp.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Console.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Core.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Data.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Data.DataSetExtensions.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Drawing.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Drawing.Primitives.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Diagnostics.TraceSource.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Diagnostics.Tools.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Diagnostics.TextWriterTraceListener.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Diagnostics.StackTrace.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Diagnostics.Process.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Diagnostics.FileVersionInfo.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Diagnostics.DiagnosticSource.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Diagnostics.Debug.dll" /> <BlazorWebAssemblyLazyLoad Include="System.Diagnostics.Contracts.dll" /> <BlazorWebAssemblyLazyLoad Include="Microsoft.AspNetCore.Authorization.dll" /> <BlazorWebAssemblyLazyLoad Include="Microsoft.AspNetCore.Components.Forms.dll" /> <BlazorWebAssemblyLazyLoad Include="Microsoft.AspNetCore.Metadata.dll" /> <BlazorWebAssemblyLazyLoad Include="Microsoft.Extensions.Configuration.Binder.dll" /> <BlazorWebAssemblyLazyLoad Include="Microsoft.Extensions.FileProviders.Abstractions.dll" /> <BlazorWebAssemblyLazyLoad Include="Microsoft.Extensions.FileProviders.Physical.dll" /> <BlazorWebAssemblyLazyLoad Include="Microsoft.Extensions.Configuration.FileExtensions.dll" /> <BlazorWebAssemblyLazyLoad Include="Microsoft.Extensions.FileSystemGlobbing.dll" /> <BlazorWebAssemblyLazyLoad Include="System.IO.MemoryMappedFiles.dll" /> <BlazorWebAssemblyLazyLoad Include="System.IO.IsolatedStorage.dll" /> <BlazorWebAssemblyLazyLoad Include="System.IO.Compression.dll" /> <BlazorWebAssemblyLazyLoad Include="System.IO.Compression.FileSystem.dll" /> <BlazorWebAssemblyLazyLoad Include="System.IO.Compressio
如何将WebAssembly优化到1MB?
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



