创建了微前端 ( @org/angular-spa-frontend ),以及 URL ( http://localhost:4200/main.js ),其中微前端前端已托管,必须添加到导入映射中。

然后,执行以下命令来运行应用程序。

npm run start

假设这些步骤正确完成,我们应该能够在视图中看到最终的单 Spa,类似于下图。

\\\"Build

第 2 步:生产中部署

在生产中部署这些微前端时,建议将每个微前端应用程序部署为独立的应用程序。根配置可能会动态加载每个应用程序,具体取决于 registerApplication.

中设置的应用程序路由

第 3 步:添加更多微前端

要添加更多微前端,请重复前面提到的步骤。让我们看看如何将 React 微前端集成到同一个根配置中。

使用以下命令创建一个新的 React 微前端。

npx create-single-spa --module-type react

然后,在创建的项目中导航并安装 single-spa-react。

npm install single-spa-react

修改入口文件导出生命周期方法,使应用兼容single-spa。

import React from \\\"react\\\";import ReactDOM from \\\"react-dom\\\";import singleSpaReact from \\\"single-spa-react\\\";import App from \\\"./App\\\";const lifecycles = singleSpaReact({  React,  ReactDOM,  rootComponent: App,  errorBoundary(err, info, props) {    return 
Error loading React micro-frontend
; },});export const { bootstrap, mount, unmount } = lifecycles;

配置完成后,我们可以使用以下命令为React微前端提供服务。

npm start

要将创建的微前端与现有的 root-config 集成,请对 root-config 中的文件进行以下修改。

import { registerApplication, start } from \\\"single-spa\\\";registerApplication({  name: \\\"@org/angular-spa-frontend\\\",  app: () =>    System.import(\\\"@org/angular-spa-frontend\\\")      .then((module) => ({        bootstrap: module.bootstrap,        mount: module.mount,        unmount: module.unmount,      }))      .catch((error) => {        console.error(\\\"Failed to load Angular micro-frontend:\\\", error);        return Promise.reject(error);      }),  activeWhen: [\\\"/\\\"],});registerApplication({  name: \\\"@org/react-spa-frontend\\\",  app: () =>    System.import(\\\"@org/react-spa-frontend\\\")      .then((module) => ({        bootstrap: module.bootstrap,        mount: module.mount,        unmount: module.unmount,      }))      .catch((error) => {        console.error(\\\"Failed to load React micro-frontend:\\\", error);        return Promise.reject(error);      }),  activeWhen: [\\\"/react\\\"], });start({  urlRerouteOnly: true,});

您还需要使用 React 应用程序的主包路径更新 index.ejs 文件。

GitHub 参考

在此 GitHub 演示中查看此单 Spa 应用程序的完整代码示例。

结论

使用 single-spa 构建微前端可以更轻松地将大型应用程序拆分为小的独立部分。这样,不同的团队就可以在不影响其他团队的情况下工作,并使用他们喜欢的框架,例如 Angular 或 React。按照本指南中的步骤,您可以设置单 SPA 项目,连接多个微前端,并为用户提供流畅的体验。 Single-spa 让您可以轻松地随着时间的推移扩展您的应用程序并根据需要添加新功能。

相关博客

","image":"http://www.luping.net/uploads/20250111/173657805567821407db4d2.jpg173657805567821407db4d8.png","datePublished":"2025-01-11T17:54:45+08:00","dateModified":"2025-01-11T17:54:45+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用單 Spa 建造微前端:指南

使用單 Spa 建造微前端:指南

發佈於2025-01-11
瀏覽:151

TL;DR: 使用 single-spa 构建微前端可以更轻松地将大型应用程序拆分为小的独立部分,以便不同的团队可以在不影响其他团队的情况下处理各个部分。本博客展示了如何创建 Angular 和 React 微前端、将它们连接到根配置并进行部署。

微前端已成为扩展前端应用程序的流行架构风格,特别是当多个团队在用户界面的不同部分工作时。通过将整体前端分解为更小的独立模块,团队可以单独部署、更新和扩展应用程序的各个部分。本文将讨论如何使用 single-spa 创建和连接不同框架的微前端。

单水疗中心简介

Build Micro Frontends with single-spa: A Guide

