如何将node.js编译为二进制版本(带有原生模块)

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

目前,我正在尝试构建 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

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

编辑 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.