来自未来的自己:问题是由愚蠢的我提出的,我不知道编译过程以及 Node.js 如何与本机绑定一起工作,未来的我已经完成了本机绑定和 ffi 并改进了问题,使其更“可在谷歌上搜索”并提供最少的见解类似问题。
我见过一些人将应用程序作为可执行文件提供,我想用 Node.js 重现这样的结果,我尝试使用
nexe
和 pkg
工具,它们似乎可以促进我想要存档的结果,但当我尝试使用它们时,我不断遇到应用程序中缺少来自 .node
和 bcrypt
的 realm
文件的问题。
在我寻找解决方案的每个地方,我都看到这个问题的“解决方案”是将
realm
和 bcrypt
从 JavaScript 包中排除,因为它们要么占用太多空间,要么性能不佳,因为它们可以从npm 但想要的结果存档是单个可执行应用程序(SEA),我不知道下一步该做什么。
到 2024 年,
deno
似乎可以很好地处理运行时的捆绑代码,并且 Node.js 本身有一个实验性的 SEA(单一可执行应用程序),它实际上可能接近我最初的问题。所以直到今天,所有使用 Pure-ESM 方法的代码肯定可以通过 deno
来解决 - 我不知道 NAPI 这在 2023 年是一个大问题,但我认为时间会在今年证明。
到了 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/