📦 将 Node.js 代码打包成单个可执行二进制文件
Node.js 🐢,这个异步事件驱动的 JavaScript 运行时,对文件系统访问等功能有着无与伦比的支持,开启了无限可能!然而,在某些情况下,如果能够打包出一个可执行的应用程序,就能简化分发和管理交付内容,那么 Node.js 往往会逊色于其他运行时/语言。
虽然有一些组件/方法可以实现这一点,但需要更好地记录和推广,以免这成为在这些情况下使用 Node.js 的障碍。这对于支持 Node.js 在解决方案构建中的应用范围和时机的扩展至关重要。
本文主要探讨Node.js生态系统中的两个主要问题:打包和发行。让我们简要地讨论一下。
打包是指将代码及其所有依赖项合并到一个文件中。这在前端开发中很常见。
然而,与 CJS 相比,使用 ESM 打包格式有一个优势:tree-shaking(摇树优化)。Tree-shaking 的概念是从依赖项中移除未使用的代码。工具:esbuild、parcel、webpack、rollup、terser。
Node.js 中的打包概念是指创建一个包含源代码和 Node.js 运行时环境的单个可执行二进制文件。这样,最终用户无需在计算机上安装 Node.js。
在此过程中,该工具解析源代码,检测对函数的调用require(),遍历依赖关系,并将它们包含在可执行文件中。通常,源代码会使用编译V8引擎编译成字节码。工具:pkg、ncc、nexe。
esbuild捆绑
- 一个速度极快的 JavaScript 和 CSS 打包压缩器
- 最方便
- 速度最快
- 支持 TypeScript 语法、ESM 和 CJS
- 支持 ESM 的摇树优化算法
- 支持压缩和源映射
# Output CommonJS bundle
$ npx esbuild index.js --bundle --outfile=build.cjs \
--format=cjs --platform=node
# Output ESM bundle
# Note that, you may not need the --banner flag.
# But, in some cases, require() and __dirname are needed.
$ npx esbuild index.js --bundle --outfile=build.mjs \
--format=esm --platform=node --banner:js="
import {createRequire} from 'module';
const require = createRequire(import.meta.url);
import { dirname } from 'path';
import { fileURLToPath } from 'url';
const __dirname = dirname(fileURLToPath(import.meta.url));"
pkg包装
- 将您的 Node.js 项目打包成可执行文件。
- 立即生成适用于 Windows、Mac、Linux 等系统的可执行文件
- 无需安装 Node.js 或数百个依赖项
# Packaging tools work best with CJS.
# These tools don't go well with ESM.
# To package into executable, just take the file outputted
# by `esbuild`, and pass it to `pkg`, and we're done!
$ npx pkg build.cjs
此命令将输出 3 个二进制可执行文件build-linux: `<filename> build-macos`、`<filename>` 和build-win.exe`<filename>`。您可能需要运行适用于您平台的可执行文件。现在,您可以轻松地将这些文件分发给最终用户或部署到生产环境——无需安装 Node.js 或任何依赖项——只需这一个文件即可!
感谢阅读!觉得有趣吗?点个赞❤️或🦄吧!有什么想让我写的题材吗?欢迎在评论区留言。
祝你有美好的一天!
文章来源:https://dev.to/midnqp/bundling-nodejs-into-single-executable-binary-l3g