如何处理Lodash npm包体积过大问题?适配AWS Lambda场景
嘿,太懂你这种“回归老领域发现规则变了”的困惑了!当年我也遇到过类似情况——明明lodash源码看着不大,装完node_modules却胖了一圈,还把Lambda的调试功能搞挂了。先给你拆解下原因:你看到的260KiB是lodash核心源码的大小,但npm install默认会把整个包拉下来,包括测试文件、文档、配置、甚至一些内部依赖的辅助文件,这些加起来就凑成了4.8MiB的体积。
下面是2019年当时最实用的几种解决方法,都是我当年实际用过的:
按需安装单个lodash子模块:如果你只用到lodash的某几个功能(比如
get、debounce),别装全量的lodash,直接装对应的子包,比如npm install lodash.get。每个子包体积只有几KiB,能大幅减少依赖总量。导入的时候直接写const get = require('lodash.get')就行,完全不影响功能。用Tree Shaking配合ES模块版lodash:2019年Webpack 4已经支持成熟的Tree Shaking了,你可以装
lodash-es(lodash的ES模块版本),然后在代码里按需导入:import { get, debounce } from 'lodash-es'。再把Webpack的mode设为production,它会自动剔除你没用到的代码,最终打包出来的体积会接近你预期的260KiB(甚至更小,因为还会压缩)。生产环境安装剔除冗余文件:安装依赖时加上
--production参数:npm install lodash --production,这样npm不会安装lodash的开发依赖(比如测试工具、构建脚本)。如果已经装完了,也可以运行npm prune --production来删除开发依赖,能砍掉一部分不必要的文件。自定义构建lodash:用
lodash-cli工具自己打包只包含你需要的函数的版本。先装npm install -g lodash-cli,然后运行类似lodash include=get,debounce,map的命令,它会生成一个自定义的lodash文件,体积只有几十KiB,完全没有冗余内容。针对AWS Lambda的打包优化:
- 用Serverless Framework的
serverless-webpack插件,它会自动帮你把代码和必要的依赖打包成一个最小化的zip包,只包含Lambda运行需要的文件,而不是整个node_modules。 - 如果不用Serverless,也可以手动用Webpack或Parcel打包成单个文件,然后只上传这个打包后的文件和必要的配置,跳过整个node_modules目录。
- 用Serverless Framework的
这些方法在2019年都是经过验证的,不管是减少本地node_modules体积,还是解决Lambda部署包过大的问题,都能见效。当时我用Tree Shaking配合Serverless Webpack,把Lambda包从5MiB压到了800KiB,控制台的编辑调试功能立刻就恢复了。
内容的提问来源于stack exchange,提问作者fortran

