如何减少包含 AWS SDK 的 Vue.js / Nuxt.js 项目的 webpack 包大小?

How can I reduce the webpack bundle size for a Vue.js / Nuxt.js project incorporating AWS SDK?

总结:

我已经使用 Vue.js 和 Nuxt.js 创建了项目,我在其中安装了 aws-amplify(它会自动安装 aws-sdk)以便我可以使用 AWS Cognito 实施身份验证。

在这两种情况下,这都很好用,但是当我构建生产版本时,问题就来了。

在这两种情况下,我最终都得到了巨大的包大小(感谢 webpack-bundle-analyzer)我可以立即看到是由 aws-sdk 引起的,它似乎包含实现每个 AWS 服务的代码,在sun,尽管我只导入了 AWS Cognito:"Auth"(从 'aws-amplify' 导入 { Auth })

我已经尝试为 JavaScript 创建一个自定义 AWS SDK,它只包含服务:AWS.CognitoIdentity,但尽管合并了它(可能是错误的),我仍然得到相同的包大小(和 aws-sdk 文件)当我构建项目时。

正如我所说,这在 Nuxt 和 Vue 项目中都会发生,但是为了简化它,我现在只想找到一个用 Vue 创建的非常基本的示例项目的解决方案。

我想我一定是在做一些愚蠢的事情,但我不知道那是什么。

如有任何帮助,我们将不胜感激! :-)

重现步骤:

  1. 创建一个带有默认值的基本 Vue.js 项目。 运行: vue create vue-aws-sdk-inv

[注意:第 2 - 4 步对于重现问题并不重要,但安装 webpack-bundle-analyzer 可提供有用的额外信息。]

  1. 在新项目中,安装webpack-bundle-analyzer。 运行: npm install --save-dev webpack-bundle-analyzer
  2. 创建根文件:vue.config.js
  3. 将以下代码添加到vue.config.js:
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer")
  .BundleAnalyzerPlugin;
module.exports = {
  configureWebpack: {
    plugins: [new BundleAnalyzerPlugin()]
  }
};
  1. 作为基准,构建项目。 运行: npm run build

在此阶段,项目将构建(没有控制台警告)并且 webpack-bundle-analyzer 将启动(在浏览器中)显示文件:chunk-vendors..js,在树的顶部,包含一堆其他 .js 文件,大小都可以接受。

  1. 安装 AWS Amplify(默认情况下是 aws-sdk)。 运行: npm i aws-amplify
  2. 打开src/components/HelloWorld.vue,在标签下添加:import { Auth } from "aws-amplify";
  3. 构建项目。 运行: npm run build

在此阶段,该项目将生成有关以下文件过大的控制台警告:

File                                 Size               Gzipped

dist/js/chunk-vendors.013ac3f0.js    3055.78 KiB        550.49 KiB
dist/js/app.fa2a21c4.js              4.67 KiB           1.67 KiB
dist/css/app.53019c4c.css            0.33 KiB           0.23 KiB

如果已安装,webpack-bundle-analyzer 应该会启动(在浏览器中)显示一个膨胀的:chunk-vendors..js,由于 hefty:aws-sdk。

aws-sdk 将包括 api: .json 文件和 lib: .js 文件,适用于我能想到的每个 AWS 服务!

整改尝试:

  1. 导航至:https://sdk.amazonaws.com/builder/js/
  2. 清除所有服务。
  3. Select 只是:AWS.CognitoIdentity
  4. 下载"Minified" aws-sdk-.js
  5. 下载"Default" aws-sdk-.min.js

[注意:以下是我猜错的步骤?...]

  1. 在项目中,在node_modules目录中搜索aws-sdk.js和aws-sdk.min.js.

它们被发现于 /node_modules/aws-sdk/dist

  1. 用下载的文件替换这两个文件(分别重命名为 aws-sdk.js 和 aws-sdk.min.js。)
  2. 构建项目。 运行: npm run build

项目将使用与以前相同的控制台警告和相同的大量 aws-sdk 构建,包含所有相同的 .js 和 .json 文件,用于一堆服务,这些服务实际上并未导入到应用程序中。

最后的分析:

  1. 从项目中删除 aws-sdk.js 和 aws-sdk.min.js:/node_modules/aws-sdk/dist
  2. 构建项目。 运行: npm run build

构建项目时甚至没有引用这些文件。

  1. 将 /node_modules/aws-sdk 重命名为 /node_modules/TEMP_aws-sdk 并尝试构建项目。

构建失败,这证明(我认为)我至少尝试在正确的某处添加 aws-sdk.js 和 aws-sdk.min.js 的自定义版本目录!

源代码:

vue.config.js:

const BundleAnalyzerPlugin = require("webpack-bundle-analyzer")
  .BundleAnalyzerPlugin;
module.exports = {
  configureWebpack: {
    plugins: [new BundleAnalyzerPlugin()]
  }
};

src/components/HelloWorld.vue:

import { Auth } from "aws-amplify";

如前所述,如有任何帮助,我们将不胜感激! :-)

根据 this issueimport { Auth } from "aws-amplify"; 目前似乎不允许 tree shaking。

通读了几个相关问题,发现:

import Auth from '@aws-amplify/auth';

是您目前能做的最好的。我怀疑随着时间的推移,AWS 团队会找到一种更好地分离内部结构的方法。

对于寻找减少 aws-sdk 包的包大小的方法的读者,请参阅文档的 this section

就我而言:

import S3 from 'aws-sdk/clients/s3';
import AWS from 'aws-sdk/global';

大大减少了包的大小。这将它降低到 ~57k gz 以使用 S3。


此外,对于任何使用 nuxt 的人,您只需 运行 nuxt build -a 即可获取构建分析器。