You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:00:40