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

2022-09-05 19:29:36 +08:00
 fyooo

本人刚学 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

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

4730 次点击
所在节点    Node.js
9 条回复
DiamondYuan
2022-09-05 19:38:54 +08:00
如果你想在服务器上运行,推荐使用 docker

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

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

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

桌面软件比如 Electron 的一般都是有专门的打包工具,可以吧项目代码、依赖和 node 运行环境打包在一起然后分发。
shuimugan
2022-09-06 19:09:22 +08:00
可行啊,我这样做一年多了,打包成单文件丢 alpine/slim 容器,体积小了很多。
比如拿个简单的 NestJS 的程序打包出来也就四十多 MB 吧,丢到 alpine 也就加 5MB 。
好处是在 serverless 环境里避免了 node_modules 大量碎片文件拖慢解压速度,以达到提升冷启动速度的目的。
唯一的缺点是接入 sentry 这种异常监控告警,定位到的代码不那么准。Deno 接下来重点也在兼容 Node.js ,到时又会多一个打包成可执行文件的方案。
zsj1029
2022-09-06 21:56:02 +08:00
可以尝试 dart 重构,近似的语法,一样的单线程异步事件循环,最最重要的像 go 一样的跨平台编译可执行单文件,完美解决痛点,内存占用低媲美 golang ,多了很多实用的迭代器方法,一样的 stream 流控制,再也不为 npm 烦恼了,缺点轮子少

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

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

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

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

© 2021 V2EX