logo科技微讯

使用 esbuild 打包压缩云函数代码

作者:科技微讯
日期:2022-12-13
📝 笔记

Node.js 项目通常有一个体积较大的 node_modules 文件夹,它会带来以下问题:

  • 里面包含了所有非 dev 和 dev 的 dependency,部署前需要执行 npm prune --production 删除 dev 依赖,开发的时候又要重新装回来,有点麻烦;
  • 增加了上传代码的耗时;
  • 增加了函数冷启动的耗时;
  • 增加了函数执行的耗时;

为了解决以上问题,可使用 esbuild 打包并压缩代码,esbuild 有 tree shaking 功能,没用到的依赖不会打包进来,打包完还能 minify 一下,最后得到的代码体积将显著降低。

使用 esbuild 压缩函数代码非常简单,就一行:

esbuild ./dist/index.js --bundle --minify --platform=node --target=node14.18 --outfile=index.js
  • ./dist/index.js:入口文件
  • --bundle:告诉 esbuild 要会把所有代码打包成一个文件;
  • --minify:告诉 esbuild 要对代码 minify 一下,进一步压缩代码体积;
  • --platform=node:告诉 esbuild 最后生成的代码将运行在 Node.js,esbuild 默认针对浏览器打包;
  • --target=node14.18:告诉 esbuild 要把代码编译成兼容 node14.18 的语法,而不是 node 16、18 这些高版本或 node 10、12 这些低版本的语法;
  • --outfile=index.js:告诉 esbuild 把打包好的文件命名为 index.js;

上面这条命令也适用于 typescript,当然入口文件要改一下后缀。但 esbuild 只是编译、打包、压缩代码,并不支持 type checking,所以建议先执行 tsc -noEmit。除了不支持 type checking,esbuild 打包 ts 代码还有若干其他限制,所以另一种做法是用 tsc 先编译出 js 代码,然后用 esbuild 对 js 进行打包,缺点是 tsc 速度较慢,最后得到的代码体积也大一点点。

使用 esbuild 打包后,代码体积可能会缩小 100 倍以上,函数冷启动时间也可能提高 1 ~ 2 倍


参考文章:

donation赞赏
thumbsup0
thumbsdown0
暂无评论