• 一波三折的react + less


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

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

    1. const lessRegex = /\.less$/;
    2. const lessModuleRegex = /\.module\.less$/;
    3. ... // 位于 sassModuleRegex 之后
    4.             {
    5.               test: lessRegex,
    6.               exclude: lessModuleRegex,
    7.               use: getStyleLoaders(
    8.                 {
    9.                   importLoaders: 2,
    10.                   sourceMap: isEnvProduction
    11.                     ? shouldUseSourceMap
    12.                     : isEnvDevelopment,
    13.                 },
    14.                 'less-loader'
    15.               ),
    16.               sideEffects: true,
    17.             },
    18.             {
    19.               test: lessModuleRegex,
    20.               use: getStyleLoaders(
    21.                 {
    22.                   importLoaders: 2,
    23.                   sourceMap: isEnvProduction
    24.                     ? shouldUseSourceMap
    25.                     : isEnvDevelopment,
    26.                 },
    27.                 'less-loader'
    28.               ),
    29.               sideEffects: true,
    30.             },

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

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

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

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

    1. const {override, addLessLoader} =require('customize-cra');
    2. module.exports = override(
    3. // 使用less-loader对源码重的less的变量进行重新制定
    4. addLessLoader({
    5. javascriptEnabled: true,
    6. modifyVars:{'@primary-color':'#1DA57A'},
    7. })
    8. );

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

    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改为:

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

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

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

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

    1. const { override, addLessLoader, adjustStyleLoaders, addWebpackAlias } = require("customize-cra");
    2. const path = require("path");
    3. module.exports = override(
    4. // 使用less-loader对源码重的less的变量进行重新制定
    5. addLessLoader({
    6. lessOptions: {
    7. javascriptEnabled: true,
    8. cssModules: {
    9. localIdentName: "[path][name]__[local]--[hash:base64:5]",
    10. }
    11. },
    12. }),
    13. adjustStyleLoaders(({ use: [, , postcss] }) => {
    14. const postcssOptions = postcss.options;
    15. postcss.options = { postcssOptions };
    16. }),
    17. //增加路径别名的处理
    18. addWebpackAlias({
    19. '@': path.resolve('./src')
    20. }),
    21. );

  • 相关阅读:
    开发 Java 用小而美的框架,Solon v1.9.4 发布
    java基于springboot的插画漫画约稿网站 vue
    1.关于String substring有俩个题 2.String replace(“老值“,“新值“)
    Java Integer.toOctalString()具有什么功能呢?
    【数据链路层】封装成帧和透明传输和差错控制
    第十二周总结
    JS作用域与闭包
    【BUG】Failed_to_execute_goal_org.springframework
    [蓝帽杯]2021 不一样的web
    1081 Rational Sum
  • 原文地址:https://blog.csdn.net/guozhicaice/article/details/125523150