目前,我正在尝试构建 Node.js 项目(不同的捆绑器和其他类型的东西)。我有一个简单的想法,即将 Node.js 捆绑到 Linux、macOS 或 Windows 的单个二进制文件中。
有两个包
nexe
和 pkg
它们都不真正支持 .node
或 bcrypt
等包使用的本机 realm
模块。您是否进行过类似的编译?我会非常高兴看到一些现实世界的例子(我在 GitHub 上找不到它们)。
但是……为了什么? 这更像是一个有趣的想法,我们可以使用 Node.js 来存档。即使它可以工作(我让它在没有本机模块的
cjs
包上工作) hello wold 示例项目的大小可能超过 30MB。
一个很酷的观察是
@vercel/ncc
能够将我的项目编译到单个目录中,但如果没有node_modules
它也无法工作(可能,我没有环境来测试它)
更新 V1:在此类项目中构建
realm
是不可能的,最简单的解决方案是不在 realm
应用程序中使用 node
,因为它会使二进制构建崩溃(这是因为 realm
正在使用大量其他软件包,例如 electron
或 react-native
,在桌面平台上根本不起作用。
我的代码可在以下存储库中找到:https://github.com/keinsell/typecraft
到了 2023 年,发布了一个新的运行时,称为
bun
它似乎能够将项目编译成类似二进制的格式,但是 CJS/ESM 兼容性问题仍然相同,并且 NAPI 也没有得到很好的支持。
经过几天努力研究
pkg
如何工作并寻找潜在的替代品,我发现caxa
对我来说效果很好,并且在路上,我也让pkg
与(实际上只在 bcrypt
)本机模块上进行了测试。我对使用 pkg
构建 Node.js 二进制文件的核心见解是:
win
主机的 windows
包,来自 mac
主机的 macos
等require()
函数(如下所示)或在 pkg.assets
中使用 package.json
对象 - 我不太明白,但它包含在我的问题中 vercel/pkg
- vercel/pkg#1473+ require('bcrypt/lib/binding/napi-v3/bcrypt_lib.node')
export async function main() { /* ... */ }
一些模块仍然会崩溃,最好的例子是
realm
,但我仍然会寻找一种构建它并将其包含到 Node.js 二进制应用程序中的方法。我研究 Node.js 构建的所有进展都将在 https://github.com/keinsell/typecraft 上提供,并且这个 StackOverflow 答案将随着时间和我的新发现而更新。
阅读此资源的示例,您将能够将其编译为二进制版本。当然,nexe 是必要的,但是使用 pty.js,您可以使用所有本机库成功编译它。看一下来源:https://www.jedi.be/blog/2013/05/14/compiling-packaging-a-nodejs-project-as-a-single-binary/