我正在尝试使用由 ASP.NET Core 托管的 Blazor WebAssembly。实现一个页面后,我在 Chrome DevTools 中看到许多不必要的 dll 被传输到客户端。有一个情况的例子。假设解决方案中有以下项目结构:
BlazorApp.Client (contains Blazor pages)
Reference to BlazorApp.Shared
BlazorApp.Server (contains ASP.NET core)
Reference to BlazorApp.Client
Reference to BlazorApp.Shared
BlazorApp.Shared (contains shared classes)
Reference to ClassLibrary
ClassLibrary (contains some more shared classes)
NuGet reference to AWSSDK.Core
MyEnum.cs (enum, which is used in Blazor page; not using AWS SDK)
Run Code Online (Sandbox Code Playgroud)
所以基本上BlazorApp.Shared项目引用了其他一些项目,其中可能有很多 nuget 包。重现该问题的最低代码可在仓库https://github.com/GTmAster/blazor-treeshake中找到
我的假设是 Mono Linker 在发布版本中进行树摇动,因此所有未使用的代码和库都将从生成的 Web 程序集中排除。但是当我运行我的应用程序时,我看到它AWSSDK.Core.dll从服务器加载:
in 中的代码BlazorApp.Client没有使用它,以及 inBlazorApp.Server和 in 中的代码BlazorApp.Shared。它仅被加载,因为它在 中被引用ClassLibrary。
我对 Mono Linker 树摇动有错误的想法吗?排除此 dll 的唯一方法是移动MyEnum到BlazorApp.Shared并中断BlazorApp.Shared -> ClassLibrary引用吗?
我也一直在调查这个问题。链接器似乎没有按照您的预期进行操作。
https://github.com/dotnet/aspnetcore/issues/28546#issuecomment-742100867
默认情况下,Blazor(以及所有 .NET Core)不会修剪应用程序代码,它只会修剪框架。有些代码模式在修剪时会出现问题。运行时库已经过更新和测试,以确保它们能够很好地进行修剪,但任意库或用户代码可能不会。
进一步挖掘后,您似乎需要使用修剪来进一步减小尺寸。但我找到了这篇文章,它在底部指出:
.NET 5 中的 Blazor 应用程序采用以下调整方法:
- 来自共享框架/运行时包的程序集获得成员级别的修剪
- Microsoft.Extensions.* 程序集从 TrimMode=Link 获得类型级修剪
- Microsoft.AspNetCore.* 中的程序集通过手动生成的 XML 文件进行修剪
- 所有其他组件均未修剪
总而言之,链接器/修剪不会删除未使用的程序集,因为它不是这样做的。它本质上只是从框架程序集中删除它认为您不需要的内容。
| 归档时间: |
|
| 查看次数: |
3653 次 |
| 最近记录: |