将Angular的构建与Firebase的部署进行同步

这篇文章是关于使用Angular+Firebase创建聊天应用的入门指南。
前一篇文章:在WEB应用中搭建Firebase的部署环境。

通过这篇文章要做的事情

在前一篇文章中,我介绍了有关Firebase的分阶段运营和部署方法,而在本篇文章中,我将介绍如何将Angular和Firebase的部署进行联动。

    • 開発環境にデプロイする

 

    • ステージング環境にデプロイする

 

    本番環境にデプロイする

使用Angular进行部署

不仅仅是Angular,近年的JavaScript应用程序通常会分开开发环境和生产环境的构建文件。在开发环境中,需要进行调试,所以允许显示SourceMap,以便更容易进行调试。而在生产环境中,重点是文件的加载速度和机密性,所以需要对文件进行压缩,减少额外的信息。

由于自己尝试进行这个构建任务会变得非常麻烦,因此使用像webpack和gulp这样的任务管理器来管理已成为事实上的标准。

同样,即使在Angular中也不例外,在内部似乎使用了webpack来处理任务,但并非在webpack.config.js中,而是在angular.json中记录了构建和测试工具的设置信息。

如果你想要自己编写配置,也有名为@angular-builders/custom-webpack的工具可供选择,适用于那些想要自己调整配置的人,请参考以下链接。

参考:搭建Angular + 自定义Webpack开发环境

实施内容

如果要将Angular和Firebase连接起来进行部署,可以使用AngularFire的ng deploy命令。通过这个命令,可以实现根据开发环境进行构建和部署。
关于AngularFire,我们已经在之前的文章中介绍了安装方法等内容,如果您是通过这篇文章查阅的,请确保参考那篇文章。

请参考以下链接:https://angular.io/guide/deployment

注意事项1:ng deploy在Angular/cli中是从v8.3.0版本开始引入的。如果您使用的是早于这个版本的@angular/cli,则无法使用,请注意。
注意事项2:@angular/cli的ng deploy在2020年5月报告了一个错误,并已经修复。以下实现在之前的@angular/cli版本中会出现错误,请确保使用最新的版本。
参考:https://github.com/angular/angular-cli/issues/17613

此外,本次使用的Firebase项目有两个,并且将按照以下方式进行设置。

環境Projectビルド方式開発環境開発用開発用ステージング環境開発用本番用本番環境本番用本番用

将应用部署到开发环境中。

首先,我们要检查 angular.json 的源代码。

"deploy": {
 "builder": "@angular/fire:deploy",
 "options": {},
}

如果是在@angular/cliv8.3.0或更高版本的angular.json文件中,就已经包含了ng deploy的配置。只要在这种初始状态下运行ng deploy命令,它的行为将与运行ng build –prod命令时相同。

然而,在开发环境中,由于需要进行调试,因此需要设置为不使用–prod。

"deploy": {
 "builder": "@angular/fire:deploy",
 "options": {
     "buildTarget": "NgChat:build",
 },
}

现在开发环境的设置已经完成。
我们将进行ng deploy操作,以确认开发环境的运行情况。

执行结果

スクリーンショット 2020-08-08 23.17.59.png

将应用部署到预上线环境。

首先,创建一个用于staging环境的环境配置文件。
将开发环境下的src/environments/environment.ts文件复制一份,并将production设置为true。

export const environment = {
  production: true,
  firebase: {
    apiKey: '<your-key>',
    authDomain: '<your-project-authdomain>',
    databaseURL: '<your-database-URL>',
    projectId: '<your-project-id>',
    storageBucket: '<your-storage-bucket>',
    messagingSenderId: '<your-messaging-sender-id>',
    appId: '<your-app-id>',
    measurementId: '<your-measurement-id>',
  },
};

接下来,您将在angular.json文件中进行构建配置。检查build对象中的configurations属性,您会发现已经有了用于生产环境的设置,因此您只需将其修改为适用于staging环境的配置即可。
*除了配置文件路径,其他部分没有进行更改。

          "configurations": {
            "production": {
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.staging.ts"
                }
              ],
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": false,
              "extractCss": true,
              "namedChunks": false,
              "extractLicenses": true,
              "vendorChunk": false,
              "buildOptimizer": true,
              "budgets": [
                {
                  "type": "initial",
                  "maximumWarning": "2mb",
                  "maximumError": "5mb"
                },
                {
                  "type": "anyComponentStyle",
                  "maximumWarning": "6kb",
                  "maximumError": "10kb"
                }
              ]
            }
          }

如果要大致总结这里所写的设置信息的意义,可以概括如下:

