ReactJs 中的 CSS 模块 + Ant 设计不起作用

sag*_*har 7 css reactjs webpack css-modules ant-design-pro

我正在尝试使用 CSS 模块来实现 ReactJs 项目的 CSS 样式,为此我应用了 ant design 文档(请参见此处:https: //pro.ant.design/docs/style),但不幸的是它不起作用。问题是我想重写ant Button的组件样式,但它没有获取样式。下面是我的代码的简短示例:CSS 类:在 MyContainer.less 文件中:

 .antButton{
    :global {
        .ant-btn-primary {
            background-color: rgb(215, 226, 233);
            border-color: #848586;
            font-size: 7pt;
            color: red !important;
         }
    }
 }
Run Code Online (Sandbox Code Playgroud)

代码:

import React from 'react';
import { Button } from 'antd';
import 'antd/dist/antd.less';
import styles  from './MyContainer.less';

const MyContainer= () => {
        return (
          <Button type="primary" size="small" className={styles.antButton}  >Download</Button>
    );
 };
export default MyContainer;
Run Code Online (Sandbox Code Playgroud)

我在react(版本16.13.1)中使用Ant design(版本4.3.0)和Webpack(版本4.42.0)。我还安装了less-loader(版本7.3.0)和babel-plugin-import(版本1.13) .3).

我不知道我是否缺少 Webpack 的任何特定配置,或者问题出在其他地方?

sag*_*har 7

最后我可以用 antd 处理我的问题,当你使用 css 模块时,你必须添加额外的配置才能使 antd 样式工作,我在这个网站中找到了我的解决方案:https: //www.programmersought.com/article/3690902311 / 如那里所述,如果您在规则部分的 Webpack.config 中按这些顺序添加这些配置,它将与 Css 模块一起使用并覆盖 antd 组件的较少样式。

       {
              test: /\.less$/,
              include: [/src/],
              use: [
                require.resolve('style-loader'),
                {
                  loader: require.resolve('css-loader'),
                  options: {
                    modules: {
                      localIdentName: "[name]__[local]___[hash:base64:5]",
                    },
                    sourceMap: true
                  },
                },
                {
                  loader: require.resolve('less-loader'), // compiles Less to CSS
                  options: { lessOptions:{javascriptEnabled: true }}
                },
              ],
            },
            {
              test: /\.css$/,
              exclude: /node_modules|antd\.css/,
              use: [
                require.resolve('style-loader'),
                {
                  loader: require.resolve('css-loader'),
                  options: {
                    importLoaders: 1,
                    // change
                    modules: {
                      localIdentName: "[name]__[local]___[hash:base64:5]",
                    },
                  },
                },
                {
                  loader: require.resolve('postcss-loader'),
                  options: {
                    ident: 'postcss',
                    plugins: () => [
                      require('postcss-flexbugs-fixes'),
                      autoprefixer({
                        browsers: [
                          '>1%',
                          'last 4 versions',
                          'Firefox ESR',
                          'not ie < 9', // React doesn't support IE8 anyway
                        ],
                        flexbox: 'no-2009',
                      }),
                    ],
                  },
                },
              ],
            },
            {
              test: /\.css$/,
              include: /node_modules|antd\.css/,
              use: [
                require.resolve('style-loader'),
                {
                  loader: require.resolve('css-loader'),
                  options: {
                    importLoaders: 1,
                    // change
                    // modules: true, // new support for css modules
                    // localIndetName: '[name]__[local]__[hash:base64:5]', //
                  },
                },
                {
                  loader: require.resolve('postcss-loader'),
                  options: {
                    ident: 'postcss',
                    plugins: () => [
                      require('postcss-flexbugs-fixes'),
                      autoprefixer({
                        browsers: [
                          '>1%',
                          'last 4 versions',
                          'Firefox ESR',
                          'not ie < 9', // React doesn't support IE8 anyway
                        ],
                        flexbox: 'no-2009',
                      }),
                    ],
                  },
                },
              ],
            },

Run Code Online (Sandbox Code Playgroud)

您还需要在 package.json 中添加 babel import :

    "babel": {
    "presets": [
      "@babel/preset-env",
      "@babel/preset-react",
      "@babel/preset-typescript"
    ],
    "plugins": [
      [
        "import",
        {
          "libraryName": "antd",
          "libraryDirectory": "lib",
          "style": true
        }
      ]
    ]
  },
Run Code Online (Sandbox Code Playgroud)

你必须这样设置 antd 组件的包装 div 的样式:

import React from 'react';
import { Button } from 'antd';
//import 'antd/dist/antd.less'; you don't need this line when add babel.
import styles  from './MyContainer.less';

const MyContainer= () => {
        return (
<div className={styles.antButton}>
 <Button type="primary" size="small"  >Download</Button>
</div >
    );
 };
export default MyContainer;
Run Code Online (Sandbox Code Playgroud)

我希望它有帮助