首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用模块联邦跨多个微前端共享MUI 5主题

如何使用模块联邦跨多个微前端共享MUI 5主题
EN

Stack Overflow用户
提问于 2022-08-17 16:03:21
回答 1查看 619关注 0票数 6

目前,我有多个使用Webpack 5的MUI 5模块联合会的v17应用程序。我希望我的MUI 5主题能够在所有这些微前端上共享,而不会有一个自己的ThemeProvider包在每个暴露的组件上。目前,应用程序1 (Shell)在MUI ThemeProvider中添加了一个自定义主题,所有的Micro都是作为子级加载的。自定义主题适用于容器组件,但不适用于微前端组件。我遵循的是具有以下配置的微前端架构:

  1. APP 1 (Shell) -主要角色是管理身份验证、包装主题和使用来自其他微前端的页面组件。
  2. 应用程序2(主页)-公开页面组件并依赖于来自shell的主题呈现。
  3. 应用程序3(另一个页面等)-公开页面组件并依赖于来自shell的主题呈现。

...and等所有其他微锋。

应用程序1-模块联合配置:

代码语言:javascript
复制
const { ModuleFederationPlugin } = require('webpack').container
const { shared } = require('./shared/shared')

const homePage = 'https://localhost:8084';

var moduleFedConfig = new ModuleFederationPlugin({
    name: 'container',
    filename: 'remoteEntry.js',
    remotes: {
        homePage: `homePage@${homePage}/remoteEntry.js`,
    },
    shared: shared,
});

应用程序2-模块联合配置:

代码语言:javascript
复制
const { ModuleFederationPlugin } = require('webpack').container;
const { shared } = require('./shared/shared');

var moduleFedConfig = new ModuleFederationPlugin({
    name: 'homePage',
    filename: 'remoteEntry.js',
    exposes: {
        './HomePage': './src/page/HomePage',
    },
    shared: shared,
});

module.exports = { moduleFedConfig };

模块联合为APP1 & APP2共享依赖项配置

代码语言:javascript
复制
const deps = require('../../../package.json').dependencies;

var shared = {
    react: {
        singleton: true,
        requiredVersion: '*',
    },
    'react-dom': {
        singleton: true,
        requiredVersion: '*',
    },
    'react-router-dom': {
        singleton: true,
        requiredVersion: '*',
    },
    '@okta/okta-auth-js/': {
        singleton: true,
        requiredVersion: 'auto',
    },
    '@okta/okta-react': {
        singleton: true,
        requiredVersion: 'auto',
    },
    '@reduxjs/toolkit': {
        singleton: true,
        requiredVersion: deps['@reduxjs/toolkit'],
    },
    'react-redux': {
        singleton: true,
        requiredVersion: deps['react-redux'],
    },
    '@emotion/react/' : {
        singleton: true,
        requiredVersion: '*',
    },
    '@emotion/styled' : {
        singleton: true,
        requiredVersion: '*',
    },
    '@mui/material' : {
        singleton: true,
        requiredVersion: '*',
    },
};

module.exports = { shared };

应用程序1 (Shell) -主题提供程序代码片段:

代码语言:javascript
复制
   React.useEffect(() => {
        const newIsLoaded =
            themeData.elementStyles !== null && themeData.theme !== null
        setIsThemeLoaded(newIsLoaded)
    }, [themeData.elementStyles, themeData.theme])

    return !isLoginRedirect &&
        authState?.isAuthenticated &&
        isThemeLoaded &&
        themeData.theme ? (
        <ThemeProvider theme={themeData.theme}>
            <CssBaseline />
            <AppContainer /> //All micro front end components are rendered within here
        </ThemeProvider>
    ) : (
        <Loading fadeIn />
    )

我预计,由于所有MUI模块都是作为单例共享的,所以初始shell中的所有主题数据设置都可以在子微前端组件中访问。

为了确认RTK和RTK查询在共享时工作得很好,所以我怀疑我在为MUI 5添加要共享的模块时遗漏了什么吗?

如果你还需要什么,请不要犹豫。

提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-10 11:54:49

我能够通过使用名为importRemote的MF库来解决这个问题,该库延迟加载组件,而不是在启动shell/容器时加载公开的组件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73391616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档