本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 AWS Amplify、角形和模組聯合建立微型前端的入口網站
由 Milena Godau (AWS) 和 Pedro Garcia (AWS) 建立
程式碼儲存庫:角度微型前端入口網站 | 環境:PoC 或試行 | 技術:Web 和行動應用程式;基礎設施;聯網;現代化 |
工作負載:開放原始碼 | AWS 服務:AWSAmplify; AWS CLI |
Summary
微型前端架構可讓多個團隊獨立處理前端應用程式的不同部分。每個團隊都可以開發、建置和部署前端的片段,而不會干擾應用程式的其他部分。從最終使用者的角度來看,它似乎是一個單一且具凝聚力的應用程式。不過,他們正在與數個由不同團隊發佈的獨立應用程式互動。
本文件說明如何使用 AWS Amplify、角度前端架構和模組聯合 來建立微型前端架構。在此模式中,微型前端在用戶端由 shell (或父系 ) 應用程式組合。Shell 應用程式充當擷取、顯示和整合微型前端的容器。Shell 應用程式會處理全域路由,這會載入不同的微型前端。@angular-architects/module-federation 外掛程式整合了 Module Federation 與 Angular。您可以使用 部署 Shell 應用程式和微型前端 AWS Amplify。最終使用者透過 Web 型入口網站存取應用程式。
入口網站垂直分割。這表示微型前端是整個視觀表或視觀表群組,而不是相同視觀表的一部分。因此,殼層應用程式一次只會載入一個微型前端。
微型前端會實作為遠端模組。Shell 應用程式會暫時載入這些遠端模組,這會將微前端初始化延遲到需要為止。此方法透過僅載入必要的模組來最佳化應用程式效能。這可減少初始載入時間,並改善整體使用者體驗。此外,您可以透過 webpack 組態檔案 (webpack.config.js ) 跨模組共用共同相依性。此做法可促進程式碼重複使用、減少重複,並簡化綁定程序。
先決條件和限制
先決條件
作用中 AWS 帳戶
Node.js 和 npm,已安裝
Amplify CLI,已安裝
角型 CLI,已安裝
使用許可 AWS Amplify
熟悉角度
產品版本
限制
微型前端架構是建置可擴展性和彈性 Web 應用程式的強大方法。不過,在採用此方法之前,請務必了解下列潛在挑戰:
整合 – 其中一個主要挑戰是與單片前端相比,複雜性可能會增加。協調多個微型前端、處理它們之間的通訊和管理共用相依性可能更為複雜。此外,可能存在與微型前端之間的通訊相關聯的效能額外負荷。此通訊可以增加延遲並降低效能。這需要透過有效的傳訊機制和資料共用策略來解決。
重複程式碼 – 由於每個微型前端都是獨立開發的,因此存在重複常見功能或共用程式庫程式碼的風險。這可能會增加整體應用程式大小,並帶來維護挑戰。
協調和管理 – 協調跨多個微型前端的開發和部署程序可能具有挑戰性。確保一致的版本控制、管理相依性,以及維護元件之間的相容性,在分散式架構中變得越來越重要。建立明確的治理、指導方針和自動化測試和部署管道,對於無縫協作和交付至關重要。
測試 – 測試微型前端架構可能比測試單片前端更複雜。它需要額外的努力和專門的測試策略來執行跨元件整合測試和 end-to-end測試,並驗證多個微型前端的一致使用者體驗。
在承諾微前端方法之前,我們建議您檢閱了解和在 上實作微前端 AWS。
架構
在微型前端架構中,每個團隊都會獨立開發和部署功能。下圖顯示多個 DevOps 團隊如何一起運作。入口網站團隊會開發 Shell 應用程式。Shell 應用程式充當容器。它會擷取、顯示和整合其他 DevOps 團隊發佈的微型前端應用程式。您可以使用 AWS Amplify 來發佈 Shell 應用程式和微型前端應用程式。
架構圖顯示下列工作流程:
入口網站團隊會開發和維護 Shell 應用程式。Shell 應用程式會協調微前端的整合和轉譯,以編寫整體入口網站。
團隊 A 和 B 會開發和維護整合到入口網站的一或多個微型前端或功能。每個團隊可以在各自的微型前端獨立運作。
最終使用者使用 Amazon Cognito 進行身分驗證。
最終使用者存取 入口網站,並載入 Shell 應用程式。使用者導覽時, shell 應用程式會處理路由,並擷取請求的微型前端,載入其套件。
AWS 服務
其他工具
程式碼儲存庫
此模式的程式碼可在 Micro-frontend 入口網站中使用 Angular 和 Module Federation GitHub 儲存庫。此儲存庫包含下列兩個資料夾:
最佳實務
微型前端架構具有許多優點,但也會帶來複雜性。以下是順暢開發、高品質程式碼和良好使用者體驗的一些最佳實務:
規劃和通訊 – 為了簡化協作,請投資預先規劃、設計和清晰的通訊管道。
設計一致性 – 使用設計系統、樣式指南和元件程式庫,跨微型前端強制執行一致的視覺化樣式。這可提供有凝聚力的使用者體驗並加速開發。
相依性管理 – 由於微型前端獨立發展,因此採用標準化合約和版本控制策略,以有效管理相依性並防止相容性問題。
微型前端架構 – 若要啟用獨立開發和部署,每個微型前端都應對封裝功能負有明確且明確的責任。
整合和通訊 – 為了促進順利整合並盡量減少衝突,請定義微型前端之間的明確合約和通訊協定,包括 APIs、事件和共用資料模型。
測試和品質保證 – 實作微型前端的測試自動化和持續整合管道。這可改善整體品質、減少手動測試工作,並驗證微型前端互動之間的功能。
效能最佳化 – 持續監控效能指標並追蹤微型前端之間的相依性。這可協助您識別瓶頸並維持最佳應用程式效能。為此使用效能監控和相依性分析工具。
開發人員體驗:提供清楚的文件、工具和範例,以專注於開發人員體驗。這可協助您簡化開發並加入新的團隊成員。
史詩
任務 | 描述 | 所需的技能 |
---|
建立 Shell 應用程式。 | 在角度 中CLI,輸入下列命令: ng new shell --routing
輸入下列命令以導覽至專案資料夾: cd shell
注意: shell 和微型前端應用程式的資料夾和專案結構可以完全獨立。它們可以作為獨立的角度應用程式處理。
| 應用程式開發人員 |
安裝 外掛程式。 | 在角度 中CLI,輸入下列命令來安裝 @angular-architects/module-federation 外掛程式: ng add @angular-architects/module-federation --project shell --port 4200
| 應用程式開發人員 |
將微型前端URL新增為環境變數。 | 開啟 environment.ts 檔案。 mfe1URL: 'http://localhost:5000' 新增至environment 物件:
export const environment = {
production: false,
mfe1URL: 'http://localhost:5000',
};
儲存並關閉 environment.ts 檔案。
| 應用程式開發人員 |
定義路由。 | 開啟 app-routing.module.ts 檔案。 在 Angular 中CLI,輸入下列命令,從 @angular-architects/module-federation 外掛程式匯入loadRemoteModule 模組: import { loadRemoteModule } from '@angular-architects/module-federation';
將預設路由設定為以下內容: {
path: '',
pathMatch: 'full',
redirectTo: 'mfe1'
},
設定微前端的路由: {
path: 'mfe1',
loadChildren: () => loadRemoteModule({
type: 'module',
remoteEntry: `${environment.mfe1URL}/remoteEntry.js`,
exposedModule: './Module'
})
.then(m => m.Mfe1Module)
},
儲存並關閉 app-routing.module.ts 檔案。
| 應用程式開發人員 |
宣告mfe1 模組。 | 在 src 資料夾中,建立一個名為 decl.d.ts 的新檔案。 開啟 decl.d.ts 檔案。 將下列項目新增至 檔案: declare module 'mfe1/Module';
儲存並關閉 decl.d.ts 檔案。
| 應用程式開發人員 |
為微型前端準備預載。 | 預先載入微型前端有助於 Webpack 正確交涉共用程式庫和套件。 開啟main.ts 檔案。 將內容取代為以下內容: import { loadRemoteEntry } from '@angular-architects/module-federation';
Promise.all([
loadRemoteEntry(`${environment.mfe1URL}/remoteEntry.js`, 'mfe1'),
])
.catch(err => console.error('Error loading remote entries', err))
.then(() => import('./bootstrap'))
.catch(err => console.error(err));
儲存並關閉 main.ts 檔案。
| 應用程式開發人員 |
調整HTML內容。 | 開啟 app.component.html 檔案。 將內容取代為以下內容: <h1>Shell application is running!</h1>
<router-outlet></router-outlet>
儲存並關閉 app.component.html 檔案。
| 應用程式開發人員 |
任務 | 描述 | 所需的技能 |
---|
建立微型前端。 | 在角度 中CLI,輸入下列命令: ng new mfe1 --routing
輸入下列命令以導覽至專案資料夾: cd mfe1
| 應用程式開發人員 |
安裝 外掛程式。 | 輸入下列命令來安裝 @angular-architects/module-federation 外掛程式: ng add @angular-architects/module-federation --project mfe1 --port 5000
| 應用程式開發人員 |
建立模組和元件。 | 輸入下列命令以建立模組和元件,並將其匯出為遠端輸入模組: ng g module mfe1 --routing
ng g c mfe1
| 應用程式開發人員 |
設定預設路由路徑。 | 開啟 mfe-routing.module.ts 檔案。 將預設路由設定為以下內容: {
path: '',
component: Mfe1Component
},
儲存並關閉 mfe-routing.module.ts 檔案。
| 應用程式開發人員 |
新增mfe1 路由。 | 開啟app-routing.module.ts 檔案。 將預設路由設定為以下內容: {
path: '',
pathMatch: 'full',
redirectTo: 'mfe1'
},
新增下列mfe1 路由: {
path: 'mfe1',
loadChildren: () =>
import('./mfe1/mfe1.module').then((m) => m.Mfe1Module),
},
儲存並關閉 app-routing.module.ts 檔案。
| 應用程式開發人員 |
編輯 webpack.config.js 檔案。 | 開啟 webpack.config.js 檔案。 編輯 For remotes 區段以符合下列項目: // For remotes (please adjust)
name: "mfe1",
filename: "remoteEntry.js",
exposes: {
'./Module': './src/app/mfe1/mfe1.module.ts',
},
在 shared 區段中,新增mfe1 應用程式與 Shell 應用程式共用的任何相依性: shared: share({
"@angular/core": { singleton: true, strictVersion: true, requiredVersion: 'auto' },
"@angular/common": { singleton: true, strictVersion: true, requiredVersion: 'auto' },
"@angular/common/http": { singleton: true, strictVersion: true, requiredVersion: 'auto' },
"@angular/router": { singleton: true, strictVersion: true, requiredVersion: 'auto' },
...sharedMappings.getDescriptors()
})
儲存並關閉 webpack.config.js 檔案。
| 應用程式開發人員 |
調整HTML內容。 | 開啟 app.component.html 檔案。 將內容取代為以下內容: <router-outlet></router-outlet>
儲存並關閉 app.component.html 檔案。
| 應用程式開發人員 |
任務 | 描述 | 所需的技能 |
---|
執行mfe1 應用程式。 | 輸入下列命令以啟動mfe1 應用程式: npm start
在 Web 瀏覽器中,存取 http://localhost:5000 。 確認微型前端可以獨立執行。mfe1 應用程式應該正確轉譯,沒有任何錯誤。
| 應用程式開發人員 |
執行 Shell 應用程式。 | 輸入下列命令以啟動 shell 應用程式: npm start
在 Web 瀏覽器中,存取 http://localhost:4200/mfe1 。 確認mfe1 微型前端內嵌在 Shell 應用程式中。入口網站應用程式應正確轉譯,沒有任何錯誤,且mfe1 應用程式應內嵌在其中。
| 應用程式開發人員 |
任務 | 描述 | 所需的技能 |
---|
建立模組和元件。 | 在 Shell 應用程式的根資料夾中,輸入下列命令來建立錯誤頁面的模組和元件: ng g module error-page --routing
ng g c error-page
| 應用程式開發人員 |
調整HTML內容。 | 開啟 error-page.component.html 檔案。 將內容取代為以下內容: <p>Sorry, this page is not available.</p>
儲存並關閉 error-page.component.html 檔案。
| 應用程式開發人員 |
設定預設路由路徑。 | 開啟 error-page-routing.module.ts 檔案。 將預設路由設定為以下內容: {
path: '',
component: ErrorPageComponent
},
儲存並關閉 error-page-routing.module.ts 檔案。
| 應用程式開發人員 |
建立函數以載入微型前端。 | 開啟 app-routing.module.ts 檔案。 建立下列函數: function loadMFE(url: string) {
return loadRemoteModule({
type: 'module',
remoteEntry: `${url}/remoteEntry.js`,
exposedModule: './Module'
})
.then(m => m.Mfe1Module)
.catch(
() => import('./error-page/error-page.module').then(m => m.ErrorPageModule)
);
}
將mfe1 路由修改為下列項目: {
path: 'mfe1',
loadChildren: () => loadMFE(environment.mfe1URL)
},
儲存並關閉 app-routing.module.ts 檔案。
| 應用程式開發人員 |
測試錯誤處理。 | 如果尚未執行,請輸入下列命令來啟動 Shell 應用程式: npm start
在 Web 瀏覽器中,存取 http://localhost:4200/mfe1 。 確認已轉譯錯誤頁面。您應該會看到下列文字: Sorry, this page is not available.
| 應用程式開發人員 |
任務 | 描述 | 所需的技能 |
---|
部署微型前端。 | 在 Amplify 中CLI,導覽至微型前端應用程式的根資料夾。 輸入下列命令以初始化 Amplify: amplify init
提示您輸入 Amplify 專案的名稱時,請按 Enter 。這會重複使用 package.json 檔案中的名稱。 當您收到使用上述組態初始化專案的提示時,請輸入 Yes 。 當您收到選取身分驗證方法的提示時,請選擇 AWS Profile 。 選取您要使用的設定檔。 等待 Amplify 初始化專案。當此程序完成時,您會在終端機中收到確認訊息。 輸入下列命令,將 Amplify 託管類別新增至微型前端: amplify add hosting
當您收到選取外掛程式模組的提示時,請選擇 Hosting with Amplify Console 。 當您收到選擇類型的提示時,請選擇 Manual deployment 。 輸入下列命令來安裝專案 npm 相依性: npm install
輸入下列命令,將應用程式發佈至 Amplify 主控台: amplify publish -y
發佈完成後,Amplify 會傳回微型前端URL的 。 複製 URL。您需要此值才能更新 Shell 應用程式。
| 應用程式開發人員、 AWS DevOps |
部署 Shell 應用程式。 | 在 src/app/environments 資料夾中,開啟 environment.prod.ts 檔案。 將 mfe1URL 值取代為部署的微型前端URL的 : export const environment = {
production: true,
mfe1URL: 'https://<env>.<Amplify-app-ID>.amplifyapp.com'
};
儲存並關閉 environment.prod.ts 檔案。 在 Amplify 中CLI,導覽至 Shell 應用程式的根資料夾。 輸入下列命令以初始化 Amplify: amplify init
提示您輸入 Amplify 專案的名稱時,請按 Enter 。這會重複使用 package.json 檔案中的名稱。 當您收到使用上述組態初始化專案的提示時,請輸入 Yes 。 當您收到選取身分驗證方法的提示時,請選擇 AWS Profile 。 選取您要使用的設定檔。 等待 Amplify 初始化專案。當此程序完成時,您會在終端機中收到確認訊息。 將 Amplify 託管類別新增至 Shell 應用程式: amplify add hosting
當您收到選取外掛程式模組的提示時,請選擇 Hosting with Amplify Console 。 當您收到選擇類型的提示時,請選擇 Manual deployment 。 輸入下列命令來安裝專案 npm 相依性: npm install
輸入下列命令,將 Shell 應用程式發佈至 Amplify 主控台: amplify publish -y
發佈完成後,Amplify 會傳回已部署 Shell URL 應用程式的 。 記下 Shell URL 應用程式的 。
| 應用程式開發人員、應用程式擁有者 |
啟用 CORS。 | 由於 Shell 和微型前端應用程式獨立託管在不同網域上,因此您必須在微型前端上啟用跨來源資源共用 (CORS)。這可讓 Shell 應用程式從不同的原始伺服器載入內容。若要啟用 CORS,您可以新增自訂標頭。 在 Amplify 中CLI,導覽至微型前端的根資料夾。 輸入以下命令: amplify configure hosting
當您收到設定自訂設定的提示時,請輸入 Y 。 登入 AWS Management Console,然後開啟 Amplify 主控台 。 選擇微型前端。 在導覽窗格中,選擇託管 ,然後選擇自訂標頭 。 選擇編輯。 在編輯自訂標頭視窗中,輸入下列內容: customHeaders:
- pattern: '*.js'
headers:
- key: Access-Control-Allow-Origin
value: '*'
- key: Access-Control-Allow-Methods
value: 'GET, OPTIONS'
- key: Access-Control-Allow-Headers
value: '*'
選擇 Save (儲存)。 重新部署微型前端以套用新的自訂標頭。
| 應用程式開發人員、 AWS DevOps |
在 Shell 應用程式中建立重寫規則。 | 角殼應用程式設定為使用HTML5路由。如果使用者執行硬重新整理,Amplify 會嘗試從目前的 載入頁面URL。這會產生 403 錯誤。若要避免這種情況,您可以在 Amplify 主控台中新增重寫規則。 若要建立重寫規則,請遵循下列步驟: 在 Amplify 中CLI,導覽至 Shell 應用程式的根資料夾。 輸入以下命令: amplify configure hosting
當您收到設定自訂設定的提示時,請輸入 Y 。 開啟 Amplify 主控台 。 選擇 Shell 應用程式。 在導覽窗格中,選擇託管 ,然後選擇重寫和重新導向 。 在重寫和重新導向頁面上,選擇管理重新導向。 選擇開啟文字編輯器 。 在JSON編輯器中,輸入下列重新導向: [
{
"source": "/<*>",
"target": "/index.html",
"status": "404-200",
"condition": null
}
]
選擇 Save (儲存)。
| 應用程式開發人員、 AWS DevOps |
測試 Web 入口網站。 | 在 Web 瀏覽器中,輸入已部署 Shell URL 應用程式的 。 確認 Shell 應用程式和微型前端負載正確。
| 應用程式開發人員 |
任務 | 描述 | 所需的技能 |
---|
刪除應用程式。 | 如果您不再需要 shell 和微型前端應用程式,請將其刪除。這有助於避免您未使用之資源的費用。 登入 AWS Management Console,然後開啟 Amplify 主控台 。 選擇微型前端。 在導覽窗格中,選擇應用程式設定 ,然後選擇一般設定 。 選擇刪除應用程式 。 在確認視窗中,輸入 delete ,然後選擇刪除應用程式 。 重複這些步驟來刪除 Shell 應用程式。
| 一般 AWS |
故障診斷
問題 | 解決方案 |
---|
執行amplify init 命令時沒有可用的 AWS 設定檔 | 如果您沒有設定 AWS 設定檔,您仍然可以繼續執行 amplify init 命令。不過,當您收到身分驗證方法的提示時,您需要選取 AWS access keys 選項。備妥您的 AWS 存取金鑰和秘密金鑰。 或者,您可以為 設定具名設定檔 AWS CLI。如需指示,請參閱 AWS CLI 文件中的組態和憑證檔案設定。 |
載入遠端項目時發生錯誤 | 如果您在 Shell 應用程式的 main.ts 檔案中載入遠端項目時遇到錯誤,請確定已正確設定environment.mfe1URL 變數。此變數的值應該是微型前端URL的 。 |
存取微型前端時發生錯誤 404 | 如果您在嘗試存取本機微型前端時收到 404 錯誤,例如在 http://localhost:4200/mfe1 ,請檢查下列項目: |
其他資訊
AWS 文件
其他參考