【问题标题】:Webpack still including an explicitly excluded folderWebpack 仍然包含一个明确排除的文件夹
【发布时间】:2020-04-13 06:40:04
【问题描述】:

我在 nodeJs 存储库上使用 webpack 和 serverless.com 框架来部署到 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'

【问题讨论】:

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


    【解决方案1】:

    您是否有缩进问题。看到forceExcludeincludeModules 假设在同一级别?

    应该是,

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

    参考:

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

    【讨论】:

    【解决方案2】:

    我有同样的问题,我不明白为什么 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
    

    【讨论】:

      【解决方案3】:

      也许你可以把你的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' },
        ...
      }
      

      这对我有用。

      【讨论】:

        【解决方案4】:

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

        例如这个导入:

        import AWS from 'aws-sdk';
        

        改成这样:

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

        这就是 aws 所说的 "Modular packages"

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

        查看the github repo here

        【讨论】:

          猜你喜欢
          • 2018-04-10
          • 2020-07-22
          • 2017-10-12
          • 1970-01-01
          • 2017-01-31
          • 2013-02-15
          • 1970-01-01
          • 2020-05-05
          • 2019-09-06
          相关资源
          最近更新 更多