js获取微信号_【前端架构】微前端实战

本文介绍了微前端的实践方案,包括路由分发式的微前端,使用iframe作为容器的遗留系统微前端,微应用化的设计与实现,前端微服务化,以及组件化微前端的两种实现方式:运行时编译和预编译。内容涵盖了微前端的架构设计、通信机制、测试策略以及优缺点分析。
摘要由CSDN通过智能技术生成

 一、遗留系统:路由分发

  1. 路由分发式微前端

    1. 适用场景

      1. 不同技术栈之间差异较大,难以兼容、迁移、改造

      2. 项目不想花费大量的时间在这个系统的改造上

      3. 现在的系统在未来将会被取代

      4. 系统功能已经很完善,基本不会有新需求

    2. 基于路由分发的Nginx配置示例

http {  server {    listen 80;    server_name www.demo.com;    location /api/ {      proxy_pass http://www.test1.com/api;    }    location /web/admin {      proxy_pass http://www.test2.com/web/admin;    }    location /web/notifications {      proxy_pass http://www.test3.com/web/notifications;    }    location / {      proxy_pass /;    }  }}

路由分发的测试

  1. 单元测试:URL验证

  2. 集成测试:URL重定向测试

二、遗留系统微前端:使用iframe作为容器

  1. 设计应用管理机制

    1. 应用加载、卸载时机

    2. 动画过渡

  2. 设计应用通信机制

    1. 通过iframeEl.contentWindow获取iframe元素的window对象

    2. 定义通信规范:事件名格式、何时开始监听事件、何时解绑监听事件

三、微应用化

  1. 形式和原理

    1. 构建时以单体应用的形式构建

    2. 运行时以应用模块的形式存在

    3. 原理:从多个项目中复制出代码,合并到一个项目中

  2. 架构实施

    1. 持续集成设计

      1. 子应用代码更新,触发对应模块的持续构建

      2. 主应用代码更新,触发整个系统的持续构建

      3. 一旦子应用持续构建成功,就会触发整个系统的持续构建

    2. 设计占位方式

      1. 子应用中指向其他子应用的路由

      2. 主应用中的子应用模块

  3. 测试策略

    1. 依赖一致性测试

      1. 比对子应用中package.json的依赖版本

    2. 功能模块生成测试

      1. 测试复制的模块能否复制到对应的目录上:编写脚本,在持续集成的过程中运行测试脚本,如果没有检测到exit(-1),则持续集成构建失败

      2. 测试生成的模块代码大小是否正常:正常情况下每个chunk.js文件要大于空白的模块;同时在持续集成中运行脚本,并执行exit(-1)

      3. E2E测试

四、前端微服务化

  1. 微服务化设计方案

    1. 基座控制系统8923a8ca3a29a6089f17c7e43b534442.png

      1. 主工程在运行的时候,会去服务器获取最新的应用配置

      2. 主工程在获取配置后,将逐一创建应用,并为应用绑定生命周期

      3. 当主工程监测到路由变化时,将寻找是否有对应的路由匹配到应用

      4. 当匹配到对应的应用时,则加载相应的应用

    2. 应用间事件

      1. 避免应用间事件名冲突

      2. 可以将应用名作为应用内事件前缀

    3. 设计路由响应机制

      1. 基座应用只负责自己相应的路由,剩下的路由用一个统一的模块来处理,如Angular中的入口模块AppModule

      2. 当基座应用的路由发生变化后,会发出对应的路由变化的全局事件

      3. 在子应用启动后,它们将监听是否有相应的路由变化

  2. 通用型前端微服务化:Single-SPA

    1. 基座部分

      import * as singleSpa from 'single-spa';sinleSpa.registerApplication(  'app-1',   () => import('app1/app1.js'),  pathPrefix('/app1'));singleSpa.registerApplication(  'app2',  () => import('app2/app2.js'),  pathPrefix('/app2'));singleSpa.start()
    2. 子应用部分

      1. React例子

        import React from 'react';import ReactDOM from 'react-dom';import singleSpaReact from 'single-spa-react';import Root from './root.component.js';const reactLifecycles = singleSpaReact({  React,  ReactDOM,  rootComponent: Root,  domElementGetter});export function bootstrap(props) {  return reactLifecycles.bootstrap(props);}export function mount(props) {  return reactLifecycles.mount(props);}export function unmount(props) {  return reactLifecycles.unmount(props);}
      2. Angular例子

        const ngLifecycles = singleSpaAngular({  domElementGetter,  mainModule,  angularPlatform: platformBrowserDynamic(),  template: ``,  Router,})
    3. 优缺点

      1. 优势

        1. 能支持大部分主流的前端框架,也能支持传统的前端框架

        2. 提供更好的用户体验,即不需要页面跳转,直接在当前页面载入

        3. 方便迁移旧的遗留系统

      2. 缺陷

        1. 系统构建复杂,应用需要集成在一起进行构建

        2. 不支持不同应用的部署分离

        3. 代码结构复杂

        4. 有额外的大量学习成本

  3. 定制型前端微服务化:Mooa

    1. 主工程部分

      1. 初始化微前端框架相关的配置

      2. 从远程获取所有子应用的配置

      3. 配置所有的子应用

      4. 进行主工程和子应用的路由配置

      5. 监测路由变化,一旦匹配到对应的路由,则加载对应的应用,并卸载旧的应用

    2. 子应用部分

      1. 路由更新

      2. 适配框架的基准URL

      3. 解决依赖冲突

    3. iframe隔离

      1. 为不同的子应用分配ID

      2. 在子应用中进行hook,以通知主应用:子应用已加载

      3. 在子应用中创建对应的事件监听,来响应主应用的URL变化事件

      4. 在主应用中监听子程序的路由跳转等需求

五、组件化微前端:微件化

  1. 运行时编译微件化:动态组件渲染

    1. Vue微件化

      1. 编写应用容器模板

        "app-2">  "message">   鼠标悬停几秒钟查看此处动态绑定的提示信息!  
      2. 编写实例化应用脚本

        var app2 = new Vue({  el: '#app-2',  data: {    message: '页面加载于' + new Date().toLocaleString()  }}
      3. 将模板和脚本放置在远程,在需要调用的地方创建与容器id对应的元素,接着运行相应脚本即可

    2. Angular微件化

      1. 在核心工程中提供微件化所需要的环境

        SystemJs.set('@angular/core', SystemJs.newModule(angularCore));SystemJs.set('@angular/common', SystemJs.newModule(angularCommon));SystemJs.set('@angular/common/http', SystemJs.newModule(angularCommonHttp));
      2. 在微件工程里,构建出能运行在核心工程的代码

        // 导入微件const module = await SystemJs.import(widget.moduleBundlePath);// 编译模块const moduleFactory = await this.compiler.compileModuleAsync(module[widget.moduleName]);// 解析 ComponentFactoryconst moduleRef = moduleFactory.create(this.injector);const componentProvider = moduleRef.injector.get(widget.name);const componentFactory = moduleRef.componentFactoryResolver.resolveComponentFactory(componentProvider);// 编译组件this.content.createComponent(componentFactory);
  2. 预编译微件化

    1. React微件化

      1. 编写统一的API,封装React的根组件

        export const init = (config) => {  ReactDOM.render(<App/>, document.getElementById('root'));  serviceWorker.unregister();}
      2. 修改构建系统的配置,让其输出可在浏览器上直接运行的版本

        var config = {  // ...  output: {    // ...    library: 'MyApp',    libraryTarget: 'umd',    umdNameDefine: true,  }}
      3. 加载对应的JavaScript脚本,并调用组件的初始化方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值