

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 Elastic Beanstalk 上設定應用程式的相依性
<a name="nodejs-platform-dependencies"></a>

您的應用程式可能與一些 Node.js 模組有相依性，例如您在 `require()` 陳述式中指定的模組。這些模組儲存在 `node_modules` 目錄中。當您的應用程式執行時，Node.js 會從此目錄載入模組。如需詳細資訊，請參閱 Node.js 文件中的[從 node\_modules 資料夾載入](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 登錄檔的相依性的問題。而由於相依性模組來自本機目錄，所以這可能也有助於縮短部署時間。如需詳細資訊，請參閱[在 a node\_modules 目錄中納入 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` 關鍵字來提供啟動命令。現在，在 `aws:elasticbeanstalk:container:nodejs` 命名空間中使用 `scripts` 關鍵字來取代舊版的 `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* 套件，請將 PM\_USE\_PRODUCTION 環境屬性設為 `false`。透過此設定，我們不會在執行 npm 安裝時使用上述選項。這將導致安裝 *devDependencies* 套件。

## 在 a node\_modules 目錄中納入 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_modules` 目錄中Node.js尋找相依性。如需詳細資訊，請參閱 Node.js 文件中的[從 node\_modules 資料夾載入](https://nodejs.org/api/modules.html#modules_loading_from_node_modules_folders)。

**注意**  
如果您在 Elastic Beanstalk 執行 `npm install` 時遭遇任何部署問題，在調查問題時，請考慮使用本主題中描述的方法作為變通措施。  
 

### Amazon Linux 2 上的 Node.js 考量事項
<a name="nodejs-al2-considerations"></a>

如果您使用在 *Amazon Linux 2* 上執行的 *Node.js* 平台分支，請閱讀本節。

#### Amazon Linux 2 上的 Node.js 考量事項
<a name="nodejs-al2-considerations-detail"></a>

**注意**  
本主題中的資訊適用於在 Amazon Linux 2 上執行的Node.js平台分支。此處的內容說明與 AL2-specific功能和行為。 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 日開始，您可以使用 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 網站上的 [Semantic Versioning using npm](https://nodejs.dev/learn/semantic-versioning-using-npm) (使用 npm 的語意版本控制)。Node.js `package.json` 檔案中的 `engines` 關鍵字取代 `aws:elasticbeanstalk:container:nodejs` 命名空間中的舊版 `NodeVersion` 選項。

**重要**  
指定版本範圍的功能不適用於在 AL2023 上執行的 Node.js 平台分支。在 AL2023 上特定的 Node.js 分支內，只支援一個 Node.js 版本。如果 `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.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs)》上取得此版本。

請注意，您只能指定一個與您平台分支對應的 Node.js 版本。例如，如果您使用的是 Node.js 16 平台分支，您只能指定 16.x.y Node.js 版本。您可以使用 npm 支援的版本範圍選項以允許更多的靈活性。關於每個平台分支的有效 Node.js 版本，請參閱 *AWS Elastic Beanstalk 平台指南*中的 [https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.nodejs)。

**注意**  
如果您所使用的 Node.js 版本的支援已從平台移除，您必須在[平台更新](using-features.platform.upgrade.md)之前變更或移除 Node.js 版本設定。當發現一個或多個版本的 Node.js 存在安全漏洞時，可能會出現此種狀況。  
此時，如果嘗試將不支援已設定 Node.js 版本的平台更新至新版本，此動作將會失敗。為省去建立新環境的必要，請將 `package.json` 中的 Node.js 版本設定變更為新舊平台版本皆支援的 Node.js 版本。您可以選擇指定包含支援版本的 Node.js 版本範圍，如本主題之前所述。您也可以選擇移除設定，然後部署新的來源套件。