目前四大主流瀏覽器都默認支持WebAssembly,而.NET社區也在繼續推動為.NET開發者提供相關能力,來將他們的代碼編譯成WebAssembly,然后在瀏覽器上運行。
WebAssembly是一種二進制web格式,旨在以接近原生的性能運行不是用JavaScript語言編寫的應用。目前,C、C++和Rust都可以通過基于LLVM的工具鏈來編譯成wasm格式。這些語言編譯成原生代碼,然后可以在沒有任何附加代碼的情況下運行。當然,.NET通常需要一個運行時平臺來執行代碼,因此在瀏覽器中使用它在理論上是可行的,只是需要一些額外的工作來讓它更高效地運行。
其中一個非常可能實現.NET WebAssembly的項目,是被Steve Sanderson稱作Blazor的項目,雖然它還只是一個進行中的實驗,遠遠沒有生產價值。Blazor在Mono運行時平臺上,運行被編譯成wasdm格式的.NET代碼。目前,這導致一個“Hello World”應用的負載比預期中要大,Sanderson說:
自從遷移到Mono運行時平臺,新的Blazor應用就變得很龐大(大約4MB)。這是因為Mono上的WASM還沒有進行任何無效代碼剝離和壓縮,并且打包了一個非常大的運行時庫。這個運行時庫包括許多桌面相關的功能,但這些功能是與web無關的。我期望,一個面向web優化過的生產應用,能夠減小到接近300KB的大小。
這個項目的混合編譯模型,已經在2017年11月1日合并到Mono項目。
另外一種可能適合.NET的方法,類似于現有的原生代碼編譯方法,即靜態編譯組合成wasm的代碼。這些代碼包括Mono C 運行時平臺和開發者的.NET代碼。截至本文撰寫時,一個使用這種方式的樣本應用,會向用戶計算機下載10MB代碼。相比之下,加載一次最近的Twitter.com完整頁面會下載超過7MB的內容,而訪問一次最近的Amazon.com會下載8.9MB的內容。據Miguel de Icaza所說,這個大小應該會隨著時間推移而減少:
一旦我們使用一種定制的概要文件,這個大小應該會明顯減少。這種定制的概要文件基于移動端的概要配置文件,并且移除了許多不必要的功能。
這個項目采用“基于LLVM的實驗性的WebAssembly,LLVM連接器和二進制化工具來生成最終的.wasm代碼”,但是在最近幾個月還沒有更新過。
在官方的CoreRT庫中,也有WebAssembly支持原型。
查看英文原文:.NET WebAssembly Support an Ongoing Experiment