Webpack仍然包括明确排除的文件夹

时间:2019-12-20 19:36:05

标签: node.js webpack aws-lambda serverless-framework

我正在使用具有serverless.com框架的nodeJs回购上的webpack来部署到AWS Lambda函数。由于AWS上的Lambda容器已经包含aws-sdk,因此我试图将其从包装中排除。

构建过程中的输出实际上将aws-sdk标识为已排除:

    [41] ./src/controller/queue.ts 2.57 KiB {3} [built]
[43] ./src/controller/auth.ts 3.76 KiB {1} [built]
    + 30 hidden modules
Serverless: Excluding external modules: aws-sdk@^2.309.0
Serverless: Package lock found - Using locked versions
Serverless: Packing external modules: @hapi/joi@^16.1.5, moment-timezone@^0.5.23, axios@^0.19.0, chrome-aws-lambda@^2.0.1, puppeteer-core@^2.0.0, uuid@^2.0.3, memorystream@^0.3.1, lambda-warmer@^1.2.1, jsonwebtoken@^8.5.1, typeorm@0.2.9, js-yaml@^3.12.0
Serverless: Packaging service...

但是,被构建为要上载到Lambda的zip文件仍然包含aws-sdk,并使该软件包接近60MB。在构建过程中,我还查看了.webpack中的文件夹,并注意到node_modules文件夹既位于依赖文件夹中,又位于服务文件夹中,而aws-sdk位于服务文件夹中。我真的不知道那是什么意思。

感谢您的帮助。令人沮丧的是,它公然地说它正在排除它,但无论如何它都会在拉链中缠绕。

我的webpack.config.js如下:

const webpack = require("webpack");
const path = require("path");
const serverlessWebpack = require("serverless-webpack");
const nodeExternals = require("webpack-node-externals");
const CopyWebpackPlugin = require('copy-webpack-plugin');

module.exports = {
  entry: serverlessWebpack.lib.entries,
  target: 'node',
  mode: serverlessWebpack.lib.webpack.isLocal ? "development" : "production",
  node: {
    __dirname: true
  },
  devtool: 'source-map',
  externals: [nodeExternals()],
  module: {
    rules: [
      {
        test: /\.ts$/,
        use: [
          {
            loader: "ts-loader"
          }
        ],
        include: [__dirname],
        exclude: /node_modules/
      }
    ]
  },
  resolve: {
    extensions: [".ts", ".tsx", ".js"]
  },
  output: {
    libraryTarget: "commonjs",
    path: path.join(__dirname, ".webpack"),
    filename: "[name].js"
  },
  plugins: [
    new webpack.EnvironmentPlugin({
      NODE_ENV: "development"
    }),
    new CopyWebpackPlugin([
      { from: 'ormconfig.yml' },
    ])
  ]
};

在serverless-webpack插件的serverless.yml自定义部分中,我的配置是:

webpack:
  webpackConfig: webpack.config.js
  includeModules:
    forceExclude:
    - aws-sdk
  packager: 'yarn'

4 个答案:

答案 0 :(得分:2)

您是否有缩进问题。看到forceExcludeincludeModules是否处于同一水平?

应该,

webpack:
  webpackConfig: webpack.config.js
  includeModules: true
  forceExclude:
    - aws-sdk
  packager: 'yarn'

参考:

https://github.com/serverless-heaven/serverless-webpack

答案 1 :(得分:0)

我有同样的问题,我不明白为什么aws-sdk仍包含在部署程序包中,该程序包大约有50MB! 我的解决方法是

webpack:
webpackConfig: webpack.config.js   # Name of webpack configuration file
packager: 'yarn'
includeModules:
  forceExclude:
    - aws-sdk
packagerOptions:
  scripts:
    - rm -rf node_modules/aws-sdk

答案 2 :(得分:0)

也许你可以把你的webpack.config.js改成这个form

const slsw = require('serverless-webpack');
// const nodeExternals = require('webpack-node-externals');

module.exports = {
  target:       'node',
  mode:         slsw.lib.webpack.isLocal ? 'development' : 'production',
  entry:        slsw.lib.entries,
  externals:    { 'aws-sdk': 'commonjs2 aws-sdk' },
  ...
}

这对我有用。

答案 3 :(得分:0)

还有另一种方法可以在使用 aws sdk 时减小函数的大小。您所要做的就是改变导入内容的方式。

例如这个导入:

import AWS from 'aws-sdk';

改成这样:

import CognitoIdentity from '@aws-sdk/client-cognito-identity';

aws 称之为 "Modular packages"

他们在那里展示的示例将函数大小从 ~817KB 减少到 ~23KB!

检查the github repo here