减少无服务器框架发送的节点模块zip的大小

Ada*_*tan 2 dependencies node.js npm aws-lambda serverless-framework

我正在使用无服务器框架编写一些nodejs函数。该package.json文件需要一些依赖项:

{
  "name": "adam-test-sls",
  "version": "0.1.0",
  "description": "Test package to play with sls/lambda",
  "main": "handler.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Adam Matan <adam@binaris.com>",
  "license": "UNLICENSED",
  "dependencies": {
    "aws-sdk": ">= 2.0.9",
    "json": "^9.0.6",
    "underscore": "^1.8.3",
    "uuid": "^3.1.0"
  },
  "devDependencies": {
    "eslint": "^4.2.0",
    "eslint-config-airbnb": "^15.0.2",
    "eslint-config-airbnb-base": "^11.2.0",
    "eslint-plugin-import": "^2.7.0"
  }
}
Run Code Online (Sandbox Code Playgroud)

node-modules目录的大小几乎为50mb:

# du -smc node_modules
47  node_modules
47  total
Run Code Online (Sandbox Code Playgroud)

压缩时间约为9.5MB,部署时间超过35秒:

# time serverless deploy function --function hello -v
Serverless: Packaging function: hello...
Serverless: Uploading function: hello (9.46 MB)...
Serverless: Successfully deployed function: hello
serverless deploy function --function hello -v  4.28s user 1.15s system 15% cpu 35.165 total
Run Code Online (Sandbox Code Playgroud)

这有点低效-我只更改一个文件,但是每当我做最小的更改时,都必须打包所有未更改的依赖项。

是否知道如何减小zip大小(也许删除devDependencies)或仅上传更改的文件?

Mar*_*yer 6

aws-sdk在24MB附近,您不需要它,因为Lambda函数已经可以使用它了。一种选择是将其移动到dev-dependencies,然后将您的dev-dependencies放在package.json父目录中。

还有一些工具可以帮助您:

serverless-plugin-include-dependencies插件-以为我不确定如果排除功能被破坏,它的工作情况如何:https : //github.com/dougmoscrop/serverless-plugin-include-dependencies

Webpack也可以与无服务器webpack插件一起使用以控制依赖关系。Webpack消除无效代码可以带来很大的不同。

不理想,但是您也可以npm prune --production在部署之前运行。(之后,您需要npm install再次运行。

  • 为什么运行“npm prune --product”不理想? (2认同)

VK3*_*321 1

我为此使用了图层:图层用于以图层的形式引入附加代码和内容。这将使您的 lambda 函数保持较小的规模,并在运行时从层中提取依赖项。

第 1 步: 创建一个名为的文件夹nodejs

cd Desktop
mkdir nodejs
cd nodejs
npm init
Run Code Online (Sandbox Code Playgroud)

步骤 2: 在此文件夹中安装较大的依赖项。例如:

npm install --save geoip-lite
Run Code Online (Sandbox Code Playgroud)

第三步: 将其压缩,输入您选择的名称。

第4步: 登录AWS控制台,转到lambda服务,然后选择创建层。然后上传您创建的 zip 文件。(正如它所说,如果该 zip 文件大于 10 mb,您可以将其上传到 S3)

在此步骤中,您可以通过进入 lambda 函数并添加您在上述步骤中创建的自定义层来将层分配给 lambda。

如果您有兴趣添加层,请使用 yml 配置

functions:
  hello:
   handler: handler.hello
   layers:
    - arn:aws:lambda:region:XXXXXX:layer:LayerName:Y
Run Code Online (Sandbox Code Playgroud)