我正在尝试找出如何减小 ssr 应用程序(next.js 和无服务器框架)的包大小,使其低于 250MB AWS 限制:
An error occurred: ServerLambdaFunction - Unzipped size must be smaller than 262144000 bytes (Service: AWSLambdaInternal; Status Code: 400;
该应用程序是通过运行 next build && sls deploy
来部署的
解压后的存档大小为 600MB 以上,是 AWS 允许 lambda 的 250MB 的两倍多。以下是 node_modules 中最大依赖项的列表。我可以看到,我可以通过将几个依赖项移至开发依赖项来稍微减少它,但这并不能解决问题。
如果有人能指出我正确的方向,我将不胜感激。
这是我的package.json:
{
"name": "ssr-ui",
"version": "1.0.0",
"description": "",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "next build",
"deploy": "next build && sls deploy",
"start": "next start",
"dev": "next dev"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@aws-amplify/api": "^3.2.4",
"@aws-amplify/auth": "^3.4.4",
"@aws-amplify/core": "^3.5.4",
"@aws-amplify/storage": "^3.3.4",
"@aws-amplify/ui-react": "^0.2.21",
"antd": "^4.6.4",
"antd-img-crop": "^3.10.0",
"axios": "^0.20.0",
"country-state-picker": "^1.1.1",
"echarts": "^4.9.0",
"echarts-for-react": "^2.0.16",
"express": "^4.17.1",
"next": "^9.5.3",
"next-react-svg": "^1.1.2",
"path-match": "^1.2.4",
"query-string": "^6.13.2",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-router-dom": "^5.2.0",
"react-share": "^4.2.1",
"sass": "^1.26.11",
"serverless-apigw-binary": "^0.4.4",
"serverless-domain-manager": "^4.2.0",
"serverless-http": "^2.5.0",
"url": "^0.11.0"
},
"devDependencies": {
"@types/jest": "^26.0.14",
"@types/node": "^14.10.3",
"@types/react": "^16.9.49",
"@types/react-dom": "^16.9.8",
"@types/react-router-dom": "^5.1.5",
"typescript": "^4.0.2"
}
}
我的 serverless.yml 是:
service: ssr-react-next
provider:
name: aws
runtime: nodejs12.x
region: ap-southeast-2
stage: ${self:custom.secrets.NODE_ENV}
environment:
NODE_ENV: ${self:custom.secrets.NODE_ENV}
functions:
server:
handler: index.server
events:
- http: ANY /
- http: ANY /{proxy+}
plugins:
- serverless-apigw-binary
- serverless-domain-manager
custom:
secrets: ${file(secrets.json)}
apigwBinary:
types:
- '*/*'
customDomain:
domainName: ${self:custom.secrets.DOMAIN}
basePath: ''
stage: ${self:custom.secrets.NODE_ENV}
createRoute53Record: true
谢谢!
有几种方法可以解决您的问题:
dependencies
移动到devDependencies
。无服务器在创建要上传的 zip 文件时会忽略
devDependencies
。
aws-sdk
添加到 devDependencies
。直到 Node.js v16,
aws-sdk
v2
已在 Lambda 中可用。所以不要捆绑它。
此外,如果您使用的是 Node.js v18,最好更新到最新版本的 AWS SDK (
@aws-ask/*
)
webpack
捆绑器,因此您可以单独打包您的函数。这意味着,无服务器应为每个 lambda 函数创建一个单独的 zip 文件。
您可以通过在
serverless.yml
文件中添加以下内容来启用该功能:
package:
individually: true
您可以通过在
serverless.yml
文件中包含以下内容来做到这一点:
package:
individually: true
patterns:
- '!.github'
- '!.husky'
- '!node_modules/aws-sdk/**'
- '!node_modules/@aws-sdk/**'
- '!package-lock.json'
- '!README.md'
您可以根据您的用例添加更多模式。