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