node 新手咨询

2022-05-26 15:11:47 +08:00
 afeiche

刚刚使用 node ,项目有 c++的 addon ,这种一般是怎么发布到生产环境?是不是起一个本地的虚拟机,对应生产环境的操作系统,然后 npm install 之后,拷贝上去?

3602 次点击
所在节点    Node.js
9 条回复
lmshl
2022-05-26 15:40:53 +08:00
docker 多阶段构建
一阶段构建环境,装 node gcc 等 devel ,编译出 addon 来。如果有 webpack / vite 任务也应当在这个阶段执行。
二阶段运行环境,把一阶段生成的文件拷贝进来,作为最终镜像

最后去生产环境 pull 下来 docker run
lmshl
2022-05-26 15:42:59 +08:00
如果生产环境 arch / os 和你本地不一样,甚至 node / v8 版本不一样,最后生成的 addon 都是不兼容的,搞交叉编译不如 docker 发布。
lmshl
2022-05-26 15:44:26 +08:00
当然如果你 C++ 代码没有涉及系统调用,就是纯计算的话,还可以迁移到 WASM 实现上去,就不用操心 arch / os 兼容问题了。
libook
2022-05-26 16:01:29 +08:00
题主的方案是可以的,我们以前用过这种方案,前提是编译环境和生产环境的硬件架构、系统、依赖包、Node 版本等都一致,或者很明确是兼容的。

当然现在来说,容器可以解决除硬件环境以外的其他所有问题,更方便一些。
hronro
2022-05-26 16:10:11 +08:00
@lmshl #3 纯计算的话,WASM 可比 native 慢多了,就为了图那么一点部署方便,完全是本末倒置
shuimugan
2022-05-26 16:28:39 +08:00
docker 多阶段构建,配合 https://github.com/vercel/pkg 打包成单文件二进制,减少 node_modules 庞大的碎片文件对 IO 影响
afeiche
2022-05-26 16:46:22 +08:00
@libook 主要是里面的那个开源库我看是需要下载一些类似 openssl 的库,不知道会不会依赖包
afeiche
2022-05-26 16:46:50 +08:00
看起来 docker 可能是比较简单的处理方案,毕竟需要涉及本地依赖库
libook
2022-05-26 18:44:32 +08:00
@afeiche #7 编译 addon 的时候可能会依赖一些 C/C++的库,这些库可以用操作系统的包管理器安装,也可以手动安装到正确的位置,甚至自己编译。

正常情况下,module 的编译问题,其开发者应该都会妥善解决,你执行 npm install 的时候至多会出现库不存在需要自己在系统环境中安装,这个去 Google 一下应该也不难。

但毕竟这块耦合了 C/C++技术栈,说不准会出现一些开发者没有妥善解决的问题,而这些问题通常 Node 应用开发者又解决不了。

如果不得不用 Addon 的话,建议尽量使用知名的、成熟的,有问题也可以去翻翻 Issue 或自己提一个 Issue 。

@hronro #5 WASM 、C/C++ Addons 、N-API 在不同场景下表现的性能也不大一样,不同的编译器、不同的 Node 版本也都会有差异,生产上也需要参考特定场景下的压测数据才能做决策。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/855452

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX