日常业务开发,为什么要自定义antd样式前缀?如何实现呢?

2,211 阅读3分钟

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第3篇文章,点击查看活动详情

1. 什么是自定义antd样式前缀

我们都知道antd的样式是以ant-xxx组成的,这里的样式前缀,指的就是ant,我们可以在antd官方文档全局化配置配置一节中,搜索prefixCls属性, 最终找到

参数说明类型默认值
prefixCls设置统一样式前缀。注意:需要配合 less 变量 @ant-prefix 使用stringant

这就是所谓的自定义的antd样式前缀。


2. 为什么要自定义antd样式前缀

那么ant默认前缀使用的好端端的,我们为什么要自定义antd样式前缀呢?

在我司开发中,我们使用qiankun微前端架构系统。我们外表看起来的一个系统是由多个前端小项目组成的,如果我们都使用antd默认的ant前缀,就会出现样式冲突的问题,在多方调研之后,发现修改antd的样式前缀是最简单的解决方案。


3. 实现方案

那么如何快速实现自定义antd样式前缀呢? 我们查阅qiankun官网,发现其给出了解决方法,根据其介绍,我们一共需要配置两个地方:

1. 配置 webpack 修改 less 变量

//webpack.config.js

{
  loader: 'less-loader',
  options: {
      modifyVars: {
      '@ant-prefix': 'jiang-niao',
      },
      javascriptEnabled: true,
  },
}
   如果自定义过`antd`主题包,是否会感觉很熟悉呢?

2. 配置 antd ConfigProvider

// src/App.tsx

import { ConfigProvider } from 'antd';

export const MyApp = () => (
  <ConfigProvider prefixCls="jiang-niao">
    <App />
  </ConfigProvider>
);

qiankun文档中,直接给我们提供了使用原生webpack的解决方案。在对我司项目进行改造时(项目初始化使用cracraco),参考qiankun及其关联的antd文档,以及一些查询,结合我们的使用场景,整理了cracraco的解决方案

cra解决方案

create-react-app中,我们使用addLessLoader,操纵lessmodifyVars

// config-overrides.js

const { addLessLoader } = require('customize-cra');

module.exports = {
  webpack: override(
    addLessLoader({
      lessOptions: {
        javascriptEnabled: true,
        modifyVars: {
          '@ant-prefix': 'jiang-niao',
        },
      },
    }),};

craco解决方案

craco中,我们使用CracoLessPlugin,操纵lessmodifyVars

// craco.config.js

const CracoLessPlugin = require('craco-less');

module.exports = {
  plugins: [
    {
      plugin: CracoLessPlugin,
      options: {
        lessLoaderOptions: {
          lessOptions: {
            modifyVars: { '@ant-prefix': 'jiang-niao' },
            javascriptEnabled: true,
          },
        },
      },
    },
  ],
};

我们发现,其原理都是根据lessmodifyVars属性,和自定义antd主题解决方案一样。 我们打开antd默认主题包,发现@ant-prefix: ant;,并且注释一目了然:

image.png


4. 总结

我们因为一些原因,无法开启qiankun的沙箱,并且经过讨论后,发现这个是改动最少、实现最快的解决方案了。如果哪位大神有其他解决方案,欢迎评论区一起探讨一下!

给每个不同的项目配置不同的antd样式前缀后,困扰我们多时的样式冲突问题,终于被我们消灭掉了!!

如果有不准确的地方,欢迎指正!

如果有有什么想要一起讨论的,欢迎光临!!


都看到这里了,那就帮忙点个赞吧!1.gif

资源引用

qiankun.umijs.org/zh/faq#%E5%…

ant-design.gitee.io/components/…

ant-design.gitee.io/docs/react/…

ant-design.gitee.io/docs/react/…

github.com/ant-design/…