

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 配置您的应用程序对 Elastic Beanstalk 的依赖项
<a name="nodejs-platform-dependencies"></a>

您的应用程序可能有某些 Node.js 模块的依赖项，例如您在 `require()` 语句中指定的项。这些模块存储在 `node_modules` 目录中。当您的应用程序运行时，Node.js 将从此目录加载模块。有关更多信息，请参阅 Node.js 文档中的[从 node\$1modules 文件夹加载](https://nodejs.org/api/modules.html#modules_loading_from_node_modules_folders)。

您可以使用 `package.json` 文件指定这些模块依赖项。如果 Elastic Beanstalk 检测到此文件，但 `node_modules` 目录不存在，则 Elastic Beanstalk 将以 *webapp* 用户身份运行 `npm install`。`npm install` 命令将依赖项安装在 Elastic Beanstalk 事先创建的 `node_modules` 目录中。`npm install` 命令会从公共 npm 注册表或其他位置访问 `package.json` 文件中列出的软件包。有关更多信息，请参阅 [npm Docs](https://docs.npmjs.com/about-the-public-npm-registry) 网站。

如果 Elastic Beanstalk 检测到 `node_modules` 目录，则即使存在 `package.json` 文件，Elastic Beanstalk 也不会运行 `npm install`。Elastic Beanstalk 假设依赖项包在 `node_modules` 目录中可供 Node.js 访问和加载。

以下各部分提供有关为应用程序建立 Node.js 模块依赖项的更多信息。

**注意**  
如果您在 Elastic Beanstalk 运行 `npm install` 时遇到任何部署问题，请考虑其他方法。在您的应用程序源包中包括含依赖模块的 `node_modules` 目录。这样做可以避免在调查问题时从公共 npm 注册表安装依赖项时出现问题。由于依赖模块来自本地目录，这样做也可能有助于缩短部署时间。有关更多信息，请参阅 [在 node\$1modules 目录中包括 Node.js 依赖项](#nodejs-platform-nodemodules)。

## 使用 package.json 文件指定 Node.js 依赖项
<a name="nodejs-platform-packagejson"></a>

包含项目源的根目录中的 `package.json` 文件来指定依赖项包并提供启动命令。当 `package.json` 文件存在，且项目源的根目录中不存在 `node_modules` 目录时，Elastic Beanstalk 会以 *webapp* 用户的身份运行 `npm install` 来从公共 npm 注册表安装依赖项。Elastic Beanstalk 还使用 `start` 命令来启动您的应用程序。有关 `package.json` 文件的更多信息，请参阅 *npm Docs* 网站中的[在 `package.json` 文件中指定依赖项](https://docs.npmjs.com/specifying-dependencies-and-devdependencies-in-a-package-json-file)。

使用 `scripts` 关键字来提供启动命令。当前使用 `scripts` 关键字，而不是 `aws:elasticbeanstalk:container:nodejs` 命名空间中的原有 `NodeCommand` 选项。

**Example package.json - Express**  

```
{
    "name": "my-app",
    "version": "0.0.1",
    "private": true,
    "dependencies": {
      "ejs": "latest",
      "aws-sdk": "latest",
      "express": "latest",
      "body-parser": "latest"
    },
    "scripts": {
      "start": "node app.js"
    }
  }
```

**生产模式和开发依赖项**  
要在 `package.json` 文件中指定依赖项，请使用 *dependencies* 和 *devDependencies* 属性。*dependencies* 属性指定您的应用程序在生产中所需的软件包。*devDependencies* 属性指定仅本地开发和测试需要的软件包。

如果您需要安装 *devDependencies* 软件包，则请将 NPM\$1USE\$1PRODUCTION 环境属性设置为 `false`。使用此设置，在运行 npm install 时将不使用上述选项。这将导致 *devDependencies* 软件包被安装。

## 在 node\$1modules 目录中包括 Node.js 依赖项
<a name="nodejs-platform-nodemodules"></a>

要将依赖项程序包与应用程序代码一起部署到环境实例，请将它们包括在项目源根目录下名为 `node_modules` 的目录中。有关更多信息，请参阅 *npm Docs* 网站中的[在本地下载和安装软件包](https://docs.npmjs.com/downloading-and-installing-packages-locally)。

[当您将`node_modules`目录部署到 AL2023/AL2 Node.js平台版本时，Elastic Beanstalk 会假设您提供了自己的依赖包，并避免安装在 package.json 文件中指定的依赖项。](#nodejs-platform-packagejson) Node.js在`node_modules`目录中查找依赖关系。有关详细信息，请参阅 Node.js 文档中的[从 node\$1modules 文件夹加载](https://nodejs.org/api/modules.html#modules_loading_from_node_modules_folders)。

**注意**  
如果您在 Elastic Beanstalk 运行 `npm install` 时遇到任何部署问题，请在调查问题时考虑使用本主题中描述的方法作为解决方法。  
 

### 亚马逊 Linux 上的 Node.js 注意事项 2
<a name="nodejs-al2-considerations"></a>

如果你使用的是在 *Amazon Linux 2* 上运行*的 Node.js* 平台分支，请阅读本节。

#### 亚马逊 Linux 上的 Node.js 注意事项 2
<a name="nodejs-al2-considerations-detail"></a>

**注意**  
本主题中的信息适用于在 Amazon Linux 2 上运行的Node.js平台分支。此处的内容描述了与之不同的 AL2特定功能和行为。 AL2023

**命令变体**  
命令选项因应用程序运行的 Amazon Linux 2 平台分支中包含的 npm 版本而异。
+ npm v6 – 默认情况下，Elastic Beanstalk 在生产模式下安装依赖项。它使用命令 `npm install --production`。
+ npm v7 或更高版本 – Elastic Beanstalk 省略了 *devDependencies*。它使用命令 `npm install --omit=dev`。

上面列出的两个命令都没有安装属于 *devDependencies* 的软件包。

**Git 依赖关系的 SSH 和 HTTPS 协议**  
从 2023 年 3 月 7 日的 Amazon Linux 2 平台版本开始，你可以使用 SSH 和 HTTPS 协议从 Git 存储库中检索软件包。平台分支 Node.js 16 同时支持 SSH 和 HTTPS 协议。Node.js 14 仅支持 HTTPS 协议。

**Example package.json – Node.js 16 同时支持 HTTPS 和 SSH**  

```
    ...
    "dependencies": {
      "aws-sdk": "https://github.com/aws/aws-sdk-js.git",
      "aws-chime": "git+ssh://git@github.com:aws/amazon-chime-sdk-js.git"
    }
```

**版本和版本范围**  
使用 `package.json` 文件中的 `engines` 关键字指定您希望应用程序使用的 Node.js 版本。您还可以使用 npm 表示法指定版本范围。有关版本范围的语法的更多信息，请参阅 Node.js 网站上的[使用 npm 的语义版本控制](https://nodejs.dev/learn/semantic-versioning-using-npm)。Node.js `package.json` 文件中的 `engines` 关键字取代 `aws:elasticbeanstalk:container:nodejs` 命名空间中的原有 `NodeVersion` 选项。

**重要**  
指定版本范围的功能不适用于在其上运行的 Node.js 平台分支 AL2023。我们只支持特定 Node.js 分支中的一个 Node.js 版本 AL2023。如果您的 `package.json` 文件指定了版本范围，我们将忽略它并默认设为 Node.js 的平台分支版本。

**Example `package.json` – 单一 Node.js 版本**  

```
{
    ...
    "engines": { "node" : "14.16.0" }
  }
```

**Example `package.json` – Node.js 版本范围**  

```
{
    ...
    "engines": { "node" : ">=10 <11" }
  }
```

当指示版本范围时，Elastic Beanstalk 会安装该平台在该范围内可用的最新 Node.js 版本。在此示例中，范围指示版本必须大于或等于版本 10，但小于版本 11。因此，Elastic Beanstalk 安装了最新的 Node.js 版本 10.x.y，该版本在[支持的平台](https://docs.amazonaws.cn/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs)上可用。

请注意，您只能指定与平台分支对应的 Node.js 版本。例如，如果您使用的是 Node.js 16 平台分支，则只能指定 16.x.y Node.js 版本。您可以使用 npm 支持的版本范围选项来提高灵活度。有关每个平台分支的有效 Node.js 版本，请参阅《Amazon Elastic Beanstalk 平台》**指南中的 [https://docs.amazonaws.cn/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs](https://docs.amazonaws.cn/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs)。

**注意**  
如果对您正在使用的 Node.js 版本的支持已从平台中移除，则您必须先更改或移除 Node.js 版本设置再进行[平台更新](using-features.platform.upgrade.md)。当在一个或多个 Node.js 版本中识别到安全漏洞时，可能会发生这种情况。  
发生此情况时，尝试更新到不支持所配置的 Node.js 版本的新平台版本会失败。为避免需要创建新环境，请将 `package.json` 中的 Node.js 版本设置更改为旧平台版本和新平台版本都支持的 Node.js 版本。您可以选择指定包含受支持版本的 Node.js 版本范围，如本主题前面所述。您还可以选择删除设置，然后部署新的源包。