上手京东微前端框架micro-app(保姆级教学)

最近公司准备做一下项目整体架构的优化,采用微前端的架构,将项目拆分为一个基座主服务和N个子服务。
根据市场的反馈准备入手京东的微前端框架micro-app,所以让我调研了一下,目前体验还不错。

微前端

首先介绍一下什么是微前端。
微前端的概念是由ThoughtWorks在2016年提出的,它借鉴了微服务的架构理念,核心在于将一个庞大的前端应用拆分成多个独立灵活的小型应用,每个应用都可以独立开发、独立运行、独立部署,再将这些小型应用融合为一个完整的应用,或者将原本运行已久、没有关联的几个应用融合为一个应用。微前端既可以将多个项目融合为一,又可以减少项目之间的耦合,提升项目扩展性,相比一整块的前端仓库,微前端架构下的前端仓库倾向于更小更灵活。
它主要解决了两个问题:

  • 1、随着项目迭代应用越来越庞大,难以维护。
  • 2、跨团队或跨部门协作开发项目导致效率低下的问题。
    在这里插入图片描述

micro-app和其它微前端框架的区别

micro-app之前,业内已经有一些开源的微前端框架,比较流行的有2个:single-spaqiankun

single-spa是通过监听url change事件,在路由变化时匹配到渲染的子应用并进行渲染,这个思路也是目前实现微前端的主流方式。同时single-spa要求子应用修改渲染逻辑并暴露出三个方法:bootstrapmountunmount,分别对应初始化、渲染和卸载,这也导致子应用需要对入口文件进行修改。因为qiankun是基于single-spa进行封装的,所以这些特点也被qiankui继承下来,并且需要对webpack配置进行一些修改。

micro-app并没有沿袭single-spa的思路,而是借鉴了WebComponent的思想,通过CustomElement结合自定义的ShadowDom,将微前端封装成一个类WebComponent组件,从而实现微前端的组件化渲染。并且由于自定义ShadowDom的隔离特性,micro-app不需要像single-spaqiankun一样要求子应用修改渲染逻辑并暴露出方法,也不需要修改webpack配置,是目前市面上接入微前端成本最低的方案。

在这里插入图片描述
所以综上所述micro-app的优势如下:

  1. 使用简单
    将所有功能都封装到一个类WebComponent组件内,从而实现在基座应用中嵌入一行代码即可渲染一个微前端应用。
    同时micro-app还提供了js沙箱、样式隔离、元素隔离、预加载、数据通信、静态资源补全等一系列完善的功能。
  2. 零依赖
    micro-app没有任何依赖,这赋予它小巧的体积和更高的拓展行。
  3. 兼容所有框架
    为了保证各个业务之间独立开发、独立部署的能力,micro-app做了诸多兼容,在任何技术框架中都可以正常运行。

上手实战

了解完以上内容之后,就可以着手实战一下了,实测非常简单。

因为micro-app对主服务和子服务的技术栈没有任何要求,所以,我们新建三个项目,my-app(React)my-app1(React)my-app2(Vue)

my-app是整体项目的主服务,也就是基座,my-app1my-app2都是平级的子服务。

因为是写demo,所以ReactVue项目都基于其框架提供的脚手架create-react-appvue-cli来构建,不基于脚手架的话用webpack自己构建也没有任何问题。

首先我们先建立一个干净的空文件夹,名字为micro-app-demo,通过VSCode进入这个目录。

主服务my-app的构建

通过脚手架create-react-app创建一个React项目,并启动

npx create-react-app my-app
cd my-app
npm start

在这里插入图片描述
启动成功,可以看到主服务地址http://localhost:3000
然后安装一下micro-app

npm i @micro-zoe/micro-app --save

下载完成之后,进入项目的入口文件,create-react-app创建的项目默认的入口文件是index.js

import microApp from '@micro-zoe/micro-app';microApp.start();

index.js完整代码。

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import microApp from '@micro-zoe/micro-app';microApp.start();
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<React.StrictMode><App /></React.StrictMode>
);// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

然后主服务的配置就可以先暂停了,等子服务创建了再引入。

子服务my-app1的构建

第一个子服务my-app1也通过create-react-app构建并启动。

npx create-react-app my-app1
cd my-app1
npm start

因为默认的3000端口已经被主服务my-app用了,所以会启动子服务my-app1会提示是否要换另一端口启动。
在这里插入图片描述
输入y。
然后就可以看到它启动成功了。
在这里插入图片描述
可以看到子服务1的地址是http://localhost:3001

然后重点来了,理论上,通过micro-app构建微前端项目,在服务间不通信的前提下,子服务只需要配置跨域就可以,其他都不需要弄,可以说是完全零侵入、低成本的方案。

通过create-react-app构建的项目默认就进行了跨域的相关配置。
如果不放心,或者想更改webpack的配置,可以打开控制台,输入

npm run eject

package.json中也可以看到这个指令。
输入完之后就一直yes就行了。
可能你会遇到这种报错。
在这里插入图片描述
因为我们在构建完项目之后进行了一些代码的更改,所以提示你要先保存这些更改,才可以eject

git指令大家应该都熟悉

git add .
git commit -m 'your commit'

然后再npm run eject就没问题了。

my-app1的项目目录内就多了一个config文件夹,打开其中的webpackDevServer.config.js,这就是脚手架帮我们封装的基础版的webpack的一些配置项,39-43行可以看到关于跨域的处理。

在这里插入图片描述
所以你不需要做额外处理。
然后为了在视觉上方便区分这几个服务,我们在主页面内都加一个h1标签。

my-app1/src/App.js

import logo from './logo.svg';
import './App.css';function App() {return (<div className="App"><header className="App-header"><img src={logo} className="App-logo" alt="logo" /><h1>子服务1 my-app1</h1><p>Edit <code>src/App.js</code> and save to reload.</p><aclassName="App-link"href="https://reactjs.org"target="_blank"rel="noopener noreferrer">Learn React</a></header></div>);
}export default App;

在这里插入图片描述

子服务my-app2的构建

子服务my-app2vue-cli构建一个Vue项目。

前提你要先全局安装过vue-cli,如果没有先运行以下指令安装vue-cli

npm install -g @vue/cli

然后确定本地有vue-cli的前提下运行以下指令。

vue create my-app2
cd my-app2
npm run serve

create的时候选一个默认配置的就可以,我选的vue2的默认配置。

在这里插入图片描述
可以看到子服务my-app2启动成功了,地址是http://localhost:8080

同样在主页面加入一个h1标签。

my-app2/src/App.vue

<template><div id="app"><h1>子服务2 my-app2</h1><img alt="Vue logo" src="./assets/logo.png"><HelloWorld msg="Welcome to Your Vue.js App"/></div>
</template><script>
import HelloWorld from './components/HelloWorld.vue'export default {name: 'App',components: {HelloWorld}
}
</script><style>
#app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;margin-top: 60px;
}
</style>

在这里插入图片描述
通过vue-cli构建的Vue项目默认是没有进行跨域配置的,所以我们需要手动打开my-app2根目录下的vue.config.js文件,抄写一下my-app1中做的跨域处理,即以下代码:

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({transpileDependencies: true,devServer: {headers: {'Access-Control-Allow-Origin': '*','Access-Control-Allow-Methods': '*','Access-Control-Allow-Headers': '*',},},
})

更改vue.config.js的配置后需要重新启动项目才能生效,所以记得讲my-app2这个子服务,停止再启动。

建立三个服务的关系

回到主服务my-app中。

你可以将my-app1my-app2这两个子服务想象成你封装的两个组件,可以任意的在任何地方进行调用。

只需要通过micro-app提供的组件来配置就可以,比如下方这种方式。

<micro-app name='app1' url='http://localhost:3000/' baseroute='/my-page'>
</micro-app

