Lexe搭配esbuild/Rollup打包依赖:彻底解决node_modules难题的完整指南
Lexe搭配esbuild/Rollup打包依赖彻底解决node_modules难题的完整指南【免费下载链接】lexePackage your Node.js application into a single executable file, but only 10MB.项目地址: https://gitcode.com/gh_mirrors/le/lexeLexe 是一款把 Node.js 应用打包成单个可执行文件的工具产物仅有 8~10MB。但 Lexe 并不建议直接部署整个 node_modules 目录——本文就是Lexe 依赖打包完整指南教你如何搭配 esbuild / Rollup 打包依赖彻底解决 node_modules 难题几步就得到超小的单文件可执行程序。为什么不能直接把 node_modules 丢给 Lexe很多新手的第一反应是把node_modules整个目录一起拷走让运行时去读。理论上 Lexe 内置了 Node 模块解析器见llrt_core/src/modules/require/resolver.rs运行时也能找到这些依赖但官方明确不推荐这种做法Lexe 面向性能敏感的应用部署 node_modules 前应先做打包bundling、压缩minification和摇树tree-shaking。原因很简单❌体积大未打包的依赖目录动辄几十上百 MB冷启动要加载的文件多❌加载慢运行时逐个解析模块白白增加启动延迟❌浪费大量依赖代码实际用不到却没有被摇掉正确姿势是先用打包器把依赖打进一个 JS 文件再交给 Lexe 打包成可执行文件。✅Lexe 依赖打包的 3 个核心原则无论用哪个打包器记住这 3 条原则就不会错原则说明target 设为 es2023Lexe 运行时基于现代引擎产物必须编译到 ES2023platform 设为 browser避免打包器把 Node 内置模块当依赖打进包里Lexe 已原生提供 fs、path、crypto 等模块external 排除 aws-sdk / smithy这两个包 Lexe 有原生兼容处理排除后运行时加载更快 一句话总结把 node_modules 变成一个文件而不是一个目录。esbuild 一行命令打包依赖最快上手如果你追求效率esbuild 一条命令就够了esbuild index.js --platformbrowser --targetes2023 --formatesm --bundle --minify --external:aws-sdk --external:smithy参数逐一对应上面的 3 个原则。执行后你的入口文件和全部依赖会被合并压缩为单个 ESM 文件默认输出index.js可用--outfilebundle.js指定。Rollup 配置文件怎么写功能更细Rollup 的优势是插件生态和精细控制适合依赖复杂的项目。官方推荐的配置如下import resolve from rollup/plugin-node-resolve; import commonjs from rollup/plugin-commonjs; import terser from rollup/plugin-terser; export default { input: index.js, output: { file: dist/bundle.js, format: esm, sourcemap: true, target: es2023, }, plugins: [resolve(), commonjs(), terser()], external: [aws-sdk, smithy], };三个插件各司其职node-resolve负责解析 node_modules 里的 ESM 依赖commonjs转换 CJS 包terser做最终压缩。Webpack 用户同理target: webmode: productionnodeExternals()即可完整配置可参考项目 README。用 Lexe 原生模块提速常见依赖Lexe 内置了几个与流行 npm 包几乎兼容的原生模块在打包器的 alias 里做替换可以进一步提速你的依赖替换为 Lexe 原生模块uuidllrt:uuidfast-xml-parserllrt:xmlaws-crypto/crc32等 AWS 工具包shims/aws-crypto/目录下的官方垫片⚠️ 官方提示这些原生模块并非 100% 兼容替换前务必充分测试。项目中shims/目录提供了现成的 AWS SDK 兼容垫片如shims/aws-crypto/crc32.js、shims/smithy/util-utf8.js可直接借鉴。Lexe 不直接支持 TypeScript先转译再打包TypeScript 项目要注意Lexe 不支持直接运行 TS必须在部署前完成转译。这其实是优点——转译成本在构建期一次性付清运行时零开销。做法很简单esbuild / Rollup / Webpack 本身就能吃.ts文件把入口指向index.ts产物编译到 ES2023 即可流程与上文完全一致。用 lexe build 打成单文件并验证体积依赖打包完成后最后一步交给 Lexe 本身npx lexe build -iindex.js npx lexe build -iindex.js -obinary -ddist -plinux-x64,windows-x64-i入口文件必填这里就是上一步打包好的 bundle-o/-d输出文件名和目录-p目标平台支持 linux-x64、linux-arm64、darwin-x64、darwin-arm64、windows-x64逗号分隔可一次交叉编译多平台如果要从源码构建可以克隆仓库https://gitcode.com/gh_mirrors/le/lexe仅限 clone 使用。最终效果一个 Hello World 应用的单文件可执行产物约8.31 MB而 Deno 是 64.31 MB、Bun 54.38 MB、pkg 44.14 MB——Lexe 只有它们的八分之一左右。体积小的同时性能也很能打。以 AWS Lambda 上 DynamoDB PutItem 场景为例Lexe 冷启动 p50 仅约64ms而 Node 20 冷启动 p50 高达1500msLexe 依赖打包常见问题Q1为什么要把 aws-sdk、smithy 设为 external它们体量大且 Lexe 对其有原生兼容优化排除后运行时直接走原生路径更快更小。项目自带的shims/目录就是为这些包准备的兼容垫片。Q2http / https 模块能用吗目前 Lexe 暂未完整支持 http/https 模块请用全局的fetch发请求底层网络操作可用net。所以 Lexe 更适合 CLI 工具和 Serverless 函数不太适合自己搭 HTTP 服务。Q3打包后能直接用 node_modules 吗不是不行而是没必要。Lexe 的 Node 解析器可以工作但不打包就丢了 tree-shaking 和压缩的收益官方不推荐。Q4哪些内置模块可以放心用fs/promises、path、crypto、events、buffer、dns、os、util、zlib、timers 等主流模块均支持fs 同步 API、tls 仍在补齐中完整清单见项目 README 的兼容矩阵。小结Lexe esbuild/Rollup 的组合拳只需记住三步打包--platformbrowser --targetes2023 --formatesm --bundle --minify排除 AWS SDK 系依赖加速可选alias 到llrt:uuid、llrt:xml等原生模块借用shims/垫片出包npx lexe build -ibundle.js一个 10MB 左右的单文件可执行程序就诞生了 ✅从此告别发布要带一个 node_modules 目录的时代依赖再多产物依然是一个小小的二进制文件。【免费下载链接】lexePackage your Node.js application into a single executable file, but only 10MB.项目地址: https://gitcode.com/gh_mirrors/le/lexe创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考