【问题标题】:Unnecessary dlls are shipped in Blazor WebAssemblyBlazor WebAssembly 中提供了不必要的 dll
【发布时间】:2023-03-11 04:13:01
【问题描述】:

我正在尝试使用由 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)

所以基本上BlazorApp.Shared 项目引用了其他一些项目,这些项目可能有很多 nuget 包。 repo https://github.com/GTmAster/blazor-treeshake中提供了重现该问题的最低代码

我的假设是 Mono Linker 在发布版本中进行了摇树,因此所有未使用的代码和库都将从生成的 Web 程序集中排除。 但是当我运行我的应用程序时,我看到它从服务器加载了AWSSDK.Core.dll BlazorApp.Client 中的代码没有使用它,BlazorApp.ServerBlazorApp.Shared 中的代码也没有使用它。仅加载它,因为它在ClassLibrary 中被引用。

我对 Mono Linker 摇树有什么误解吗? 排除此 dll 的唯一方法是将MyEnum 移动到BlazorApp.Shared 并破坏BlazorApp.Shared -> ClassLibrary 参考吗?

【问题讨论】:

  • 您找到删除这些库的方法了吗?
  • @lilo.jacob 否。这是我们决定在项目中不使用 Blazor 的原因之一。
  • 嗨。查看有关更小更快的 blazor 应用程序的视频:youtube.com/watch?v=Jte_VwsSazs

标签: c# blazor


【解决方案1】:

我也一直在调查这个。链接器似乎没有按照您的预期进行。

https://github.com/dotnet/aspnetcore/issues/28546#issuecomment-742100867

默认情况下,Blazor(以及所有 .NET Core)不会修剪应用程序代码,它只会修剪框架。有些代码模式在修剪时会出现问题。运行时库已经过更新和测试,以确保它们可以很好地进行修剪,任意库或用户代码可能无法正常运行。

进一步挖掘后,您似乎需要使用 Trimming 来进一步缩小尺寸。但是我找到了this article,底部写着:

正在为 .NET 5 中的 Blazor 应用采用以下修剪方法:

  • 来自共享框架/运行时包的程序集获得成员级别 修剪
  • Microsoft.Extensions.* 程序集获得类型级修整 从 TrimMode=Link
  • 来自 Microsoft.AspNetCore.* 的程序集被修剪 通过手动生成的 XML 文件
  • 不修剪所有其他组件

总而言之,链接器/修剪不会删除未使用的程序集,因为它不是这样做的。它本质上只是从框架程序集中修剪掉它认为你不需要的东西。

【讨论】:

    【解决方案2】:

    你是对的,单声道链接器是摇树的。

    我能找到的唯一相关信息在这里:https://devblogs.microsoft.com/aspnet/blazor-webassembly-3-2-0-preview-2-release-now-available/

    您可能会注意到,在此预览版本中,应用程序在开发期间的下载大小现在有点大,但构建时间更快。这是因为我们不再在开发过程中运行 .NET IL 链接器来删除未使用的代码。在之前的 Blazor 预览版中,我们在每次构建时都运行链接器,这会减慢开发速度。

    如前所述:

    现在我们只为发布构建运行链接器,这通常作为发布应用程序的一部分完成。

    您是否正在研究发布版本?

    如果您想在调试版本中进行摇树,请尝试遵循此建议。

    如果您希望在开发过程中仍然在每个构建上运行 .NET IL 链接器,您可以通过将 <BlazorWebAssemblyEnableLinking>true</BlazorWebAssemblyEnableLinking> 添加到您的项目文件中来启用它。

    【讨论】:

    • 是的,我正在使用发布版本。我添加了<BlazorWebAssemblyEnableLinking>true</BlazorWebAssemblyEnableLinking> 只是为了确定,但仍会加载来自瞬态引用的不必要的 dll。
    猜你喜欢
    • 2020-09-16
    • 2021-04-07
    • 1970-01-01
    • 2021-05-13
    • 2021-10-25
    • 2020-11-15
    • 2020-08-19
    • 2020-06-26
    • 2022-11-09
    相关资源
    最近更新 更多