文章摘要
WebAssembly(Wasm)虽然自设计之初就与JavaScript严格分离,且核心字节码格式不包含JavaScript的“遗留”特性,但它仍然是Web平台的一部分。尽管Wasm可能永远不会直接访问DOM,但它已经通过间接调用支持与DOM的交互,因此Wasm已准备好用于各种Web集成应用。
文章总结
WebAssembly何时能支持DOM?
WebAssembly(Wasm)自诞生以来,一直以其高性能和跨平台特性受到广泛关注。然而,尽管Wasm在浏览器中的应用逐渐增多,它仍然缺乏对DOM的直接支持。本文探讨了Wasm与DOM集成的现状、挑战以及未来的可能性。
Wasm与JavaScript的集成
Wasm最初设计时,便与JavaScript保持了严格的分离。与asm.js不同,Wasm的核心字节码格式完全独立于JavaScript的“遗留”特性。然而,Wasm作为Web平台的一部分,仍然需要通过JavaScript与DOM等Web API进行交互。目前,Wasm通过调用JavaScript的“胶水代码”间接访问DOM,这种方式虽然有效,但并非直接支持。
Wasm的设计理念
Wasm的设计目标是通过减少间接调用来提升性能,而不是完全消除JavaScript。尽管Wasm的核心逻辑可以通过编译工具链生成,但JavaScript仍然在Wasm与Web API之间扮演着桥梁角色。这种设计借鉴了asm.js的成功经验,并避免了类似Chrome NaCl项目的失败。
Wasm的演进
Wasm正在逐步增加对异常处理、阻塞操作和垃圾回收等功能的原生支持。例如,Wasm已经支持原生异常抛出和捕获,以及暂停执行以等待JavaScript Promise的能力。此外,Wasm还在探索如何更高效地处理垃圾回收,减少与JavaScript之间的数据复制。
直接访问DOM的可能性
尽管Wasm社区一直在讨论通过“组件模型”实现更直接的Web API访问,但目前尚未有明确的进展。Web IDL(接口描述语言)作为Web API的基础,虽然理论上可以用于Wasm绑定,但由于其与JavaScript的紧密耦合,实现起来并不简单。此外,浏览器厂商目前并未积极推动这一方向。
未来的方向
Wasm的标准化工作由W3C Wasm社区组负责,任何新特性的加入都需要经过严格的设计、原型开发和共识达成。未来,Wasm可能会通过组件模型或工具链的改进,进一步减少与JavaScript的交互,但短期内,JavaScript仍将是Wasm与Web API之间的主要桥梁。
结论
对于开发者而言,Wasm的核心价值在于能够将C#、Go、Python等语言的库或应用高效地运行在Web平台上,而不是完全摆脱JavaScript。尽管Wasm尚未实现对DOM的直接支持,但现有的工具链已经能够满足大多数Web应用的需求。未来,随着Wasm的不断演进,其在Web开发中的地位将更加重要。
评论总结
评论内容总结:
WebAssembly(WASM)的现状与挑战:
- 许多评论者认为WASM的进展缓慢,尤其是在与Web的集成方面。尽管有进步,但WASM如何与Web无缝结合仍不明确,且需要大量的胶水代码来桥接系统。
- 引用:"It felt like there was a plan for good integration, but fast forward half a decade+ and there's been so so much progress and integration but it's still so unclear how WebAssembly is going to alloy the web."(评论1)
- 引用:"The whole WASM story is confusing to me."(评论2)
- 许多评论者认为WASM的进展缓慢,尤其是在与Web的集成方面。尽管有进步,但WASM如何与Web无缝结合仍不明确,且需要大量的胶水代码来桥接系统。
WASM与DOM的交互问题:
- 许多开发者希望WASM能够直接访问DOM,但目前WASM与DOM的交互仍然依赖于JavaScript,导致性能损失和复杂性增加。
- 引用:"I want DOM access from WASM, but I don't want WASM to have to rely on UTF-16 to do it."(评论4)
- 引用:"Everything has to pass the JavaScript barrier before it hits the browser. It's so annoying!"(评论17)
- 许多开发者希望WASM能够直接访问DOM,但目前WASM与DOM的交互仍然依赖于JavaScript,导致性能损失和复杂性增加。
WASM的工具与生态系统:
- 一些评论者提到现有的工具(如wasm-bindgen、Emscripten的embind)虽然有助于WASM与JavaScript的交互,但仍然存在性能问题和复杂性。
- 引用:"You need a lot of inherently slow and unsafe glue code to make anything work."(评论2)
- 引用:"Emscripten has a handy tool called 'embind' for binding JavaScript/TypeScript and C/C++/whatever code."(评论20)
- 一些评论者提到现有的工具(如wasm-bindgen、Emscripten的embind)虽然有助于WASM与JavaScript的交互,但仍然存在性能问题和复杂性。
WASM的未来与潜在应用:
- 一些评论者对WASM的未来持乐观态度,认为它有潜力彻底改变Web和桌面GUI开发,但目前仍局限于单线程的利基用例。
- 引用:"Wasm is the perfect example of this - it has the potential to revolutionize web (and desktop GUI) development but it hasn't progressed beyond niche single threaded use cases in basically 10 years."(评论13)
- 引用:"Maybe by 2030 wasm & wasm-components will be doing well enough that browsers will finally rejoin the party & start implementing new."(评论1)
- 一些评论者对WASM的未来持乐观态度,认为它有潜力彻底改变Web和桌面GUI开发,但目前仍局限于单线程的利基用例。
WASM与JavaScript的关系:
- 一些开发者认为WASM不应被视为JavaScript的替代品,而是应专注于其核心优势,如高性能计算和跨平台兼容性。
- 引用:"WASM was never intended or positioned to be a JavaScript replacement so it doesn't get used very often."(评论15)
- 引用:"Maybe we should stop overdesigning things and keep it simple. WASM needs more tooling around primitive types, threading, and possibly a more flexible memory layout than what we have now."(评论16)
- 一些开发者认为WASM不应被视为JavaScript的替代品,而是应专注于其核心优势,如高性能计算和跨平台兼容性。
总结:WASM在Web开发中的应用前景广阔,但其与DOM的交互、工具链的完善以及生态系统的成熟度仍然是主要挑战。开发者对其未来持谨慎乐观态度,期待更多创新和优化。