V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
afeiche
V2EX  ›  Node.js

node 新手咨询

  •  
  •   afeiche · 2022-05-26 15:11:47 +08:00 · 3750 次点击
    这是一个创建于 912 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    当然现在来说,容器可以解决除硬件环境以外的其他所有问题,更方便一些。
    hronro
        5
    hronro  
       2022-05-26 16:10:11 +08:00
    @lmshl #3 纯计算的话,WASM 可比 native 慢多了,就为了图那么一点部署方便,完全是本末倒置
    shuimugan
        6
    shuimugan  
       2022-05-26 16:28:39 +08:00   ❤️ 1
    docker 多阶段构建,配合 https://github.com/vercel/pkg 打包成单文件二进制,减少 node_modules 庞大的碎片文件对 IO 影响
    afeiche
        7
    afeiche  
    OP
       2022-05-26 16:46:22 +08:00
    @libook 主要是里面的那个开源库我看是需要下载一些类似 openssl 的库,不知道会不会依赖包
    afeiche
        8
    afeiche  
    OP
       2022-05-26 16:46:50 +08:00
    看起来 docker 可能是比较简单的处理方案,毕竟需要涉及本地依赖库
    libook
        9
    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 版本也都会有差异,生产上也需要参考特定场景下的压测数据才能做决策。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2331 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 01:51 · PVG 09:51 · LAX 17:51 · JFK 20:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.