微前端指南

81 阅读2分钟

1. 什么是微前端

就是将不同的功能按照不同的维度拆分成多个子应用,通过主应用(基座)来加载这些子应用

2. 使用微前端可以解决以下问题:

  1. 不同团队间开发同一个应用技术
  2. 每个团队可以独立开发,独立部署
  3. 不影响项目中老的代码
    基于以上问题可以将一个应用划分成若干子应用,将子应用打包成一个个的库,当路径切换的时候加载不同的子应用。这样每个子应用都是独立的,对技术栈没有限制,从而解决了不同团队协同开发的问题

3. 实现原理

  • 路由劫持
  • 沙箱隔离
  • 应用加载
  • 生命周期

路由劫持:

由于pushStatereplaceState会导致路由的变更,但不会触发对应的事件,所以会重写逻辑来主动触发处理

image.png

沙箱隔离:

一个网页主要由js,html,css三部分组成,如果这三者在同一个上下文中执行,那么不可避免的会产生各种冲突,因此需要一个沙箱机制来隔离冲突

js隔离

js隔离: js沙箱proxy 快照沙箱

<script>
        class SnapshotSandbox{
            constructor(){
                this.proxy = window  // window的属性
                this.modifypropsMap = {}  // 记录在window上的修改
                this.active()
            }
            active(){
                this.windowSnapshot ={};  // 拍照
                for(const prop in window){
                    if(window.hasOwnProperty(prop)){
                        this.windowSnapshot[prop] = window[prop]
                    }
                }
                Object.keys(this.modifypropsMap).forEach((p) =>{
                    window[p] = this.modifypropsMap[p]
                })
            }
            inactive(){
                for(const prop in window){
                    if(window.hasOwnProperty(prop)){
                        if(window[prop] !== this.windowSnapshot[prop]){
                            this.modifypropsMap[prop] = window[prop]
                            window[prop] = this.windowSnapshot[prop]
                        }
                    }
                }
            }
        }
        let sandbox = new SnapshotSandbox();
        (
            (window)=>{
                window.a = 1;
                window.b = 2;
                console.log(window.a,window.b);
                sandbox.inactive();
                console.log(window.a,window.b);
                sandbox.active();
                console.log(window.a,window.b);
            }
        )(sandbox.proxy)
    </script>

css隔离

  • Dynamic Stylesheet 动态样式表,当应用切换时移除老的应用样式,添加新的应用样式(子应用之间的样式隔离)
主应用与子应用之间的样式隔离
  • BEM
  • CSS-Modules
  • Shadow DOM
  • css-in-js

生命周期

以single-spa为例: image.png