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

NodeJS 通过 pkg 打包发布可行吗?

  •  
  •   fyooo · 2022-09-05 19:29:36 +08:00 · 4990 次点击
    这是一个创建于 846 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人刚学 NodeJS 不久,原来写 Java 的时候都是打包成 jar 发布的。

    写 NodeJS 的时候,看到的建议是发布代码到服务器后再 npm install ,比如 https://blog.csdn.net/shenxianhui1995/article/details/113546917

    发现十年前有人问过这个问题了: https://cnodejs.org/topic/4fffea1b4764b7290275b39a

    近年有人提出用 pkg ,比如:

    https://juejin.cn/post/6982133816001462285

    https://zhuanlan.zhihu.com/p/113204537

    有点好奇,业界一般是怎么做这个事情的?

    9 条回复    2022-09-06 21:56:02 +08:00
    DiamondYuan
        1
    DiamondYuan  
       2022-09-05 19:38:54 +08:00 via iPhone   ❤️ 1
    如果你想在服务器上运行,推荐使用 docker

    如果你想把 nodejs 发给别人,可以试试看 pkg
    lisongeee
        2
    lisongeee  
       2022-09-05 19:51:18 +08:00
    >原来写 Java 的时候都是打包成 jar 发布的。
    你发布的是 java 应用还是 java 库?你说的打包是指把 java 代码编译成 class 字节码然后合并到一个 jar 文件里吗
    node 是解释运行,不需要这种类似 java 的打包
    pytth
        3
    pytth  
       2022-09-05 19:58:30 +08:00 via iPhone
    node 写好之后,直接发布到到 npm 就行了,别人通过 npm 命令下载你的包。
    zhuweiyou
        4
    zhuweiyou  
       2022-09-05 20:05:02 +08:00   ❤️ 1
    pkg 是连环境一起打包的, 用于在没有环境的机器跑, 比如说发给别人用.

    如果你是在服务器上跑, 直接源码部署 npm install 就行了. 或者弄 docker 里.
    humbass
        5
    humbass  
       2022-09-05 22:00:27 +08:00   ❤️ 1
    Nodejs 这块是一个痛点,一直没有特别好的方案。PKG 也不是万能、傻瓜模式;
    star7th
        6
    star7th  
       2022-09-05 22:48:43 +08:00   ❤️ 1
    如果是自用的产品,请发布代码到服务器后再 npm install 。
    如果是要分发给别人(比如开源软件什么的),才比较适合使用 pkg 。我两者方式都用得很熟,我的建议如上。
    libook
        7
    libook  
       2022-09-06 10:23:13 +08:00   ❤️ 1
    肯定可以,但我个人很少见到这么干的。

    过去一般就是把项目 git clone 或 scp 或 rsync 到服务器的目录上,只要服务器上装了 node ,就可以 npm ci 然后再运行。
    现在一般都是容器化 /云原生了,直接打成 docker 镜像,然后 push 和 pull 。

    桌面软件比如 Electron 的一般都是有专门的打包工具,可以吧项目代码、依赖和 node 运行环境打包在一起然后分发。
    shuimugan
        8
    shuimugan  
       2022-09-06 19:09:22 +08:00   ❤️ 1
    可行啊,我这样做一年多了,打包成单文件丢 alpine/slim 容器,体积小了很多。
    比如拿个简单的 NestJS 的程序打包出来也就四十多 MB 吧,丢到 alpine 也就加 5MB 。
    好处是在 serverless 环境里避免了 node_modules 大量碎片文件拖慢解压速度,以达到提升冷启动速度的目的。
    唯一的缺点是接入 sentry 这种异常监控告警,定位到的代码不那么准。Deno 接下来重点也在兼容 Node.js ,到时又会多一个打包成可执行文件的方案。
    zsj1029
        9
    zsj1029  
       2022-09-06 21:56:02 +08:00 via iPhone
    可以尝试 dart 重构,近似的语法,一样的单线程异步事件循环,最最重要的像 go 一样的跨平台编译可执行单文件,完美解决痛点,内存占用低媲美 golang ,多了很多实用的迭代器方法,一样的 stream 流控制,再也不为 npm 烦恼了,缺点轮子少
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1113 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:03 · PVG 02:03 · LAX 10:03 · JFK 13:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.