WebAssembly içinde DOM'ye erişin


10

Son zamanlarda bazı projelerim için WebAssembly kullanmaya başladım. Bunu yapıyorum çünkü Wasm'ın javaScript'ten daha hızlı olduğunu duydum.
Aslında ilk Wasm projemi başlattığımda, C ++ 'da DOM'yi nasıl kullanacağımı bilmediğimi fark ettim.
Wasm kullanarak bunu yapmanın bir yolu var mı?


DOM'yi değiştirmek yolculuğun yarısıdır, ayrıca JavaScript'ten web montajını geri çağırmanız gerekir.
amirouche

Komut dosyalarınızın performansı gerçekten önemli değilse, JavaScript ile çalışmayı düşünürüm. Web derleme kullanan web sitelerinin yarısı, kötü amaçlı amaçlar için kullanıyor gibi görünüyor , bu nedenle bazı kullanıcılar tarayıcılarında web derlemeyi devre dışı bırakmaya çalışıyor.
mzuther

Yanıtlar:


1

Kısa süre önce bazı projelerim için Web Assembly kullanmaya başladım. Bunu yapıyorum çünkü wasm'in javascript'ten daha hızlı olduğunu duydum.

WebAssembly, JavaScript'ten daha hızlıdır, ancak yalnızca belirli kullanım durumları için. WebAssembly ile tarayıcınızın kodunuzu indirmek ve derlemek için daha az iş yapması gerekir, böylece daha hızlı başlatma süreleri sağlanır. Ancak, WebAssembly çalışma zamanı performansı genellikle JavaScript'ten yalnızca 2 ila 3 kat daha hızlı olduğunda. Çok iyi ve pratik bir karşılaştırma için aşağıdaki makaleye bakın:

https://hacks.mozilla.org/2018/01/oxidizing-source-maps-with-rust-and-webassembly/

Bununla birlikte, WebAssembly'nin doğrudan DOM erişimi yoktur, bu nedenle üstün performansına rağmen, ekstra G / Ç ek yükü nedeniyle kullanım durumunuz için JavaScript'ten daha yavaş olduğunu görebilirsiniz.

Bu nedenle, şu anda insanlar algoritmik / bilgi işlem yoğun görevler için WebAssembly ile en başarılı buluyor.

i nasıl c ++ dom manipüle bilmiyordum. Wasm kullanarak bunu yapmanın bir yolu var mı?

DOM'u manipüle etmek için bunu JavaScript ana makinesi aracılığıyla yapmanız gerekir - WebAssembly modülünüz JavaScript'e kendi adına DOM'yi manipüle etmesini 'isteyen' mesajlar göndermelidir.

Bu oldukça yaygın bir zorluk olduğundan, soruna çözüm getiren çeşitli topluluk projeleri vardır. C ++ kullandığınız için, bu ilginizi çekebilir:

https://github.com/mbasso/asm-dom

Gelecekte bu daha da kolaylaşacak, Arayüz Türleri gibi teklifler ana bilgisayar ortamıyla birlikte çalışmayı kolaylaştırıyor ve Web API'lerinin doğrudan WebAssembly'dan çağrılmasına izin verebilir.


1

Ne yazık ki, DOM'a yalnızca tarayıcının ana JavaScript dizisinden erişilebilir. Hizmet Çalışanları, Web Çalışanları ve Web Birleştirme modüllerinin DOM erişimi olmaz. WASM'den alacağınız en yakın manipülasyon, Preact / React gibi durum tabanlı UI bileşenleri ile ana iş parçacığına geçirilen ve işlenen durum nesnelerini işlemektir .

JSON serileştirmesi çoğunlukla Kanalları ile postMessage()veya Yayın Kanallarını iletmek için kullanılır . Bitpacking veya ikili nesneler TransferrableArrayBuffers ile JSON serileştirme / serileştirme yükünü önleyen daha performanslı mesajlar için kullanılabilir .


"Maalesef, DOM'a yalnızca tarayıcının ana JavaScript iş parçacığında erişilebilir" - bu doğru olsa da, WebAssembly öğesinin DOM ile etkileşime girememesinin nedeni bu değildir.
ColinE
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.