2024年Web前端最全从Vue重构到React的微应用实践总结,腾讯架构师面试题

最后

中年危机是真实存在的,即便有技术傍身,还是难免对自己的生存能力产生质疑和焦虑,这些年职业发展,一直在寻求消除焦虑的依靠。

  • 技术要深入到什么程度?

  • 做久了技术总要转型管理?

  • 我能做什么,我想做什么?

  • 一技之长,就是深耕你的专业技能,你的专业技术。(重点)

  • 独立做事,当你的一技之长达到一定深度的时候,需要开始思考如何独立做事。(创业)

  • 拥有事业,选择一份使命,带领团队实现它。(创业)

一技之长分五个层次

  • 栈内技术 - 是指你的前端专业领域技术

  • 栈外技术 - 是指栈内技术的上下游,领域外的相关专业知识

  • 工程经验 - 是建设专业技术体系的“解决方案”

  • 带人做事 - 是对团队协作能力的要求

  • 业界发声 - 工作经验总结对外分享,与他人交流

永远不要放弃一技之长,它值得你长期信仰持有

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

主要内容包括html,css,html5,css3,JavaScript,正则表达式,函数,BOM,DOM,jQuery,AJAX,vue 等等。

87d3f751a4ac57d8aa01735490dc163d.png

新项目需要用到的技术有:

  • 框架

  • React

  • redux + redux-toolkit

  • react-router

  • 新式

  • less

  • UI

  • react-design-react

  • react-design-pro for react

  • 脚手架

  • 团队内部自创脚手架

752d1d31f7fe00977e1d406edd8706fb.png

可以看到两个项目除了业务之外,几乎没什么交集了。

微前端策略


8810d26343a53502bddb202299d0c3e1.png

老项目作为主应用,通过 qiankun 去加载新项目(子应用)里的页面。

  • 当没有需求时,在新项目(子应用)重写页面,重写完了之后,在老项目(主应用)中加载新项目的页面,下掉老项目的页面

  • 当有需求时,也是在新项目(子应用)重写面面再做对应需求(向产品要多点时间),重写完了之后,在老项目(主应用)中加载新项目的页面

这样一来就可以避免 “我要一整个月都做重构” 的局面,而是可以做到一个页面一个页地慢慢迁移。最终等所有页面都在新项目写好之后,直接把老项目下掉,新项目就可以从幕后站出来了。相当于从重写的第一天开始,老项目就成替身了。

ea4916655a0b669fcfa7370cfb221279.png

如果只看上面画的架构图,会觉得:啊,不就引入一个 qiankun 就完事了么?实际上还有很细节和问题需要注意的。

升级版架构


上图的架构有一个问题就是,当每次点击侧边栏的 MenuItem 时,都会加载一次微应用的子页面,也即:

d1fff94695b7f8ccfc4939fdb0bd8e30.png

微应用子页面之间的切换,其实就是在微应用里路由切换嘛,大可不需要通过重新加载一次微应用来做微应用子页面的切换。

所以,我想了一个办法:我在 <router-view> 旁边放了一个组件 Container。进入主应用后,这个组件先直接把微应用整个都加载了。

当展示老页面时,把这个 Container 高度设为 0,要展示新页面时,再把 Container 高度自动撑开。

// micro-app-container

这样一来,当进入老项目时,这个 Container 自动被 mounted 后就会地去加载子应用了。当在切换新页面时,本质上是在子应用里做路由切换,而不是从 A 应用切换到 B 应用了。

d0417ac7767bbdc86e24925fe74391bb.png

子应用的布局


由于新的项目(子应用)里的页面要供给老项目(主应用)来使用的,所以子应用也应该有两套布局:

第一套标准的管理后台布局,有 SiderHeader 还有 Content,另一套侧作为子应用时,只展示 Content 部分的布局。

// 单独运行时的布局

export const StandaloneLayout: FC = () => {

return (

)

}

// 作为子应用时的布局

export const MicroAppLayout = () => {

return (

)

}

9e465e12496baa60de443b56ef3a73df.png

单独运行时的布局

0222b4fd79a37c3628c5494658fb7838.png

作为微应用时的布局

最后通过 window.__POWERED_BY_QIANKUN__ 就可以切换不同的布局了。

import { StandaloneLayout, MicroAppLayout } from “./components/Layout”;

const Layout = window.POWERED_BY_QIANKUN ? MicroAppLayout : StandaloneLayout;

function App() {

return (

);

}

样式冲突


qiankun 是默认开启 JS 隔离(沙箱),关闭 CSS 样式隔离的。为什么这么做呢?因为 CSS 的隔离是不能无脑做去做的,下面来讲讲这方面的问题。

qiankun 一共提供了两种 CSS 隔离方法(沙箱):严格沙箱 以及 实验性沙箱

