【问题标题】:Customizing antd Less or Css for create-react-app为 create-react-app 自定义 antd Less 或 Css
【发布时间】:2017-11-20 12:26:33
【问题描述】:

我正在使用 create-react-app 作为入门工具包,并尝试使用 antd 组件库。

我似乎找不到自定义样式的方法(出于品牌推广目的)。文档似乎没有给出关于定制的明确指示。

文档链接:https://ant.design/docs/react/customize-theme

他们提出了两种方法来做到这一点:

1.使用theme属性。但这仅适用于 antd-init 或 dva-cli 样板,不适用于 create-react-app

2.覆盖Less变量。

现在要使这些选项中的任何一个都适用于 create-react-app 而没有 eject ,我需要采取哪些步骤?

【问题讨论】:

    标签: reactjs redux less create-react-app antd


    【解决方案1】:

    恐怕你的问题没有得到很好的研究。至少,在发布问题之前,请阅读 https://ant.design/docs/react/use-with-create-react-app 中的说明和较早的 Stackoverflow 问题(如 How do I use .babelrc to get babel-plugin-import working for antd?)等明显的资源。

    目前,CRA 不支持更改 Babel 配置。这需要包含 antd babel-plugin,它是支持仅导入必要的 antd 模块所必需的。

    因此,您只能在未弹出的 CRA 应用中导入整个单体 antd。

    【讨论】:

    • 抱歉,我的问题不太清楚,也许我应该问这样的问题:如何在没有eject 的情况下使这些选项中的任何一个适用于create-react-app 。我现在已经更新了这个问题。我阅读了文档,他们提到的所有步骤都建议 eject 。我的偏好是找到一种没有eject 选项的主题方法,因为稍后我可以灵活地更新react-scripts。
    • 目前你不能在没有弹出的情况下在 CRA 中运行 modular antd,因为它需要一个 babel 插件,而 CRA 不允许在没有弹出的情况下使用 babel 插件。
    • 谢谢@Jesper 我们。但是,当您说 modular antd 时,您能解释一下吗?另外,我想通过在 src 中复制 antd.css ,在 index.js 中导入并导入另一个覆盖我想要覆盖的样式的 custom.css 文件来完成这项工作。您如何看待这种方法?
    • “模块化”表示 webpack 只包含你实际使用的 Antd 模块,而不是整个包。对于未弹出的 CRA 应用程序,它始终会导入整个捆绑包。它有点大。这对您来说可能是也可能不是问题,具体取决于您的应用的使用方式。
    • 请参阅github.com/facebookincubator/create-react-app/issues/670 了解向 CRA 添加插件的讨论。
    【解决方案2】:

    如果你不打算使用弹出,你应该使用 config-overrides.js 来指定你想如何修改作为 react-scripts 一部分的默认 webpack.config.js。然后,一旦你有一个配置覆盖,你可以添加一个更少的规则,它有一个 modifyVars 的选项。您可以在此处指定对 less 变量的任何更改。

    function addLessRule(config, env)
    {
      const { getLoader, loaderNameMatches } = require("react-app-rewired");
    
      const fileLoader = getLoader(
        config.module.rules,
        rule => loaderNameMatches(rule, 'file-loader')
      );
    
      const lessExtension = /\.less$/;
      fileLoader.exclude.push(lessExtension);
    
      const cssRules = getLoader(
        config.module.rules,
        rule => String(rule.test) === String(/\.css$/)
      );
    
      var lessModifyVars = {
        'primary-color': '#990000',
        'link-color': '#1DA57A',
        'border-radius-base': '2px',
        'layout-header-background' : '#f0f2f5'
      };
    
      var lessLoaders = [
        { loader: 'style-loader'} ,
        { loader: 'css-loader' },
        { loader: 'less-loader', options: {
          modifyVars: lessModifyVars
        } }
       ];
    
      lessRule = {
        test : lessExtension,
        use: lessLoaders,
      }
    
      config.module["rules"].push( lessRule );
      return config
    }
    

    【讨论】:

      【解决方案3】:

      如果你想在不使用react eject 的情况下自定义antd,并且不想更改使用create-react-app 或react scripts 的分叉版本,那么

      你可以简单地创建一个less文件(比如说 main.less ),导入 antd.less 并在这个 main.less 文件中替换 ant design 的默认变量。

      现在使用lessc (npm i -g less) 编译这个less 文件。

      lessc "main.less antd.css" --js
      

      --js 用于 less 中的内联 javascript 现在只需在您的应用中包含这些已编译的 css。

      看看https://medium.com/@aksteps/782c53cbc03b

      【讨论】:

        猜你喜欢
        • 2018-09-16
        • 2020-12-02
        • 2019-01-06
        • 1970-01-01
        • 2019-08-23
        • 2018-02-28
        • 2019-07-08
        • 1970-01-01
        • 2020-06-19
        相关资源
        最近更新 更多