如何将 Node.js 应用程序与本机模块 (NAPI) 捆绑到单个可执行应用程序 (SEA)?

问题描述 投票:0回答:2

来自未来的自己:问题是由愚蠢的我提出的,我不知道编译过程以及 Node.js 如何与本机绑定一起工作,未来的我已经完成了本机绑定和 ffi 并改进了问题,使其更“可在谷歌上搜索”并提供最少的见解类似问题。

我见过一些人将应用程序作为可执行文件提供,我想用 Node.js 重现这样的结果,我尝试使用

nexe
pkg
工具,它们似乎可以促进我想要存档的结果,但当我尝试使用它们时,我不断遇到应用程序中缺少来自
.node
bcrypt
realm
文件的问题。

在我寻找解决方案的每个地方,我都看到这个问题的“解决方案”是将

realm
bcrypt
从 JavaScript 包中排除,因为它们要么占用太多空间,要么性能不佳,因为它们可以从npm 但想要的结果存档是单个可执行应用程序(SEA),我不知道下一步该做什么。

node.js typescript electron realm bcrypt
2个回答
3
投票

编辑 2024 年

到 2024 年,

deno
似乎可以很好地处理运行时的捆绑代码,并且 Node.js 本身有一个实验性的 SEA(单一可执行应用程序),它实际上可能接近我最初的问题。所以直到今天,所有使用 Pure-ESM 方法的代码肯定可以通过
deno
来解决 - 我不知道 NAPI 这在 2023 年是一个大问题,但我认为时间会在今年证明。

编辑 2023 年

到了 2023 年,发布了一个新的运行时,称为

bun
它似乎能够将项目编译成类似二进制的格式,但是 CJS/ESM 兼容性问题仍然相同,并且 NAPI 也没有得到很好的支持。


经过几天努力研究

pkg
如何工作并寻找潜在的替代品,我发现
caxa
对我来说效果很好,并且在路上,我也让
pkg
与(实际上只在
bcrypt
)本机模块上进行了测试。我对使用
pkg
构建 Node.js 二进制文件的核心见解是:

  • 在 CI 上使用矩阵构建来构建包 ex。来自
    win
    主机的
    windows
    包,来自
    mac
    主机的
    macos
  • 请务必将本机模块包含到资产中(您可以在 JavaScript 中使用
    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 答案将随着时间和我的新发现而更新。


0
投票

阅读此资源的示例,您将能够将其编译为二进制版本。当然,nexe 是必要的,但是使用 pty.js,您可以使用所有本机库成功编译它。看一下来源:https://www.jedi.be/blog/2013/05/14/compiling-packaging-a-nodejs-project-as-a-single-binary/

© www.soinside.com 2019 - 2024. All rights reserved.