qiankun.js主子应用UI框架样式隔离问题

1,095 阅读3分钟

主子应用出现同一个UI框架但是版本不一致导致的主子应用UI框架样式出现问题,先说一下antd这个UI框架。

antd高版本自定义前缀名

可以通过ConfigProvider在顶层修改prefixCls:

<ConfigProvider prefixCls='main-fe'>
    <Layout>
        <LeftMenu />
      <Layout>
        <Header>Header</Header>
        <Content>
          <Outlet />
          <div id='firstApp'></div>
        </Content>
        <Footer>Footer</Footer>
      </Layout>
    </Layout>
 </ConfigProvider>

这里设置完成后,因为前缀名修改了,要进行less的重新编译。

// 如果没有安装less会跑不起来,npm i less -g 这样就可以在终端上跑下边的命令行
lessc --js --modify-var="ant-prefix=main-fe" node_modules/antd/dist/antd.variable.less modified.css
// 编译完成后配置一下webpack文件
{
        test: /\.less$/,
        use: ["style-loader", "css-loader", {
          loader: "less-loader",
          options: {
            lessOptions: { // 如果使用less-loader@5,请移除 lessOptions 这一级直接配置选项。
              javascriptEnabled: true,
              modifyVars: {
                // babel配置文件配置
                /**
                "plugins":[
                    [
                      "import",{
                          "libraryName":"antd",
                          "libraryDirectory": "es",// antd用es的模块化规范
                          "style": true, // true默认是less  如果不是less下方配置则不生效,因为需要接受的是less变量
                      }]
                 ]
                */
                "@primary-color": "green", // 主题色 默认是蓝色
                "@ant-prefix": "main-fe", //只是改变打包css文件里面代码的前缀
            },
            },
          },
        }]
      },

这样配置完成后,重启项目就可以了。

image.png

elementUI框架样式隔离

element ui和更高版本的element plus都没有提供可以修改prefixCls的方法,所以这个需要我们自己写一个loader去手动修改他的前缀名,就是用一个loader将el开头的类名修改为我们需要的类名。 这里参考了两个发布到npm上的包

postcss-change-css-prefix - npm (npmjs.com)

change-prefix-loader - npm (npmjs.com)

自定义一个loader,抛出一个方法,loader编译的时候会调用抛出的这个方法,将编译好的文件传入你的这个方法中。需要用到loader的几个插件,详细api可以去官网查看loader API | webpack 中文网 (webpackjs.com) 在这里我们用到的插件有loader-utils,获取传入的option配置项,@babel/parser语法转换,转换为ast树,@babel/generator,将ast树转化为code代码, @babel/traverse通过这个方法我们可以拿到ast树中的node types。这样我们可以初始化的时候将需要替换的正则在传入的option中拿到,初识化完成后调用parser方法进行ast树转化,然后调用traverse这个方法在传入的配置项中定义的函数中拿到对应的node types 然后遍历这个node types找到和自己正则匹配的类型进行替换,最后使用generator这个方法将ast再转化为code代码返回出去。

webpack断点调式

webpack官网提供的方法:Debugging | webpack 中文文档 (docschina.org), 也可以在vscode编译器上进行断点调试ctrl+shift+D启动调试,

image.png 然后选择node环境

image.png

{
  // 使用 IntelliSense 了解相关属性。
  // 悬停以查看现有属性的描述。
  // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "启动程序",
      "skipFiles": [
        "<node_internals>/**"
      ],
      "port": "5050", // 启动服务的端口号
      "runtimeExecutable": "npm", 
      "runtimeArgs": ["run", "startDebugger"] // package.json配置script运行命令
    }
  ]
}
// 需要提供打包环境,webpack的路径,如果自定义了webpack配置文件,需要将配置文件地址告诉webpack
"startDebugger": "cross-env NODE_ENV=development node --inspect-brk=5050 node_modules/webpack/bin/webpack.js --config build/webpack.config.dev.js",

这样webpack调试就可以了,可以选择在引入的loader或者plugin中打断点。

image.png