create-react-app less-loader 配置 antd 定制主題

create-react-app以及eject之后姨伤,為了使用ant design熙暴,需要自行配置less-loader肌幽,根據(jù)antd文檔贪庙,只給出了利用react-app-rewired的解決方案,至于eject方案团赁,它說(shuō):“不過(guò)這種配置方式需要你自行探索育拨,不在本文討論范圍內(nèi)”。所以本文介紹一下作者的探索結(jié)果然痊。
當(dāng)前關(guān)于這方面的博客非常多,但大都過(guò)時(shí)了屉符,本文是2020年3月31日探索的結(jié)果剧浸。而且發(fā)現(xiàn)一些方案不夠好锹引,他們可能沒(méi)有理解create-react-app里面getStyleLoaders的本意。

直接上解決方案唆香,再說(shuō)原因嫌变。

注意:在配置Less-loader之前,我以及先配置了babel-plugin-import躬它,主要改動(dòng)是在webpack.config.js添加了這個(gè):
['import', { libraryName: 'antd', libraryDirectory: 'es', style: true }],

            {
              test: /\.(js|mjs|jsx|ts|tsx)$/,
              include: paths.appSrc,
              loader: require.resolve('babel-loader'),
              options: {
                customize: require.resolve(
                  'babel-preset-react-app/webpack-overrides'
                ),
                
                plugins: [
                  [
                    require.resolve('babel-plugin-named-asset-import'),
                    {
                      loaderMap: {
                        svg: {
                          ReactComponent:
                            '@svgr/webpack?-svgo,+titleProp,+ref![path]',
                        },
                      },
                    },
                  ],
                  [
                    'import',
                    {
                      libraryName: 'antd',
                      libraryDirectory: 'es',
                      style: true
                    },
                  ],
                ],
                // This is a feature of `babel-loader` for webpack (not Babel itself).
                // It enables caching results in ./node_modules/.cache/babel-loader/
                // directory for faster rebuilds.
                cacheDirectory: true,
                // See #6846 for context on why cacheCompression is disabled
                cacheCompression: false,
                compact: isEnvProduction,
              },
            },

首先安裝less和less-loader
yarn add less less-loader

然后開(kāi)始處理webpack.config.js這個(gè)文件
47-53行腾啥,插入了less的兩行:

// style files regexes
const cssRegex =/\.css$/;
const cssModuleRegex =/\.module\.css$/;
const lessRegex =/\.less$/;
const lessModuleRegex =/\.module\.less$/;
const sassRegex =/\.(scss|sass)$/;
const sassModuleRegex =/\.module\.(scss|sass)$/;

72-73行,修改了這個(gè)函數(shù)冯吓,添加了第三個(gè)參數(shù):

  // common function to get style loaders
  const getStyleLoaders = (cssOptions, preProcessor, preProcessorOptions={}) => {

114-130行倘待,在添加preProcessor時(shí),補(bǔ)充了options

    if (preProcessor) {
      loaders.push(
        {
          loader: require.resolve('resolve-url-loader'),
          options: {
            sourceMap: isEnvProduction && shouldUseSourceMap,
          },
        },
        {
          loader: require.resolve(preProcessor),
          options: {
            sourceMap: true,
            ...preProcessorOptions,
          },
        }
      );
    }

465-493行:
注意:這兩行配置同antd文檔自定義主題配置组贺,可自行修改相關(guān)主題
javascriptEnabled: true,
modifyVars: { '@primary-color': '#1DA57A' },

            {
              test: lessRegex,
              exclude: lessModuleRegex,
              use: getStyleLoaders(
                {
                  importLoaders: 3,
                  sourceMap: isEnvProduction && shouldUseSourceMap,
                },
                'less-loader',
                {
                  javascriptEnabled: true,
                  modifyVars: { '@primary-color': '#1DA57A' },
                }
              ),
              sideEffects: true,
            },
            {
              test: lessModuleRegex,
              use: getStyleLoaders(
                {
                  importLoaders: 3,
                  sourceMap: isEnvProduction && shouldUseSourceMap,
                  modules: {
                    getLocalIdent: getCSSModuleLocalIdent,
                  },
                },
                'less-loader',
                {
                  javascriptEnabled: true,
                  modifyVars: { '@primary-color': '#1DA57A' },
                }
              ),
            },

說(shuō)幾句原因凸舵。

CRA默認(rèn)配置了sass-loader,如果配置less-loader只需要照貓畫虎就可以失尖。但是CRA中寫了一個(gè)getStyleLoaders函數(shù)啊奄,是為了少些一些重復(fù)性代碼,因?yàn)樘幚?code>.css和.module.css.(scss|sass).module.(scss|sass)中有很多重復(fù)性的配置掀潮。貼出完整的修改前的函數(shù)代碼看看:

  // common function to get style loaders
  const getStyleLoaders = (cssOptions, preProcessor) => {
    const loaders = [
      isEnvDevelopment && require.resolve('style-loader'),
      isEnvProduction && {
        loader: MiniCssExtractPlugin.loader,
        // css is located in `static/css`, use '../../' to locate index.html folder
        // in production `paths.publicUrlOrPath` can be a relative path
        options: paths.publicUrlOrPath.startsWith('.')
          ? { publicPath: '../../' }
          : {},
      },
      {
        loader: require.resolve('css-loader'),
        options: cssOptions,
      },
      {
        // Options for PostCSS as we reference these options twice
        // Adds vendor prefixing based on your specified browser support in
        // package.json
        loader: require.resolve('postcss-loader'),
        options: {
          // Necessary for external CSS imports to work
          // https://github.com/facebook/create-react-app/issues/2677
          ident: 'postcss',
          plugins: () => [
            require('postcss-flexbugs-fixes'),
            require('postcss-preset-env')({
              autoprefixer: {
                flexbox: 'no-2009',
              },
              stage: 3,
            }),
            // Adds PostCSS Normalize as the reset css with default options,
            // so that it honors browserslist config in package.json
            // which in turn let's users customize the target behavior as per their needs.
            postcssNormalize(),
          ],
          sourceMap: isEnvProduction && shouldUseSourceMap,
        },
      },
    ].filter(Boolean);
    if (preProcessor) {
      loaders.push(
        {
          loader: require.resolve('resolve-url-loader'),
          options: {
            sourceMap: isEnvProduction && shouldUseSourceMap,
          },
        },
        {
          loader: require.resolve(preProcessor),
          options: {
            sourceMap: true,
          },
        }
      );
    }
    return loaders;
  };

