使用 Single-SPA 从零开始搭建 React 微前端项目
在这篇博客中,我们将探讨如何使用Single-SPA从零开始搭建一个React微前端项目,该项目将包含三个不同的子应用。我们将使用Webpack包管理工具和yarn来管理依赖关系,并使用Single-SPA技术来集成和协调不同的子应用。
什么是微前端?
在传统的前端开发中,通常使用单一的前端框架来构建整个应用程序。这意味着我们必须在同一个代码库中维护整个应用程序的代码,并且所有的功能都必须一起部署。然而,随着应用程序变得越来越复杂,这种方法变得越来越难以维护。
微前端是一种新兴的前端开发架构,它通过将应用程序拆分为多个独立的子应用来解决这个问题。每个子应用都可以使用不同的前端框架或技术栈来开发,这些子应用可以单独构建、部署和维护。最终,这些子应用将组合在一起,以创建一个完整的应用程序。
Single-SPA简介
Single-SPA是一种用于构建微前端应用程序的JavaScript框架。它允许你将多个独立的子应用程序集成到一个统一的应用程序中。每个子应用程序可以使用不同的框架或技术栈来开发,并且可以独立构建、部署和维护。
Single-SPA提供了一个应用程序生命周期钩子,使得在不同的子应用之间切换变得容易。它还提供了一些常用的功能,例如路由和事件总线,以帮助你构建更加复杂的微前端应用程序。
准备工作
在开始之前,请确保您已经安装了以下软件:
Node.js
npm 或 yarn
webpack
此外,还需要创建一个新的目录来存储我们的项目。打开终端并执行以下命令
mkdir react-microfrontend
cd react-microfrontend
现在我们已经准备好开始构建React微前端项目了!
步骤一:创建主应用程序
第一步是创建一个主应用程序,它将作为我们微前端应用程序的入口点。使用Create React App来创建我们的主应用程序。打开终端并执行以下命令:
npx create-react-app main-app
cd main-app
现在我们已经创建了一个名为main-app的主应用程序。可以启动开发服务器并查看它是否可以正常工作。在终端中输入以下命令启动开发服务器:
yarn start
在浏览器中打开http://localhost:3000,你应该能够看到一个React应用程序的欢迎页面。
接下来需要将Single-SPA集成到我们的主应用程序中。为此,需要安装Single-SPA和相关依赖项。在终端中执行以下命令:
yarn add single-spa single-spa-react react-router-dom
现在我们已经安装了Single-SPA React包。接下来,需要将React应用程序转换为Single-SPA应用程序。创建一个名为“root-config”的新文件夹,其中包含Single-SPA配置文件。
mkdir root-config
cd root-config
touch index.js
在“index.js”文件中,需要引入Single-SPA并将我们的React应用程序转换为Single-SPA应用程序。这是一个例子:
import React from 'react';
import ReactDOM from 'react-dom';
import singleSpaReact from 'single-spa-react';
import App from '../src/App';const reactLifecycles = singleSpaReact({React,ReactDOM,rootComponent: App,domElementGetter: () => document.getElementById('root'),
});export const bootstrap = [reactLifecycles.bootstrap,
];export const mount = [reactLifecycles.mount,
];export const unmount = [reactLifecycles.unmount,
];
上述代码引入了Single-SPA并将我们的React应用程序转换为Single-SPA应用程序。还为我们的应用程序定义了生命周期方法:bootstrap,mount和unmount。
步骤二:创建子应用程序
接下来,我们将创建三个子应用程序,每个子应用程序都将使用不同的React组件。使用Create React App来创建我们的子应用程序。在终端中执行以下命令:
npx create-react-app subapp1
npx create-react-app subapp2
npx create-react-app subapp3
现在我们已经创建了三个名为subapp1、subapp2和subapp3的子应用程序。
分别进入这些目录并启动开发服务器:
cd subapp1
yarn start
cd subapp2
yarn start
cd subapp3
yarn start
在浏览器中打开http://localhost:3001,http://localhost:3002和http://localhost:3003,你应该能够看到三个React应用程序的欢迎页面。
现在需要将Single-SPA集成到我们的子应用程序中。为此,我们将安装Single-SPA和相关依赖项。在终端中依次进入每个子应用程序目录,并执行以下命令:
yarn add single-spa single-spa-react
在每个子应用程序的根目录中,创建一个名为“single-spa-config”的新文件夹,并在其中创建一个名为“index.js”的新文件。
mkdir single-spa-config
cd single-spa-config
touch index.js
在“index.js”文件中,我们需要导出子应用程序的生命周期方法。以下是一个例子:
import React from 'react';
import ReactDOM from 'react-dom';
import singleSpaReact from 'single-spa-react';
import App from '../src/App';const reactLifecycles = singleSpaReact({React,ReactDOM,rootComponent: App,
});export const bootstrap = [reactLifecycles.bootstrap,
];
export const mount = [
reactLifecycles.mount,
];export const unmount = [
reactLifecycles.unmount,
];
这将导出子应用程序的生命周期方法,我们稍后将在主配置文件中使用它们。
重复以上步骤,将“single-spa-config”文件夹添加到每个子应用程序中。
步骤三:配置Webpack
接下来,我们需要配置Webpack来使我们的项目可以处理Single-SPA应用程序。
在项目根目录中创建一个名为“webpack.config.js”的新文件。在该文件中,需要配置Webpack来使用Single-SPA并处理子应用程序。
const path = require('path');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {entry: path.resolve(__dirname, 'root-config', 'index.js'),output: {filename: 'root-config.js',path: path.resolve(__dirname, 'dist'),},module: {rules: [{test: /\.js$/,exclude: /node_modules/,loader: 'babel-loader',},],},plugins: [new CleanWebpackPlugin(),new HtmlWebpackPlugin({template: path.resolve(__dirname, 'public', 'index.html'),}),],devServer: {historyApiFallback: true,},devtool: 'source-map',externals: [],resolve: {modules: [__dirname, 'node_modules'],alias: {'react': path.resolve(__dirname, 'node_modules', 'react'),'react-dom': path.resolve(__dirname, 'node_modules', 'react-dom'),},extensions: ['.js', '.jsx', '.scss'],},
};
上述代码中,我们定义了Webpack配置文件。我们定义了入口文件和输出路径,配置了Babel处理JavaScript文件,定义了一些插件和devServer选项。我们还配置了externals和resolve属性,以便我们的应用程序可以在运行时动态加载。
第四步:配置主应用程序
现在,我们需要在主应用程序中使用所有子应用程序的Single-SPA。打开“index.js”文件并添加以下代码:
import { registerApplication, start } from 'single-spa';registerApplication('subapp1',() => import('./subapp1/single-spa-config'),() => location.pathname.startsWith('/subapp1')
);registerApplication('subapp2',() => import('./subapp2/single-spa-config'),() => location.pathname.startsWith('/subapp2')
);registerApplication('subapp3',() => import('./subapp3/single-spa-config'),() => location.pathname.startsWith('/subapp3')
);start();
上述代码中,我们使用registerApplication方法注册了所有子应用程序,并定义了它们的URL路径。我们还调用了start方法以启动Single-SPA应用程序。
第五步:运行应用程序
现在,我们已经准备好启动我们的应用程序。在终端中输入以下命令:
yarn start
这将启动Webpack Dev Server并在浏览器中打开应用程序。
现在,你可以访问http://localhost:3000并浏览React微前端应用程序!
结论
在本博客中,我们介绍了如何使用Single-SPA从零开始搭建拥有三个不同子应用的React微前端项目。我们使用Webpack包管理工具,Yarn和Single-SPA技术来构建整个应用程序。我们还讨论了如何在主应用程序中注册子应用程序,并使用Single-SPA方法来启动整个应用程序。希望这篇博客对你有所帮助,感谢阅读!
使用 Single-SPA 从零开始搭建 React 微前端项目相关推荐
- 基于qiankun搭建ng-alain15微前端项目示例实践
基础环境 实践日期:2023-03-04 ng versionAngular CLI: 15.2.1 Node: 18.14.2 Package Manager: npm 9.5.0 OS: win3 ...
- 基于qiankun搭建ng-alain15微前端项目入门实践
基础环境 实践日期:2023-02-22 ng versionAngular CLI: 15.1.6 Node: 18.14.2 Package Manager: npm 9.5.0 OS: win3 ...
- 如何利用qiankun快速搭建一个微前端项目
前言 小伙伴们大家好.前一篇文章跟大家分享了一些关于微前端的知识点,包括什么是微前端,为什么要用微前端以及如何实现一个微前端,在文章的最后我们还提到了能够实现微前端的两个库:single-spa和qi ...
- 从零搭建飞冰微前端项目《第一篇:优势分析》
框架选择: 基于React的飞冰渐进式研发框架(阿里开源,也叫Ice/Icejs) 微前端使用icestark微前端解决方案 UI组件库选择fusifon(企业级的中后台设计系统解决方案) 其他:ah ...
- 从零搭建飞冰微前端项目《第三篇:搭建微应用》❤️
前言: 把微应用接入主应用,其实很简单,但是要还要考虑数据通信等等问题 路途有点远,也得慢慢走! 微应用把React和Vue都用上吧,反正解耦了 创建微应用就不使用AppWorks了,使用官网模板,再 ...
- 从零搭建飞冰微前端项目《第二篇:搭建主应用》
前提: VsCode里有AppWorks 规范: 主应用又称框架应用或基座应用,一个系统只有一个主应用.主应用应该保持职责明确,一个设计良好的主应用只做两件事情: 系统整体 Layout 的设计 所有 ...
- 从零搭建飞冰微前端项目《第四篇:权限管理》
- vue简易微前端项目搭建(一):项目背景及简介
github传送门: 1.h5主项目 2.项目脚手架 3.子项目模板 系列文章传送门: vue简易微前端项目搭建(一):项目背景及简介 vue简易微前端项目搭建(二):子项目模板及项目脚手架搭建 vu ...
- vue简易微前端项目搭建(二):子项目模板及项目脚手架搭建
github传送门: 1.h5主项目 2.项目脚手架 3.子项目模板 系列文章传送门: vue简易微前端项目搭建(一):项目背景及简介 vue简易微前端项目搭建(二):子项目模板及项目脚手架搭建 vu ...
最新文章
- Android--实现自制录音/播放录音程序
- 记一种验证日期格式的正则表达式
- php 系统日志,PHP中把错误日志保存在系统日志中(Windows系统)
- sql如何实现明细账_SQL 如何实现动态的行列转置
- 指甲之指甲长期没有甲半月弧(二)
- 密钥协商(密钥交换)机制的讲解
- Linux cpu亲和力
- word删除分节符后之前的格式乱了_办公室高级技能之Word邮件合并拆分
- 关于运维架构技术的理想化形态设想
- 前端改变div排序_前端面试经常问到的问题
- javascript 网页自动跳转
- batchplot插件用法_batchplot插件怎么安装 batchplot插件安装教程
- 解决iOS 12.4 (16G77), which may not be supported by this version of Xcode
- 皮克定理和任意多边形的面积公式
- 做微信公众号淘宝客返利系统必须要知道3件事儿
- 每日excel学习之查找替换和定位
- C# Winform右下角弹窗方式
- 搜索及代码在GitHub上查重小技巧
- YYC松鼠短视频系统完整版的文件结构目录介绍以及自定义目录详解
- 3D资产大掌柜—Connecter
热门文章
- 卷三十七 汉纪二十九
- [substence designer]最近做的几个PBR材质
- android上传二进制流到服务器,android – 通过ADB shell传输二进制数据(即使...
- ecshop验证码不显示
- IP 核之RAM实验
- 打印时提示计算机的内存不足,电脑中使用惠普P4510打印机打印时出现内存不足怎么处理...
- 致敬2202年,这些优秀的裁缝们
- 某程序员薪资税前上百万却后悔没创业,网友:矫情!
- 数学笔记29——反常积分和瑕积分
- android的访问存储权限,使用SAF(存储访问框架)的Android SD卡写权限