如何减小aspnet/blazor编译的dll/wasm的大小?

How to reduce the size of dll/wasm compiled by aspnet/blazor?

我注意到 Rust 编译的 *.wasm 的文件大小是可以接受的。然而,由 AspNet/Blazor 编译的最小 HelloWorld 将占用将近 2.8MB。

mono.wasm       1.75MB
mscorlib.dll    1.64MB
*.dll           ....

如果我没理解错的话,mono.wasm就是在浏览器中运行的虚拟机,运行我们写的dll。这是否意味着无论我们做什么,我们都不能使文件的大小小于 1.75MB?如果没有,是否有减小文件大小的方法?

是的,2.8 兆字节对于 'Hello World' 应用程序来说是一个相当大的负载。但是,Blazor 在很大程度上仍是一项实验性技术,尚未准备好用于生产。目前生成的输出如此之大的原因有很多:

您当前的应用程序以解释模式运行,其中 mono.wasm 文件将 CLR 传送到您的浏览器,允许它执行您的 DLL。一种更快、更高效的方法是使用提前编译 (AOT) as described in this article。这将允许编译器去除任何未使用的库函数,从而提供高度优化的输出。

WebAssembly 运行时本身的功能非常有限,未来版本将添加 garbage collection 和 Blazor 可以直接使用的各种其他功能。目前 mono.wasm 包含自己的垃圾收集器。

Blazor 项目本身有一个 number of open issues 描述了正在积极进行的各种优化。它已经执行了 tree-shaking 和各种其他优化,但是这种类型的工作需要时间。

目前(2021 年),一个 hello world Blazor WASM 应用程序(Visual Studio 项目模板)下载超过 17 MB 的数据。当使用 gzip 时,它减少到 7 MB - 如果我们考虑到还没有包含应用程序 code/logic 的事实,这真的很大!

但我发现链接器在调试期间似乎没有激活。如果我们以发布模式(-c Release 开关)发布应用程序,则只会加载必要的文件。这会将传输大小增加到 5.6 MB,甚至在激活 gzip 的情况下增加到 2.4 MB。你也可以在发布文件夹的大小中看到这个:

$ dotnet publish --output publish_debug -c Debug
$ dotnet publish --output publish_release -c Release

$ du -hs publish_debug/
30M publish_debug/
$ du -hs publish_release/
11M publish_release/

这仍然是一个值得注意的数据量。但是,由于在调试模式下显示的 17/7 MB 更大,因此此信息可能会帮助其他人找到此问题。

由于问题来自 2018 年,可能还有兴趣提及 framework caching was improved in 3.2.0-preview2。这意味着:运行时和框架在最初从服务器获取后存储在浏览器缓存中。由于这是由 JavaScript 处理的,因此在这些文件被缓存后不会再对这些文件发出进一步的请求!服务器可能会响应 304 Not Modified,但这仍然是一些我们现在没有的开销。

这也意味着它们出现在网络选项卡的第一页加载上!如果你想测量没有缓存的加载时间,删除那些域的缓存。这必须手动完成!在浏览器控制台中选中无缓存复选框不够,因为看起来 Blazor 使用 JS 的本地存储。