严格沙箱

开启代码:

start({

sandbox: {

strictStyleIsolation: true,

}

})

严格沙箱主要通过 ShadowDOM 来实现 CSS 样式隔离,效果是当子应用被挂在到 ShadowDOM 上,主子应用的样式 完完全全 地被隔离,无法互相影响。你说:这不是很好么?No No No。

这种沙箱的优点也成为了它自己的缺点:除了样式的硬隔离,DOM 元素也直接硬隔离了,导致子应用的一些 ModalPopoverDrawer 组件会因为找不到主应用的 body 而丢失,甚至跑到整个屏幕之外。

还记得我刚说主应用和子应用都用了 ant-design 么?ant-design 的 ModalPopover``Drawer 的实现方式就是要挂在到 document.body 上的,这么一隔离,它们一挂在整个元素起飞了。

实验性沙箱

开启代码:

start({

sandbox: {

experimentalStyleIsolation: true,

}

})

这种沙箱实现方式就是给子应用的样式加后缀标签,有点像 Vue 里的 scoped,通过名字来做样式 “软隔离”,比如像这样:

928b0c3f1b55ef7dad15631a5228460d.png

其实这种方式已经很好地做了样式隔离,但是主应用里经常有人喜欢写 !important 来覆盖 ant-design 的组件原样式:

.ant-xxx {

color: white: !important;

}

!importnant 的优先级是最高的,如果微应用也用了这个 .ant-xxx 类,就很容易被主应用的样式影响了。所以在加载微应用时,还需要处理 ant-design 之间的样式冲突问题。

ant-design 样式冲突

ant-design 提供了一个非常好的类名前缀功能:用 prefixCls 来做样式隔离,我自然也用上了:

// 自定义前缀

const prefixCls = ‘cmsAnt’;

// 设置 Modal、Message、Notification rootPrefixCls

ConfigProvider.config({

prefixCls,

})

// 渲染

function render(props: any) {

const { container, state, commit, dispatch } = props;

const value = { state, commit, dispatch };

const root = (

<MicroAppContext.Provider value={value}>

</MicroAppContext.Provider>

);

ReactDOM.render(root, container

? container.querySelector(‘#root’)

: document.querySelector(‘#root’));

}

@ant-prefix: cmsAnt; // 引入来改变全局变量值

但是不知道为什么,在 less 文件中改了 ant-prefix 变量后,ant-design-pro 的样式还是老样子,有的组件样式改变了,有的没变化。

最后,我是通过 less-loadermodifyVars 在打包时来更新全局的 ant-prefix less 变量才搞定的:

var webpackConfig = {

test: /.(less)$/,

use: [

{

loader: ‘less-loader’,

options: {

lessOptions: {

modifyVars: {

‘ant-prefix’: ‘cmsAnt’

},

sourceMap: true,

javascriptEnabled: true,

}

}

}

]

}

具体 Issue 看 Issue: ant-design 改了 prefixCls 后 ant-design-pro 不生效。

主子应用状态管理


老项目(主应用)用到了 vuex 全局状态管理,所以新项目页面(子应用)里有时需要更改主应用里的状态,这里我用了 qiankun 的 globalState 来处理。

2620032123a2dc824b12bb01a1d13c0e.png

首先在 Container 里创建了 globalActions,再监听 vuex 状态变更,每次变更都通知子应用,同时把 vuex 的 commitdispatch 函数传给子应用:

import {initGlobalState, registerMicroApps, start} from ‘qiankun’

const globalActions = initGlobalState({

state: {},

commit: null,

dispatch: null,

});

export default {

name: “Container”,

props: {

visible: {

type: Boolean,

defaultValue: false,

}

},

mounted() {

最后

中年危机是真实存在的,即便有技术傍身,还是难免对自己的生存能力产生质疑和焦虑,这些年职业发展,一直在寻求消除焦虑的依靠。

  • 技术要深入到什么程度?

  • 做久了技术总要转型管理?

  • 我能做什么,我想做什么?

  • 一技之长,就是深耕你的专业技能,你的专业技术。(重点)

  • 独立做事,当你的一技之长达到一定深度的时候,需要开始思考如何独立做事。(创业)

  • 拥有事业,选择一份使命,带领团队实现它。(创业)

一技之长分五个层次

  • 栈内技术 - 是指你的前端专业领域技术

  • 栈外技术 - 是指栈内技术的上下游,领域外的相关专业知识

  • 工程经验 - 是建设专业技术体系的“解决方案”

  • 带人做事 - 是对团队协作能力的要求

  • 业界发声 - 工作经验总结对外分享,与他人交流

永远不要放弃一技之长,它值得你长期信仰持有

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

主要内容包括html,css,html5,css3,JavaScript,正则表达式,函数,BOM,DOM,jQuery,AJAX,vue 等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值