一波三折的react + less

本来只是想实现一个less的模块化功能,结果网上查到很多方法说要react-scripts eject

想着我也没折腾过webpack.config.js也就试试,然后在那文件下增加配置:

const lessRegex = /\.less$/;
const lessModuleRegex = /\.module\.less$/;
... // 位于 sassModuleRegex 之后 
            {
              test: lessRegex,
              exclude: lessModuleRegex,
              use: getStyleLoaders(
                {
                  importLoaders: 2,
                  sourceMap: isEnvProduction
                    ? shouldUseSourceMap
                    : isEnvDevelopment,
                },
                'less-loader'
              ),
              sideEffects: true,
            },
            {
              test: lessModuleRegex,
              use: getStyleLoaders(
                {
                  importLoaders: 2,
                  sourceMap: isEnvProduction
                    ? shouldUseSourceMap
                    : isEnvDevelopment,
                },
                'less-loader'
              ),
              sideEffects: true,
            },

加完以后发现,单纯引用less可以,但是模块化不行?!

又找了半天,发现之前的“攻略”里缺了个modules: true,。加完后确实可以模块化引import styles from './index.less';,但是原本的全局配置类又失效了!

加上对eject出来一堆完全用不到的东西越看越不顺眼,干脆推倒重来。

本来我项目用的就是react-app-rewired,所以在这基础上引less,然后找到的方法是修改config-overrides.js:

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

module.exports = override(
  // 使用less-loader对源码重的less的变量进行重新制定
  addLessLoader({
      javascriptEnabled: true,
      modifyVars:{'@primary-color':'#1DA57A'},
  })
);

其实这样写不算错,问题在于版本不对,这已经是旧版本的写法了,会报错:

Invalid options object. Less Loader has been initialized using an options object that does not match the API schema. (注1)

然后网络上说是版本问题,要升版本或降版本,我也就在这折腾了一段时间。因为package里没主动安postcss,还遇到了一串连环错:

PostCSS plugin postcss-flexbugs-fixes requires PostCSS 8.

PostCSS plugin postcss-normalize requires PostCSS 8.

……

后来注意到(注1)下面的报错变成了:

options has an unknown property ‘modifyVars’. These properties are valid:

object { lessOptions?, prependData?, appendData?, sourceMap? }

这明显就是配置格式不对嘛,所以搜新版本addLessLoader应该怎么写,于是config-overrides.js改为:

const { override, addLessLoader } = require("customize-cra");
const path = require("path");
module.exports = override(
  // 使用less-loader对源码重的less的变量进行重新制定
  addLessLoader({
    lessOptions: {
      javascriptEnabled: true,
      cssModules: {
          localIdentName: "[path][name]__[local]--[hash:base64:5]",
      }
    },
  }),
); 

结果这样还是不行?!途中又试了adjustStyleLoaders、(config) => { return config}等就不提了。

最后发现,其实是模块化默认要写成xxx.module.less的后缀,就缺改名而已。终于解决了又能全局定class,又能模块化styles,还省得看eject拉出来的一堆东西。

P.S.本来以为adjustStyleLoaders这东西没有用,删掉也不影响。但重新建了个项目发现还得加:

const { override, addLessLoader, adjustStyleLoaders, addWebpackAlias } = require("customize-cra");
const path = require("path");

module.exports = override(
  // 使用less-loader对源码重的less的变量进行重新制定
  addLessLoader({
    lessOptions: {
      javascriptEnabled: true,
      cssModules: {
        localIdentName: "[path][name]__[local]--[hash:base64:5]",
      }
    },
  }),
  adjustStyleLoaders(({ use: [, , postcss] }) => {
    const postcssOptions = postcss.options;
    postcss.options = { postcssOptions };
  }),
  //增加路径别名的处理 
  addWebpackAlias({
    '@': path.resolve('./src')
  }),
); 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值