NodeJS 通过 pkg 打包发布可行吗?
NodeJS 通过 pkg 打包发布可行吗?
本人刚学 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
有点好奇,业界一般是怎么做这个事情的?
如果你想在服务器上运行,推荐使用 docker
如果你想把 nodejs 发给别人,可以试试看 pkg
>原来写 Java 的时候都是打包成 jar 发布的。
你发布的是 java 应用还是 java 库?你说的打包是指把 java 代码编译成 class 字节码然后合并到一个 jar 文件里吗
node 是解释运行,不需要这种类似 java 的打包
node 写好之后,直接发布到到 npm 就行了,别人通过 npm 命令下载你的包。
pkg 是连环境一起打包的, 用于在没有环境的机器跑, 比如说发给别人用.
如果你是在服务器上跑, 直接源码部署 npm install 就行了. 或者弄 docker 里.
Nodejs 这块是一个痛点,一直没有特别好的方案。PKG 也不是万能、傻瓜模式;
如果是自用的产品,请发布代码到服务器后再 npm install 。
如果是要分发给别人(比如开源软件什么的),才比较适合使用 pkg 。我两者方式都用得很熟,我的建议如上。
肯定可以,但我个人很少见到这么干的。
过去一般就是把项目 git clone 或 scp 或 rsync 到服务器的目录上,只要服务器上装了 node ,就可以 npm ci 然后再运行。
现在一般都是容器化 /云原生了,直接打成 docker 镜像,然后 push 和 pull 。
桌面软件比如 Electron 的一般都是有专门的打包工具,可以吧项目代码、依赖和 node 运行环境打包在一起然后分发。
可行啊,我这样做一年多了,打包成单文件丢 alpine/slim 容器,体积小了很多。
比如拿个简单的 NestJS 的程序打包出来也就四十多 MB 吧,丢到 alpine 也就加 5MB 。
好处是在 serverless 环境里避免了 node_modules 大量碎片文件拖慢解压速度,以达到提升冷启动速度的目的。
唯一的缺点是接入 sentry 这种异常监控告警,定位到的代码不那么准。Deno 接下来重点也在兼容 Node.js ,到时又会多一个打包成可执行文件的方案。
可以尝试 dart 重构,近似的语法,一样的单线程异步事件循环,最最重要的像 go 一样的跨平台编译可执行单文件,完美解决痛点,内存占用低媲美 golang ,多了很多实用的迭代器方法,一样的 stream 流控制,再也不为 npm 烦恼了,缺点轮子少
当然可以!使用 pkg
将 Node.js 项目打包成独立的可执行文件是一个常见的做法,特别适用于需要分发应用程序而不想依赖 Node.js 运行环境的场景。以下是一个简单的步骤说明和示例代码:
-
安装
pkg
: 首先,你需要全局安装pkg
。可以通过 npm 完成:npm install -g pkg
-
准备项目: 确保你的 Node.js 项目有一个
package.json
文件,并且入口文件(通常是index.js
或app.js
)已经配置好。 -
配置
package.json
: 在package.json
中,你可以指定bin
字段来定义可执行文件的入口点:{ "name": "my-app", "version": "1.0.0", "bin": "index.js", "scripts": { "start": "node index.js" } }
-
打包项目: 使用
pkg
命令进行打包。例如,要生成适用于 Linux、macOS 和 Windows 的可执行文件,可以运行:pkg . -t node14-linux-x64,node14-macos-x64,node14-win-x64
这将生成三个可执行文件:
my-app-linux
,my-app-macos
, 和my-app-win.exe
。 -
分发: 现在你可以将生成的可执行文件分发给用户,他们无需安装 Node.js 即可运行你的应用程序。
通过这种方式,你可以轻松地将 Node.js 项目打包成独立的可执行文件,便于分发和部署。