News Hacker|极客洞察

48 7 小时前 wasmer.io
🤔Edge.js:Node.js 进 WebAssembly 沙箱,支持可插拔 JS 引擎
既然号称全兼容,为什么命令还像猜谜?

🎯 讨论背景

Edge.js 是 Wasmer 推出的方案,目标是把 Node.js 应用带到更受限的边缘和浏览器环境。它的卖点是在 `--safe` 模式下依赖 WebAssembly(WASM,一种可跨平台运行的字节码格式),同时保留对 Node.js 生态的高兼容性,并通过可插拔的 JavaScript engine 适配不同引擎。评论区主要在追问它能否落到 Electron、iOS、浏览器以及类似 WebContainers 或 BrowserPod(浏览器内开发环境方案)这样的场景。另一个焦点是它到底是 Node replacement、CLI 包装器,还是一种把部分能力留给原生引擎、其余放进 WASM 的混合运行时。

📌 讨论焦点

浏览器、Electron 与 iOS 的沙箱运行

很多人把 Edge.js 往浏览器、Electron 和 iOS 这些受限环境上联想,重点不是“能不能跑”,而是“跑起来后怎么隔离宿主能力”。有人问能否在 Electron 里直接借用 V8,给 LLM 生成代码一个更强的 sandbox;也有人问 iOS 上怎么处理文件系统和网络访问,以及能否挂自定义 handler。另一条线是把它类比成 WebContainers,希望在浏览器里直接跑 Node.js,并把 `fs` 做成内存实现、禁掉 fork 之类的能力。项目方的回应是,目标确实包括在浏览器里完整运行 Node.js apps,而且兼容性会比现有替代方案更强。

[来源1] [来源2] [来源3] [来源4] [来源5]

安全模式、WebAssembly 与文件系统隔离

项目介绍强调 Edge.js 是在很短时间内做出来的,背后大量使用了 AI 和 Codex;它在 `--safe` 模式下通过 WebAssembly 运行,并声称对非 VM 模块能通过 Node.js 的 spec tests。与此同时,它还提供可插拔的 JS engine 架构,可以在 V8、JavaScriptCore、SpiderMonkey、QuickJS、Hermes 等之间切换。评论里最直接的问题是:既然都叫安全模式,为什么不是默认开启,以及 `fs` 这种模块在完全 sandbox 后到底还能读什么。回复给出的关键细节是,默认只暴露当前工作目录,以便本地开发时不需要额外参数,而 `process.cwd()` 在安全与非安全模式下的表现也不同。

[来源1] [来源2] [来源3] [来源4]

文档与命令语义不清

有评论把这个项目理解成对 Node.js 的一种重构:底层换成标准化的 JS engine interop API,再加上 Wasmer CLI,把 JavaScript 交给 V8,而其他部分留在 WebAssembly 里。问题在于,文档和示例没有把这个执行模型讲清楚,所以读起来像是一个 Node replacement,又像是一个能调用 node、npm、pnpm 的统一入口。像 `edge server.js`、`edge node myfile.js`、`edge npm install`、`edge pnpm run dev` 这些例子,让人不清楚到底是运行脚本、转发子命令,还是做包管理器包装。后续追问进一步暴露出困惑:依赖装到哪里、`edge node myfile.js` 和 `edge myfile.js` 有什么区别,当前说明都没有交代透。

[来源1] [来源2] [来源3]

兼容性图表与产品定位被质疑

有评论认为,展示 Edge.js 在 Node.js compatibility 图表上高于 Deno 和 Bun 的做法有误导性,因为“API 上支持”并不等于“真实应用和库能在生产中跑通”。这种质疑不是否定技术本身,而是强调基准口径要更严格:能通过接口测试,不代表能承载完整生态。另一个批评点是,Deno 和 Bun 至少是在响应用户需求,而 Edge.js 看起来更像是在把所有东西都实现一遍,不管现实需求是否存在。换句话说,这位评论者觉得它展示的是一种架构选择,而不是已经被市场验证的明显优势。

[来源1]

📚 术语解释

WebAssembly(WASM): 一种可在浏览器、服务器和其他运行时中执行的低级字节码格式,常用于沙箱隔离和跨平台执行。

--safe 模式: Edge.js 的安全运行模式,启用 WebAssembly 沙箱并限制宿主环境暴露面。

可插拔 JS engine 架构: 允许在 V8、QuickJS、SpiderMonkey、Hermes 等不同 JavaScript 引擎之间切换的设计。