Single-spa是一个基于JavaScript的框架,专为微前端架构设计。它允许您使用 Angular、React 和 Vue 等框架构建微前端,并将它们作为单个应用程序提供服务。它维护连接的应用程序的注册并使用路由将用户重定向到不同的应用程序。

Build Micro Frontends with single-spa: A Guide

使用单SPA框架有很多好处,例如为应用程序的不同部分选择不同的语言、微前端的独立开发和部署以及可扩展性。那么,让我们开始创建一个单一的 Spa。

创建单一水疗中心

先决条件

要实现单一spa,安装Node.jsnpm非常重要。要安装它们,请访问 Node.js 网站并下载适合您的操作系统的最新版本。运行安装程序以完成安装。

然后,通过在命令提示符中执行以下命令来验证node.js和npm安装。

npm - version
node - version

第 1 步:设置项目

在此示例中,将使用 Angular 和 React 创建两个简单的微前端。根配置将为两个微前端提供服务。

创建一个应用程序

我们可以通过执行以下命令来创建一个简单的 Angular 微前端应用程序。

ng new angular-spa-frontend

创建项目后,执行下一个命令来安装 single-spa 库。

ng add single-spa-angular

正确安装库后,将在 Angular 项目中创建一个名为 main.single-spa.ts 的文件,其中包含与 single-spa 相关的所有配置。

参考配置代码。

if (environment.production) {
 enableProdMode();
}

const lifecycles = singleSpaAngular({
 bootstrapFunction: (singleSpaProps) => {
  singleSpaPropsSubject.next(singleSpaProps);

  const extraProviders = [
   ...getSingleSpaExtraProviders(),
   { provide: APP_BASE_HREF, useValue: '/' }
  ];

  return platformBrowserDynamic(extraProviders).bootstrapModule(AppModule);
 },
 template: '',
 Router,
 NavigationStart,
 NgZone,
});

export const bootstrap = lifecycles.bootstrap;
export const mount = lifecycles.mount;
export const unmount = lifecycles.unmount;

需要提供APP_BASE_HREF值才能作为单个spa工作。

此外,添加单 Spa 库后,package.json 将包含两个附加脚本。

"scripts": {
  "ng": "ng",
  "start": "ng serve",
  "build": "ng build",
  "watch": "ng build --watch --configuration development",
  "test": "ng test",
  "build:single-spa:angular-spa-frontend": "ng build angular-spa-frontend --prod",
  "serve:single-spa:angular-spa-frontend": "ng s --project angular-spa-frontend --disable-host-check --port 4200 --live-reload false"
 }

angular.json 文件将使用以下配置进行修改。

"build": {
   "builder": "@angular-builders/custom-webpack:browser",
   "options": {
      "outputPath": "dist/angular-spa-frontend",
      "index": "src/index.html",
      "main": "src/main.single-spa.ts",
      "polyfills": "src/polyfills.ts",
      "tsConfig": "tsconfig.app.json",
      "inlineStyleLanguage": "scss",
      "assets": [
       "src/favicon.ico",
       "src/assets"
      ],
      "styles": [
       "src/styles.scss"
      ],
      "scripts": [],
      "customWebpackConfig": {
       "path": "extra-webpack.config.js",
       "libraryName": "angular-spa-frontend",
       "libraryTarget": "umd"
      },
      "deployUrl": "http://localhost:4200/"
     },

}

“main”: “src/main.ts” 将替换为 “main”: “src/main.single-spa.ts”。新的构建配置将作为 JavaScript 模块添加。

配置完成并验证后,我们可以使用以下命令提供 Angular 应用程序。

npm run serve:single-spa:angular-spa-frontend

现在我们已经成功创建了微前端应用程序,让我们看看如何实现root-config.

根配置

执行以下命令创建root-config。

npx create-single-spa

输入此命令后,将出现一系列配置来创建根配置。 Build Micro Frontends with single-spa: A Guide

选择之前的配置后,将创建根配置来服务多个前端。

要将创建的微前端连接到root-config,我们需要修改root-config.tsindex.ejs文件。

registerApplication({
 name: "@org/angular-spa-frontend",
 app: () =>
  System.import("@org/angular-spa-frontend")
   .then((module: LifeCycles) => ({
    bootstrap: module.bootstrap,
    mount: module.mount,
    unmount: module.unmount,
   }))
   .catch((error) => {
    console.error("Failed to load micro-frontend:", error);
    return Promise.reject(error);
   }),
  activeWhen: ['/'],
});