常规使用,只需要写三个属性,name子服务的应用名称(必传),url子服务的应用地址(必传),baseroute主服务分配给子服务的基础路由,(可选)。

我们在src目录下新建四个文件,三个作为页面,一个配置路由规则,给子服务们分配一下路由。
在这里插入图片描述
my-app/src/Page.jsx

import React from "react";const Page = () => {return (<div><h1>主服务 Page</h1></div>)
};export default Page;

my-app/src/Page1.jsx

import React from "react";const Page1 = () => {return (<div><micro-appname="my-app1"url="http://localhost:3001"baseroute="my-app1"></micro-app></div>)
};export default Page1;

my-app/src/Page2.jsx

import React from "react";const Page2 = () => {return (<div><micro-appname="my-app2"url="http://localhost:8080"baseroute="my-app2"></micro-app></div>)
};export default Page2;

my-app/src/route.js

因为create-react-app脚手架默认没有安装react-router,所以在主服务my-app里安一下。

npm install react-router-dom --save
import { BrowserRouter, Route, Routes } from 'react-router-dom';
import Page from './Page';
import Page1 from './Page1';
import Page2 from './Page2';export default function AppRoute() {return (<BrowserRouter><Routes><Route path='/' element={<Page />}></Route><Route path='/my-app1' element={<Page1 />}></Route><Route path='/my-app2' element={<Page2 />}></Route></Routes></BrowserRouter>)
}

my-app/src/App.js

import './App.css';
import AppRoute from './route';function App() {return (<div className="App"><AppRoute /></div>);
}export default App;

走到这里,理论上你就可以看效果了。

http://localhost:3000会访问主服务的默认页面,承载在Page.jsx内。

在这里插入图片描述
http://localhost:3000/my-app1会访问子服务1 my-app1的默认页面,承载在Page1.jsx内。

在这里插入图片描述
http://localhost:3000/my-app2会访问子服务2 my-app2的默认页面,承载在Page2.jsx内。

在这里插入图片描述
通过域名我们也可以看到,这三个页面都在主服务http://localhost:3000下可以访问的,是不是很神奇。

我有一个主服务,然后可以调用N个其他域名启动的子服务,集成在一起。

子服务理论上也可以独立运行,通过域名访问也可以看到这一点。

在这里插入图片描述
在这里插入图片描述
我分别访问http://localhost:3001http://localhost:8080这些子服务没有受到任何影响。

这就是micro-app这个微前端框架的强大之处。

总结

通过实践,我们可以发现micro-app这个微前端框架的,代码侵入性极低,我们只在主服务里写了几行关于微前端配置的代码,子服务在不进行通信的前提下,只需要配置跨域即可。

如此低成本就能将N个独立的子服务集成到一起,对于原服务也不会有任何影响。

甚至不限制任何技术栈,我们的主服务是React,子服务1是React,子服务2是Vue,也可以很轻松的进行集成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/233505.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac截图Snagit 中文介绍

1.超越普通的屏幕截图 TechSmith Snagit 是唯一具有内置高级图像编辑和屏幕录制功能的屏幕捕获软件。因此&#xff0c;您可以在一个程序中轻松创建高质量的图像和视频。 2.最后&#xff0c;屏幕捕获软件可以完成您所做的一切 快速解释一个过程如果您正在努力清楚地沟通&…

SpringMVC多种类型数据响应

SpringMVC多种类型数据响应入门 1.概念 RequestMapping 作用&#xff1a;用于建立请求URL和处理请求方法之间的对应关系 位置&#xff1a; 类上&#xff0c;请求URL的第一级访问目录。此处不写的话&#xff0c;就相当于应用的根目录 方法上&#xff0c;请求URL的第二级访问目…

【腾讯云 HAI域探秘】使用高性能应用服务HAI快速开发一款赛博朋克风拼图游戏,化繁从简,低成本进入人工智能时代。

