magik.net旗下的AI编码工具Fable,把开源参数化CAD软件FreeCAD整体编译成WebAssembly,装进了浏览器标签页。

这套软件不小:约150万行C++加70万行Python,合计220万行代码。首次加载要下载约96MB经Brotli压缩的资源包。目前只有Chrome和Edge的137及以上版本能打开——demo里那个被挖了圆柱孔的立方体,Firefox和Safari用户暂时看不到。

这不是FreeCAD官方发布的云端版本。移植由magik.net和Fable主导完成,跟FreeCAD项目本身没有官方关联。更准确的说法是:一次技术验证,证明体量最大的开源工程软件也能塞进浏览器沙盒,同时把浏览器承载复杂生产力软件的边界摆到了台面上。

FreeCAD比LibreCAD、OpenSCAD重一个数量级

magik此前做过两次同类移植。先是LibreCAD,一个纯2D制图工具;再是OpenSCAD,脚本化建模软件。FreeCAD不一样,它是平台级软件。

移植项目软件类型复杂度定位
LibreCAD2D制图单一功能
OpenSCAD脚本化建模中等复杂度
FreeCAD完整参数化CAD平台220万行代码,17+工作台

FreeCAD底层是工业级几何内核OpenCASCADE,加上Coin3D场景图、完整的CPython 3.14解释器、PySide6的Qt绑定,还有FEM有限元模块专用的VTK和SMESH。外加17个以上的工作台:Sketcher、PartDesign、TechDraw、Assembly、BIM……

三次WebAssembly移植,体量差一个数量级 LibreCAD 2D 制图 OpenSCAD 脚本化建模 FreeCAD 220万行

这几乎是把一整个工业软件栈静态链接进单个wasm模块,之前没人做成过。PySide6在wasm上跑起来,让Python代码真正驱动出一个C++层的Qt主窗口,这部分单独花了数周时间——不是四天里顺带完成的。

浏览器里没有dlopen,也没有多线程

浏览器沙盒缺的东西,FreeCAD偏偏都依赖。

FreeCAD的C++模块原本靠dlopen运行时加载。wasm里没有这个机制,只能全部静态链接,手动注册到Python的inittab。

FreeCAD还大量使用QDialog::exec()弹模态对话框,C++端185处,Python端156处。要保留这套阻塞语义,只能靠WebAssembly JSPI(JavaScript Promise Integration)挂起整个wasm执行栈。这正是目前只有Chromium实现的新特性,Firefox和Safari都还没跟上。

浏览器没有dlopen、没有子进程、没有传统OpenGL,FreeCAD的每一处桌面假设都得被重写一遍。

渲染这块更麻烦。Coin3D场景图走的是1990年代那套固定管线OpenGL(glBegin/glVertex那种写法),WebGL2根本不认这些调用。只能手写一层近900行的模拟层,才能把三维视图正确显示出来。

FEM模块依赖的VTK和SMESH,一度被直接砍掉再补回来。过程中还踩中过一个ABI不一致的坑:VTK内置的expat库和调用方对XML_Size是32位还是64位理解不一样,读取结果文件时直接触发运行时崩溃。这些细节说明,这不是几天糙活能糊弄过去的移植。

谁该关心,谁该观望

从Hacker News帖子算起到能跑通,magik花了大约4天。但这个数字容易误导人——PySide6的wasm适配是单独耗时数周的子项目。

首次加载96MB压缩包,最终wasm模块体积达196MB。单线程运行导致Sketcher约束求解器这类原本跑在独立线程上的功能,被迫改成同步执行。

浏览器能否打开
Chrome 137+可以
Edge 137+可以
Firefox暂不支持(JSPI未实现)
Safari暂不支持(JSPI未实现)

开源CAD、CAE开发者可以把这套经验直接拿去用:静态链接替代dlopen、WebGL2固定管线模拟、IndexedDB做配置持久化。这些方案比“FreeCAD能在浏览器打开”本身更有参考价值。

普通CAD用户不用因此动心思。日常工程图纸该用桌面版还得用桌面版,96MB首包和单线程约束求解器,暂时撑不起生产级工作流。

接下来值得盯的,是Firefox和Safari什么时候补上JSPI。这决定了它能不能走出Chromium孤岛,也决定了它是昙花一现的演示,还是能沉淀成一条可复用的技术路线。

【锐评】浏览器装得下工程软件的巨兽,不代表巨兽能在浏览器里跑得从容自如。