第一篇帖子,个人练习项目遇到更改antd主题报错,之前按照antd官网的方法。用babel-plugin-import和 react-app-rewire按需加载。
刚开始按照官网https://ant.design/docs/react/customize-theme-cn 的步骤一步一步,最后发现json报错。在网上浏览了好久(大概两天时间),才知道是版本问题,得到了如下方法。
首先 下载依赖库
npm install --save-dev less@2.7.3 less-loader@4.1.0
这里强调一下,less2.7.3以上容易报错,我们下载2.7.3版本,搭配less-loader4.1.0版本。而之前的babel-plugin-import和react-app-rewire我也都做了降版本。分别是
"babel-plugin-import": "^1.7.0","react-app-rewired": "^1.5.2"
还不够,低版本的react-app-rewired需要低版本的react-scripts才会更好的支持,这里我们也要在json文件里修改react-scripts的版本 改成1.1.4。
!!!!特别强调,如果在json文件里改的版本,别忘了npm install。
配置: config-overrides.js (在根目录下创建
代码如下
1 const {injectBabelPlugin, getLoader} = require('react-app-rewired'); 2 3 const fileLoaderMatcher = function (rule) { 4 return rule.loader && rule.loader.indexOf(`file-loader`) != -1; 5 } 6 7 module.exports = function override(config, env) { 8 // babel-plugin-import 9 config = injectBabelPlugin(['import', { 10 libraryName: 'antd-mobile', 11 //style: 'css', 12 style: true, // use less for customized theme 13 }], config); 14 15 // customize theme 16 config.module.rules[1].oneOf.unshift( 17 { 18 test: /\.less$/, 19 use: [ 20 require.resolve('style-loader'), 21 require.resolve('css-loader'), 22 { 23 loader: require.resolve('postcss-loader'), 24 options: { 25 // Necessary for external CSS imports to work 26 // https://github.com/facebookincubator/create-react-app/issues/2677 27 ident: 'postcss', 28 plugins: () => [ 29 require('postcss-flexbugs-fixes'), 30 autoprefixer({ 31 browsers: [ 32 '>1%', 33 'last 4 versions', 34 'Firefox ESR', 35 'not ie < 9', // React doesn't support IE8 anyway 36 ], 37 flexbox: 'no-2009', 38 }), 39 ], 40 }, 41 }, 42 { 43 loader: require.resolve('less-loader'), 44 options: { 45 // theme vars, also can use theme.js instead of this. 46 modifyVars: { 47 "@brand-primary": "#1cae82", // 正常 48 "@brand-primary-tap": "#1DA57A", // 按下 49 }, 50 }, 51 }, 52 ] 53 } 54 ); 55 56 // css-modules 57 config.module.rules[1].oneOf.unshift( 58 { 59 test: /\.css$/, 60 exclude: /node_modules|antd-mobile\.css/, 61 use: [ 62 require.resolve('style-loader'), 63 { 64 loader: require.resolve('css-loader'), 65 options: { 66 modules: true, 67 importLoaders: 1, 68 localIdentName: '[local]___[hash:base64:5]' 69 }, 70 }, 71 { 72 loader: require.resolve('postcss-loader'), 73 options: { 74 // Necessary for external CSS imports to work 75 // https://github.com/facebookincubator/create-react-app/issues/2677 76 ident: 'postcss', 77 plugins: () => [ 78 require('postcss-flexbugs-fixes'), 79 autoprefixer({ 80 browsers: [ 81 '>1%', 82 'last 4 versions', 83 'Firefox ESR', 84 'not ie < 9', // React doesn't support IE8 anyway 85 ], 86 flexbox: 'no-2009', 87 }), 88 ], 89 }, 90 }, 91 ] 92 } 93 ); 94 95 // file-loader exclude 96 let l = getLoader(config.module.rules, fileLoaderMatcher); 97 l.exclude.push(/\.less$/); 98 99 return config; 100 };
这种方法是利用rewire插件覆盖配置选项,就不需要我们eject暴露再修改了。以上代码就不做过多解释了。
浙公网安备 33010602011771号