其實(shí)對(duì)preProcessor的處理關(guān)鍵就在于最后幾行

        {
          loader: require.resolve(preProcessor),
          options: {
            sourceMap: true,
          },
        }

遺憾的是菇夸,它把options寫死了,但是為了靈活定制options仪吧,但是又不打破CRA設(shè)計(jì)這個(gè)函數(shù)的初衷庄新,必須加個(gè)參數(shù)來(lái)表明options

最后想補(bǔ)充一點(diǎn)邑商,如果項(xiàng)目中不會(huì)用到.module.less摄咆,可以把這幾行注釋掉or刪掉(其實(shí)ant design中好像沒(méi)用到.module.less,都是.less)人断。不然每次修改主題都需要改兩個(gè)地方吭从,比較麻煩(或者提取這個(gè)optionsmodifyVars成一個(gè)常量放在文件開(kāi)頭常量定義的地方也可以)。

// const lessModuleRegex =/\.module\.less$/;
            {
              test: lessRegex,
              // exclude: lessModuleRegex,
              use: getStyleLoaders(
                {
                  importLoaders: 3,
                  sourceMap: isEnvProduction && shouldUseSourceMap,
                },
                'less-loader',
                {
                  javascriptEnabled: true,
                  modifyVars: { '@primary-color': '#1DA57A' },
                }
              ),
              sideEffects: true,
            },
            /*{
              test: lessModuleRegex,
              use: getStyleLoaders(
                {
                  importLoaders: 3,
                  sourceMap: isEnvProduction && shouldUseSourceMap,
                  modules: {
                    getLocalIdent: getCSSModuleLocalIdent,
                  },
                },
                'less-loader',
                {
                  javascriptEnabled: true,
                  modifyVars: { '@primary-color': '#1DA57A' },
                }
              ),
            },*/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末恶迈,一起剝皮案震驚了整個(gè)濱河市涩金,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌暇仲,老刑警劉巖步做,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異奈附,居然都是意外死亡全度,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門斥滤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)将鸵,“玉大人勉盅,你說(shuō)我怎么就攤上這事《サ簦” “怎么了草娜?”我有些...
    開(kāi)封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)痒筒。 經(jīng)常有香客問(wèn)我宰闰,道長(zhǎng),這世上最難降的妖魔是什么簿透? 我笑而不...
    開(kāi)封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任移袍,我火速辦了婚禮,結(jié)果婚禮上萎战,老公的妹妹穿的比我還像新娘咐容。我一直安慰自己,他們只是感情好蚂维,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布戳粒。 她就那樣靜靜地躺著,像睡著了一般虫啥。 火紅的嫁衣襯著肌膚如雪蔚约。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天涂籽,我揣著相機(jī)與錄音苹祟,去河邊找鬼。 笑死评雌,一個(gè)胖子當(dāng)著我的面吹牛树枫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播景东,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼砂轻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了斤吐?” 一聲冷哼從身側(cè)響起搔涝,我...
    開(kāi)封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎和措,沒(méi)想到半個(gè)月后庄呈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡派阱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年诬留,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡文兑,死狀恐怖傀广,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情彩届,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布誓酒,位于F島的核電站樟蠕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏靠柑。R本人自食惡果不足惜寨辩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望歼冰。 院中可真熱鬧靡狞,春花似錦、人聲如沸隔嫡。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)腮恩。三九已至梢杭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秸滴,已是汗流浹背武契。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荡含,地道東北人咒唆。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像释液,于是被迫代替她去往敵國(guó)和親全释。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容