項目名説明fileReplacementsファイル差し替え。主にenvironmentファイルに使われる。optimization最適化する。{scripts: true, styles: false} というような個別設定も可能outputHashing出力ファイル名にハッシュをつける。キャッシュバスター。”none”,”all”,”media”,”bundles”sourceMapsourceMapを出力する。{scripts: true, styles: true, hidden: false, vendor: true}というような個別設定も可能extractCssグローバル指定のcssを展開するnamedChunks遅延読み込みのファイルに名前をつけるextractLicenses利用ライブラリのライセンスファイルをまとめるvendorChunkライブラリだけで単独のファイルにする。ライブラリは変更頻度が低いため。buildOptimizeraot利用時、@angular-devkit/build-optimizerを有効にするbudgets生成ファイルのファイルサイズ制限を設定できる。気軽に巨大なライブラリをimportすると使わないコードが大量に含まれてしまったりするのを警告する。

这是从以下文章中提取出来的内容。有关其他参数,请参考那篇文章。
参考:angular.json的内容

为了能够根据此处指定的内容进行部署,我们将在 angular.json 的部署信息中进行追加。

        "deploy": {
          "builder": "@angular/fire:deploy",
          "options": {
            "buildTarget": "NgChat:build"
          },
          "configurations": {
            "staging": {
              "buildTarget": "NgChat:build:production"
            }
          }
        }

现在准备工作已经完成。
只需添加-c选项(–configuration的别名)进行部署。

ng deploy -c staging

执行结果

スクリーンショット 2020-08-08 23.50.35.png

将代码部署到生产环境

请将firebase的信息追加到Angular项目中的environment.prod.ts文件中,最后进行生产环境的部署设置。在此过程中,请使用生产项目中的参数。

export const environment = {
  production: true,
  firebase: {
    apiKey: '<your-key>',
    authDomain: '<your-project-authdomain>',
    databaseURL: '<your-database-URL>',
    projectId: '<your-project-id>',
    storageBucket: '<your-storage-bucket>',
    messagingSenderId: '<your-messaging-sender-id>',
    appId: '<your-app-id>',
    measurementId: '<your-measurement-id>',
  },
};

接下来,在angular.json中添加生产环境项目。
由于serve和test仅在开发和部署环境中使用,所以已经从生产环境项目中排除了它们。

    "NgChatProd": {
      "projectType": "application",
      "schematics": {},
      "root": "",
      "sourceRoot": "src",
      "prefix": "app",
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "outputPath": "dist/NgChat",
            "index": "src/index.html",
            "main": "src/main.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "tsconfig.app.json",
            "aot": true,
            "assets": [
              "src/favicon.ico",
              "src/assets"
            ],
            "styles": [
              "node_modules/bootstrap/dist/css/bootstrap.min.css",
              "src/styles.css"
            ],
            "scripts": []
          },
          "configurations": {
            "production": {
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.prod.ts"
                }
              ],
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": false,
              "extractCss": true,
              "namedChunks": false,
              "extractLicenses": true,
              "vendorChunk": false,
              "buildOptimizer": true,
              "budgets": [
                {
                  "type": "initial",
                  "maximumWarning": "2mb",
                  "maximumError": "5mb"
                },
                {
                  "type": "anyComponentStyle",
                  "maximumWarning": "6kb",
                  "maximumError": "10kb"
                }
              ]
            }
          }
        },
        "deploy": {
          "builder": "@angular/fire:deploy",
          "options": {}
        }
      }
    }

由于在主机部署时会出现错误,因此需要在Firebase的配置文件中进行补充。本次将创建两个项目,一个用于开发,另一个用于生产,而不使用用于临时环境的Firebase项目。

{
  "projects": {
    "dev": "開発用FirebaseプロジェクトID",
    "prod": "本番用FirebaseプロジェクトID"
  },
  "targets": {
    "開発用FirebaseプロジェクトID": {
      "hosting": {
        "NgChat": [
          "開発用FirebaseプロジェクトID"
        ]
      }
    },
    "本番用FirebaseプロジェクトID": {
      "hosting": {
        "NgChatProd": [
          "本番用FirebaseプロジェクトID"
        ]
      }
    }
  }
}
    {
      "target": "NgChat",
      "public": "dist/NgChat",
      "ignore": [
        "firebase.json",
        "**/.*",
        "**/node_modules/**"
      ],
      "rewrites": [
        {
          "source": "**",
          "destination": "/index.html"
        }
      ]
    },
    {
      "target": "NgChatProd",
      "public": "dist/NgChat",
      "ignore": [
        "firebase.json",
        "**/.*",
        "**/node_modules/**"
      ],
      "rewrites": [
        {
          "source": "**",
          "destination": "/index.html"
        }
      ]
    }

使用ng deploy命令后,将项目名称填入,并执行,本地环境的设置即完成。

ng deploy NgChatProd

执行结果 (shí jié guǒ)

スクリーンショット 2020-08-08 23.54.05.png

使用Angular和Firebase创建聊天应用的条目已经全部结束。
辛苦了。

源代码

请在此时点提供源代码。
※ 删除了apiKey,请在试用时自行创建并输入apiKey。

广告
将在 10 秒后关闭
bannerAds