start({
 urlRerouteOnly: true,
});

如前面的代码块中所述,创建的微前端应导入到root-config.ts文件中。

name: "@org/angular-spa-frontend",

以下脚本应添加到index.ejs文件中。


 

 

创建了微前端 ( @org/angular-spa-frontend ),以及 URL ( http://localhost:4200/main.js ),其中微前端前端已托管,必须添加到导入映射中。

然后,执行以下命令来运行应用程序。

npm run start

假设这些步骤正确完成,我们应该能够在视图中看到最终的单 Spa,类似于下图。

Build Micro Frontends with single-spa: A Guide

第 2 步:生产中部署

在生产中部署这些微前端时,建议将每个微前端应用程序部署为独立的应用程序。根配置可能会动态加载每个应用程序,具体取决于 registerApplication.

中设置的应用程序路由

第 3 步:添加更多微前端

要添加更多微前端,请重复前面提到的步骤。让我们看看如何将 React 微前端集成到同一个根配置中。

使用以下命令创建一个新的 React 微前端。

npx create-single-spa --module-type react

然后,在创建的项目中导航并安装 single-spa-react。

npm install single-spa-react

修改入口文件导出生命周期方法,使应用兼容single-spa。

import React from "react";
import ReactDOM from "react-dom";
import singleSpaReact from "single-spa-react";
import App from "./App";

const lifecycles = singleSpaReact({
  React,
  ReactDOM,
  rootComponent: App,
  errorBoundary(err, info, props) {
    return 
Error loading React micro-frontend
; }, }); export const { bootstrap, mount, unmount } = lifecycles;

配置完成后,我们可以使用以下命令为React微前端提供服务。

npm start

要将创建的微前端与现有的 root-config 集成,请对 root-config 中的文件进行以下修改。

import { registerApplication, start } from "single-spa";

registerApplication({
  name: "@org/angular-spa-frontend",
  app: () =>
    System.import("@org/angular-spa-frontend")
      .then((module) => ({
        bootstrap: module.bootstrap,
        mount: module.mount,
        unmount: module.unmount,
      }))
      .catch((error) => {
        console.error("Failed to load Angular micro-frontend:", error);
        return Promise.reject(error);
      }),
  activeWhen: ["/"],
});

registerApplication({
  name: "@org/react-spa-frontend",
  app: () =>
    System.import("@org/react-spa-frontend")
      .then((module) => ({
        bootstrap: module.bootstrap,
        mount: module.mount,
        unmount: module.unmount,
      }))
      .catch((error) => {
        console.error("Failed to load React micro-frontend:", error);
        return Promise.reject(error);
      }),
  activeWhen: ["/react"], 
});

start({
  urlRerouteOnly: true,
});

您还需要使用 React 应用程序的主包路径更新 index.ejs 文件。





GitHub 参考

在此 GitHub 演示中查看此单 Spa 应用程序的完整代码示例。

结论

使用 single-spa 构建微前端可以更轻松地将大型应用程序拆分为小的独立部分。这样,不同的团队就可以在不影响其他团队的情况下工作,并使用他们喜欢的框架,例如 Angular 或 React。按照本指南中的步骤,您可以设置单 SPA 项目,连接多个微前端,并为用户提供流畅的体验。 Single-spa 让您可以轻松地随着时间的推移扩展您的应用程序并根据需要添加新功能。

相关博客

  • 使用 RxJS 掌握异步 JavaScript
  • Axios 和 Fetch API?选择正确的 HTTP 客户端
  • TypeScript 实用程序类型:完整指南
  • 安全 JWT 存储:最佳实践
版本聲明 本文轉載於:https://dev.to/syncfusion/build-micro-frontends-with-single-spa-a-guide-4aj3?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2025-01-12
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2025-01-12
  • 插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入記錄時如何解決「一般錯誤:2006 MySQL 伺服器已消失」介紹:將資料插入MySQL 資料庫有時會導致錯誤「一般錯誤:2006 MySQL 伺服器已消失」。當與伺服器的連線遺失時會出現此錯誤,通常是由於 MySQL 配置中的兩個變數之一所致。 解決方案:解決此錯誤的關鍵是調整wait_tim...
    程式設計 發佈於2025-01-12
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此在JS中它們也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index pa...
    程式設計 發佈於2025-01-12
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2025-01-12
  • HTML 格式標籤
    HTML 格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2025-01-12
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內容...
    程式設計 發佈於2025-01-11
  • 每日 JavaScript 挑戰 #JS - 找出最長的公共前綴
    每日 JavaScript 挑戰 #JS - 找出最長的公共前綴
    每日 JavaScript 挑戰:找出最長的公共前綴 嘿,開發者們! ?歡迎來到今天的 JavaScript 程式設計挑戰。讓我們保持敏銳的程式設計技能! 挑戰 難度:中 主題:字串操作 描述 給定一個字串數組,編寫一個函數來尋找其中最長的公共前綴...
    程式設計 發佈於2025-01-11
  • 如何修復 macOS 上 Django 中的「配置不正確:載入 MySQLdb 模組時出錯」?
    如何修復 macOS 上 Django 中的「配置不正確:載入 MySQLdb 模組時出錯」?
    MySQL配置不正確:相對路徑的問題在Django中運行python manage.py runserver時,可能會遇到以下錯誤:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    程式設計 發佈於2025-01-11
  • 如何計算Oracle 11g中兩個日期之間的確切天數?
    如何計算Oracle 11g中兩個日期之間的確切天數?
    檢索Oracle 11g中日期之間的天數問題:如何我在Oracle 11g 中取得兩個日期之間的確切天數?使用表達式 sysdate - to_date('2009-10-01', 'yyyy-mm-dd') 會產生一個區間而不是整數。 答案:要在Oracle 11g...
    程式設計 發佈於2025-01-11
  • 使用單 Spa 建造微前端:指南
    使用單 Spa 建造微前端:指南
    TL;DR: 使用 single-spa 构建微前端可以更轻松地将大型应用程序拆分为小的独立部分,以便不同的团队可以在不影响其他团队的情况下处理各个部分。本博客展示了如何创建 Angular 和 React 微前端、将它们连接到根配置并进行部署。 微前端已成为扩展前端应用程序的流行架构风格,特别是当...
    程式設計 發佈於2025-01-11
  • 如何使用 MongoDB Go 驅動程式建立嵌套 OR/AND 查詢?
    如何使用 MongoDB Go 驅動程式建立嵌套 OR/AND 查詢?
    使用MongoDB Go Driver 進行嵌套邏輯查詢MongoDB 查詢通常需要使用嵌套邏輯運算子(AND/OR) 來過濾基於文檔的文檔根據多個標準。在 Go MongoDB 驅動程式中,可以使用 bson.D 和 bson.M 類型建構巢狀邏輯查詢。 建構嵌套OR/AND 查詢建立一個巢狀OR...
    程式設計 發佈於2025-01-11
  • 隨機森林分類:揭示改變決策的強大機器學習技術
    隨機森林分類:揭示改變決策的強大機器學習技術
    簡介:明智決策的森林 想像一個專家顧問團隊,每個人都帶來獨特的見解來解決複雜的問題。這正是隨機森林分類在機器學習領域的工作原理——一種強大的智慧技術,結合多個決策樹來做出極其準確的預測。 什麼是隨機森林分類? 隨機森林是一種整合學習方法,其運作方式類似於機器學習的...
    程式設計 發佈於2025-01-10
  • TEMPLINK 單一、安全的連結可在幾秒鐘內存​​取多個文件
    TEMPLINK 單一、安全的連結可在幾秒鐘內存​​取多個文件
    TEMPLINK 實際上是做什麼的? Templink 允許您創建一個安全的鏈接,只需幾秒鐘即可訪問多個文件。透過設定過期日期和密碼保護的選項,您可以完全控制您的檔案共用體驗。 在這裡試試看 - https://templink-nu.vercel.app/ Github 儲存庫...
    程式設計 發佈於2025-01-10
  • 如何使用相關表中的值更新一個表中的欄位?
    如何使用相關表中的值更新一個表中的欄位?
    使用相關表格中的值更新欄位 本文探討如何根據特定條件(QuestionID 為 NULL)更新一個表格 (QuestionTrackings) 中的資料列,該資料列的值來自相關表 (QuestionAnswers)。我們可以使用 UPDATE 語句結合 INNER JOIN 來實現此目的。 SQ...
    程式設計 發佈於2025-01-10

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3