关闭

antd按需加载,配置babel-plugin-import插件,编译后报错.bezierEasingMixin()解决方案

来源:网络 文章列表 2019-11-26 8
此问题主要是less的版本是3.0以上才会出现的。使用新版的create-react-app创建项目后会发现,以前的webpack配置分为dev和prod两个文件,现在合为一个文件webpack.config.js了。

报错如下:

./node_modules/antd/lib/button/style/index.less (./node_modules/css-loader??ref--6-oneOf-7-1!./node_modules/postcss-loader/src??postcss!./node_modules/less-loader/dist/cjs.js!./node_modules/antd/lib/button/style/index.less)
// https://github.com/ant-design/ant-motion/issues/44
.bezierEasingMixin();
^

此问题主要是less的版本是3.0以上才会出现的。

解决方案1:

打开项目package.json ,将less版本降到3.0以下 比如安装 2.7.3版本。再 install 
yarn add less@^2.7.3

或者

打开项目的package.json 找到dependencies下面的less 将其版本改为 "2.7.3" 然后 yarn install

解决方案2:

使用新版的create-react-app创建项目后会发现,以前的webpack配置分为dev和prod两个文件,现在合为一个文件webpack.config.js了。

因为antd底层使用less,因此我们要单独配置less。首先我们要将单独抽离的loader函数做一下修改。

// 新增这2行
const lessRegex = /\.less$/;
const lessModuleRegex = /\.module\.less$/;

// ...其他代码

// common function to get style loaders
  const getStyleLoaders = (cssOptions, preProcessor) => {
    const loaders = [
      isEnvDevelopment && require.resolve('style-loader'),
      isEnvProduction && {
        loader: MiniCssExtractPlugin.loader,
        options: Object.assign(
          {},
          shouldUseRelativeAssetPaths ? { publicPath: '../../' } : undefined
        ),
      },
      {
        loader: require.resolve('css-loader'),
        options: cssOptions,
      },
      {
        loader: require.resolve('postcss-loader'),
        options: {
          ident: 'postcss',
          plugins: () => [
            require('postcss-flexbugs-fixes'),
            require('postcss-preset-env')({
              autoprefixer: {
                flexbox: 'no-2009',
              },
              stage: 3,
            }),
          ],
          sourceMap: isEnvProduction ? shouldUseSourceMap : isEnvDevelopment,
        },
      },
    ].filter(Boolean);
    if (preProcessor) {
      loaders.push({
        loader: require.resolve(preProcessor),
        // 修改此处
options: Object.assign(
          {},
          { sourceMap: isEnvProduction ? shouldUseSourceMap : isEnvDevelopment, },
          cssOptions
        )
      });
    }
    return loaders;
  };

然后修改less的loader配置,将以下代码添加到sass-loader的后面。

{ 
  test: lessRegex,
  use: getStyleLoaders(
    {
      importLoaders: 3,
      sourceMap: isEnvProduction
        ? shouldUseSourceMap
        : isEnvDevelopment,
      // modifyVars: {
      //   'primary-color': "#f9c700"
      // },
      // 修改此处
      javascriptEnabled: true,
    },
    'less-loader'
  ),
  sideEffects: true,
},
{
  test: lessModuleRegex,
  use: getStyleLoaders(
    {
      importLoaders: 3,
      sourceMap: isEnvProduction
        ? shouldUseSourceMap
        : isEnvDevelopment,
      modules: true,
      getLocalIdent: getCSSModuleLocalIdent,
    },
    'less-loader'
  ),
},

然后babel-loader处添加按需加载的plugins配置。

{
  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![path]',
            },
          },
        },
      ],
      // 修改此处
      ["import", { "libraryName": "antd", "libraryDirectory": 'es', "style": true }]
    ],
    cacheDirectory: true,
    cacheCompression: isEnvProduction,
    compact: isEnvProduction,
  },
},

第二种方案我试了下,没有成功,最终选择第一种方案了。

 

版权声明

本站部分原创文章,部分文章整理自网络。如有转载的文章侵犯了您的版权,请联系站长删除处理。如果您有优质文章,欢迎发稿给我们!联系站长:
愿本站的内容能为您的学习、工作带来绵薄之力。

评论

  • 随机获取
点击刷新
精彩评论
关闭