Node.js用archiver部署AWS Lambda:按需打包生产依赖
解决Lambda函数打包生产依赖并排除指定包的问题
我来帮你搞定这个打包配置的需求!要实现只打包生产依赖、排除aws-sdk和archiver,同时忽略打包脚本本身,我们可以通过两种思路来实现,下面分别详细说明:
方法一:在打包代码中动态筛选生产依赖(推荐)
这种方法不需要修改本地的node_modules目录,直接通过代码读取package.json来筛选需要包含的生产依赖,配合archiver的glob规则实现精准打包。
步骤1:编写打包逻辑(publish.js)
在你的打包脚本中,先读取package.json提取生产依赖,排除不需要的包,再配置archiver的包含/排除规则:
const fs = require('fs'); const archiver = require('archiver'); // 读取项目的package.json const packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf8')); // 提取生产依赖列表,排除aws-sdk和archiver const allowedProdDeps = Object.keys(packageJson.dependencies || {}) .filter(dependency => !['aws-sdk', 'archiver'].includes(dependency)); // 定义要包含的核心文件/目录(根据你的项目结构调整) const coreFiles = [ 'index.js', // Lambda函数入口文件 'src/**/*', // 你的业务代码目录(如果有) 'package.json' // 可选,如果你需要在Lambda中读取依赖信息 ]; // 定义要排除的文件/目录 const excludePatterns = [ 'publish.js', // 打包脚本本身 'node_modules/aws-sdk/**/*', // 排除AWS SDK(Lambda环境自带) 'node_modules/archiver/**/*', // 排除打包工具archiver 'package-lock.json', // 可选,不需要的话可以排除 '.git/**/*', // 排除Git相关文件 '.env' // 排除环境变量文件(如果有) ]; // 初始化归档工具 const output = fs.createWriteStream('./lambda-deploy.zip'); const archive = archiver('zip', { zlib: { level: 9 } }); // 监听归档事件 output.on('close', () => { console.log(`✅ 打包完成!总大小:${(archive.pointer() / 1024 / 1024).toFixed(2)} MB`); }); archive.on('error', (err) => { console.error('❌ 打包失败:', err); throw err; }); // 开始打包 archive.pipe(output); // 添加核心业务文件 coreFiles.forEach(pattern => { archive.glob(pattern, { ignore: excludePatterns }); }); // 添加筛选后的生产依赖 allowedProdDeps.forEach(dep => { archive.glob(`node_modules/${dep}/**/*`, { ignore: excludePatterns }); }); // 完成归档 archive.finalize();
为什么这么做?
- 动态读取
package.json的dependencies,确保只包含生产依赖 - 明确排除
aws-sdk(Lambda运行时自带,无需打包)和archiver(仅用于打包,不需要部署到Lambda) - 不需要修改本地依赖环境,打包完成后开发依赖依然保留
方法二:先安装生产依赖再打包
如果你更倾向于用命令行流程实现,可以先清理本地依赖,只安装生产依赖,再打包,最后恢复开发依赖:
步骤1:编写自动化脚本(比如package.json的scripts)
在package.json中添加打包脚本:
{ "scripts": { "package:lambda": "rm -rf node_modules && npm ci --only=production && node publish.js && npm install" } }
步骤2:修改publish.js的glob规则
因为已经只安装了生产依赖,此时只需要排除aws-sdk和打包脚本即可:
// 在publish.js中简化glob规则 archive.glob('**/*', { ignore: [ 'publish.js', 'node_modules/aws-sdk/**/*', 'package-lock.json', '.git/**/*' ] });
注意事项
npm ci --only=production会严格按照package-lock.json安装生产依赖,确保依赖版本一致- 最后执行
npm install会恢复开发依赖,不影响后续开发 - 这种方法适合依赖较少的项目,打包速度更快
验证打包结果
打包完成后,你可以解压lambda-deploy.zip查看:
- 只包含你的业务代码和筛选后的生产依赖
- 没有
aws-sdk、archiver、devDependencies中的包 - 打包脚本
publish.js被排除
内容的提问来源于stack exchange,提问作者Sid
相关产品推荐
相关产品推荐