前言 人工智能&#xff08;AI&#xff09;是当今科技领域的热门话题&#xff0c;尤其是自然语言处理&#xff08;NLP&#xff09;技术&#xff0c;它可以让机器理解和生成自然语言。随着大型语言模型&#xff08;LLM&#xff09;的发展&#xff0c;如 GPT-3、DALL-E 等&#xf…

java元注解

一、注解 Annotation&#xff08;注解&#xff09;是 Java 提供的一种对元程序中元素关联信息和元数据&#xff08;metadata&#xff09;的途径和方法。 Annatation(注解)是一个接口&#xff0c;程序可以通过反射来获取指定程序中元素的 Annotation对象&#xff0c;然后通过该…

Find My戒指|苹果Find My技术与戒指结合,智能防丢,全球定位

戒指是一种戴套在手指上做纪念或装饰用的小环&#xff0c;用金属、玉石等制成。如今智能戒指是炙手可热的可穿戴设备&#xff0c;智能戒指可以进行健康监测&#xff0c;包括实时监测心率、睡眠质量、步数等个人健康指标&#xff0c;并提供有关饮食和锻炼的建议&#xff0c;以帮…

怎么检测电脑电源?电脑电源检测系统软件如何助力?

电源是电脑的重要组成部分&#xff0c;为电脑提供稳定电源&#xff0c;保证电脑正常工作。但是在电脑实际使用过程中总会遇到各种各样的问题和故障&#xff0c;比如无法开机&#xff0c;因此电脑电源检测是非常重要的测试内容。 如何测试电脑电源? 1. 用万用表检测 a. 将万用表…

开放式耳机怎么选?热门开放式耳机推荐,选购轻松拿捏

开放式耳机已逐渐成为2023年及未来一段时间的热门品类&#xff0c;其相对于封闭入耳式耳机&#xff0c;不封堵耳朵、让耳朵实时感知外界环境音、减轻耳道负担以及更舒适佩戴感等多重优势&#xff0c;满足户外运动、上班通勤人群所需&#xff0c;和主流入耳式耳机也形成互补&…

App的测试,和传统软件测试有哪些区别?应该增加哪些方面的测试用例?

从上图可知&#xff0c;测试人员所测项目占比中&#xff0c;App测试占比是最高的。 这就意味着学习期间&#xff0c;我们要花最多的精力去学App的各类测试。也意味着我们找工作前&#xff0c;就得知道&#xff0c;App的测试点是什么&#xff0c;App功能我们得会测试&#xff0…

免费SSL证书有效果吗?

首先&#xff0c;我们要明确一点&#xff1a;无论是付费还是免费的SSL证书&#xff0c;它们都能实现基本的HTTPS加密功能&#xff0c;确保数据在客户端和服务器之间的传输过程中不会被窃取或篡改。从这个角度来看&#xff0c;免费SSL证书的确可以提供一定的安全保障。 然而&…

网络安全应该怎么学?(0基础小白)

一、网络安全应该怎么学&#xff1f; 1.计算机基础需要过关 这一步跟网安关系暂时不大&#xff0c;是进入it行业每个人都必须掌握的基础能力。 计算机网络计算机操作系统算法与数据架构数据库 Tips:不用非要钻研至非常精通&#xff0c;可以与学习其他课程同步进行。 2.渗透技…

机器学习入门(第五天)——决策树(每次选一边)

Decision tree 知识树 Knowledge tree 一个小故事 A story 挑苹果&#xff1a; 根据这些特征&#xff0c;如颜色是否是红色、硬度是否是硬、香味是否是香&#xff0c;如果全部满足绝对是好苹果&#xff0c;或者红色硬但是无味也是好苹果&#xff0c;从上图可以看出来&#…

利用ARCGIS做地下水脆弱性评价分析

&#xff08;一&#xff09;行政边界数据、土地利用数据和土壤类型数据 本文所用到的河北唐山行政边界数据、土地利用数据和土壤类型数据均来源于中国科学院资源环境科学与数据中心&#xff08;https://www.resdc.cn/Default.aspx&#xff09;。 &#xff08;二&#xff09;地…