使用antd按需加载

使用antd按需加载
使用react-app-rewired对 create-react-app 的默认配置进行自定义

yarn add react-app-rewired --dev

/* package.json */
"scripts": {
-   "start": "react-scripts start",
+   "start": "react-app-rewired start",
-   "build": "react-scripts build",
+   "build": "react-app-rewired build",
-   "test": "react-scripts test --env=jsdom",
+   "test": "react-app-rewired test --env=jsdom",
}

2.然后在项目根目录创建一个 config-overrides.js 用于修改默认配置。
module.exports = function override(config, env) {
  // do stuff with the webpack config...
  return config;
};

使用 babel-plugin-import
babel-plugin-import 是一个用于按需加载组件代码和样式babel 插件(原理),现在我们尝试安装它并修改config-overrides.js 文件
1.yarn add babel-plugin-import --dev
+ const { injectBabelPlugin } = require('react-app-rewired');

  module.exports = function override(config, env) {
+   config = injectBabelPlugin(['import', { libraryName: 'antd', libraryDirectory: 'es', style: 'css' }], config);
    return config;
  };

或者也可修改
{
            test: /\.(js|jsx|mjs)$/,
            include: paths.appSrc,
            loader: require.resolve('babel-loader'),
            options: {
              plugins: [
                ['import', { libraryName: 'antd', 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,
            },
          },

自定义主题

yarn add react-app-rewire-less --dev

  const { injectBabelPlugin } = require('react-app-rewired');
+ const rewireLess = require('react-app-rewire-less');

  module.exports = function override(config, env) {
-   config = injectBabelPlugin(['import', { libraryName: 'antd', style: 'css' }], config);
+   config = injectBabelPlugin(['import', { libraryName: 'antd', style: true }], config);
+   config = rewireLess.withLoaderOptions({
+     modifyVars: { "@primary-color": "#1DA57A" },
+   })(config, env);
    return config;
  };

参考链接:https://ant.design/docs/react/use-with-create-react-app-cn
使用less
如果已经配置react-app-rewire-less,则无需再进行此操作
1.npm install less-loader less --save-dev
2.修改node_modules/react_script/config下的webpack.config.dev.js 和 webpack.config-prod.js 配置文件

test: /.css$/ 改为 /.(css|less)$/
test: /.css$/ 的 use 数组配置增加 less-loader

{
  test: /\.(css|less)$/,
  use: [
    require.resolve('style-loader'),
    {
      loader: require.resolve('css-loader'),
      options: {
        importLoaders: 1,
      },
    },
    {
      loader: require.resolve('postcss-loader'),
      options: {
        // Necessary for external CSS imports to work
        // https://github.com/facebookincubator/create-react-app/issues/2677
        ident: 'postcss',
        plugins: () => [
          require('postcss-flexbugs-fixes'),
          autoprefixer({
            browsers: [
              '>1%',
              'last 4 versions',
              'Firefox ESR',
              'not ie < 9', // React doesn't support IE8 anyway
            ],
            flexbox: 'no-2009',
          }),
        ],
      },
    },
    {
      loader: require.resolve('less-loader') // compiles Less to CSS
    }
  ],
},

使用css Module
antd 和 css modules 不能混用,针对antd的css 单独写一条loader的规则,不开启 css modules。

使用 exclude 和 include 配置(https://segmentfault.com/q/1010000011223900),修改webpack.config.dev.js 和 webpack.config-prod.js 配置文件 (尽量不要使用less-loader 来处理css文件,在与antd一起使用时可能出现错误,单独写一条规则)

        {
            test: /\.css$/,
            exclude: /node_modules|antd\.css/,
            use: [
              require.resolve('style-loader'),
              {
                loader: require.resolve('css-loader'),
                options: {
                  importLoaders: 1,
                  modules: true,   // 新增对css modules的支持
                  localIdentName: '[name]__[local]__[hash:base64:5]',
                },
              },
              {
                loader: require.resolve('postcss-loader'),
                options: {
                  // Necessary for external CSS imports to work
                  // https://github.com/facebookincubator/create-react-app/issues/2677
                  ident: 'postcss',
                  plugins: () => [
                    require('postcss-flexbugs-fixes'),
                    autoprefixer({
                      browsers: [
                        '>1%',
                        'last 4 versions',
                        'Firefox ESR',
                        'not ie < 9', // React doesn't support IE8 anyway
                      ],
                      flexbox: 'no-2009',
                    }),
                  ],
                },
              },
            ],
          },
          {
            test: /\.less$/,
            exclude: /node_modules|antd\.less/,
            use: [
              require.resolve('style-loader'),
              {
                loader: require.resolve('css-loader'),
                options: {
                  importLoaders: 1,
                  modules: true,   // 新增对css modules的支持
                  localIdentName: '[name]__[local]__[hash:base64:5]',
                },
              },
              {
                loader: require.resolve('postcss-loader'),
                options: {
                  // Necessary for external CSS imports to work
                  // https://github.com/facebookincubator/create-react-app/issues/2677
                  ident: 'postcss',
                  plugins: () => [
                    require('postcss-flexbugs-fixes'),
                    autoprefixer({
                      browsers: [
                        '>1%',
                        'last 4 versions',
                        'Firefox ESR',
                        'not ie < 9', // React doesn't support IE8 anyway
                      ],
                      flexbox: 'no-2009',
                    }),
                  ],
                },
              },
              {
                loader: require.resolve('less-loader') // compiles Less to CSS
              },
            ],
          },
          {
            test: /\.(css)$/,
            include: /node_modules|antd\.css/,
            use: [
              require.resolve('style-loader'),
              {
                loader: require.resolve('css-loader'),
                options: {
                  importLoaders: 1,
                },
              },
              {
                loader: require.resolve('postcss-loader'),
                options: {
                  // Necessary for external CSS imports to work
                  // https://github.com/facebookincubator/create-react-app/issues/2677
                  ident: 'postcss',
                  plugins: () => [
                    require('postcss-flexbugs-fixes'),
                    autoprefixer({
                      browsers: [
                        '>1%',
                        'last 4 versions',
                        'Firefox ESR',
                        'not ie < 9', // React doesn't support IE8 anyway
                      ],
                      flexbox: 'no-2009',
                    }),
                  ],
                },
              },
            ],
          },
          {
            test: /\.(less)$/,
            include: /node_modules|antd\.less/,
            use: [
              require.resolve('style-loader'),
              {
                loader: require.resolve('css-loader'),
                options: {
                  importLoaders: 1,
                },
              },
              {
                loader: require.resolve('postcss-loader'),
                options: {
                  // Necessary for external CSS imports to work
                  // https://github.com/facebookincubator/create-react-app/issues/2677
                  ident: 'postcss',
                  plugins: () => [
                    require('postcss-flexbugs-fixes'),
                    autoprefixer({
                      browsers: [
                        '>1%',
                        'last 4 versions',
                        'Firefox ESR',
                        'not ie < 9', // React doesn't support IE8 anyway
                      ],
                      flexbox: 'no-2009',
                    }),
                  ],
                },
              },
              {
                loader: require.resolve('less-loader') // compiles Less to CSS
              },
            ],
          },

 

<think>好的,我现在需要帮助用户了解如何在项目中实现antd按需加载以优化性能。首先,我得回想一下之前学过的相关知识,以及用户提供的引用内容。用户提供了四个引用,其中引用1、3、4提到了按需加载和主题配置,引用2提到了Antd-Mobile的列表优化,可能相关但可能不是直接答案。 按需加载通常是为了减少打包体积,只引入需要的组件,而不是整个antd库。常见的实现方式是通过babel插件,比如babel-plugin-import。用户提到的引用1和4都提到了使用customize-cra和修改config-overrides.js,这可能是在使用React App的情况下,通过webpack配置来实现。 首先,用户的问题是如何实现按需加载,所以步骤应该包括安装必要的插件,配置babel,可能还需要修改webpack配置,特别是在使用create-react-app的情况下,可能需要使用react-app-rewired或customize-cra来覆盖配置。引用1提到使用addLessLoader来处理less变量,这可能和主题自定义有关,但按需加载主要涉及组件导入方式的转换。 然后,用户可能需要分步骤的指导,比如安装babel-plugin-import,修改babel配置,或者使用customize-cra来调整webpack。同时,要确保代码示例正确,比如在config-overrides.js中添加相关设置。另外,引用4中提到修改主题颜色,可能需要同时配置按需加载和主题,但用户的问题主要是按需加载,所以主题部分可以作为额外补充。 还要注意用户可能遇到的问题,比如控制台的警告信息,引用1中提到按需加载后警告消失,所以需要确保配置正确。另外,是否需要重启项目,比如引用4中提到修改配置后需要重启,这也是需要注意的点。 现在需要组织这些信息,分步骤说明如何实现按需加载,可能包括:安装依赖、配置babel或webpack、验证是否生效。同时,要引用相关的引用内容,比如引用1和4中的方法。可能还需要提到按需加载的好处,比如减少打包体积,提升加载性能。 还要检查是否有遗漏,比如是否需要配置less-loader,如果用户需要自定义主题,可能需要同时处理,但问题主要是按需加载,所以这部分可以作为可选步骤。此外,是否需要区分不同的项目配置,比如create-react-app与其他项目,可能需要不同的配置方法。 最后,生成相关问题,可能涉及优化方法、主题配置、性能分析等,参考用户提供的示例问题。</think>### 如何在项目中实现 Ant Design 的按需加载 实现 Ant Design (antd) 的按需加载可显著减少打包体积,提升应用性能。以下是具体实现步骤: --- #### **1. 安装必要工具** 通过 `babel-plugin-import` 插件实现组件和样式的按需加载: ```bash npm install babel-plugin-import --save-dev # 或使用 yarn yarn add babel-plugin-import -D ``` --- #### **2. 配置 Babel** 在 `.babelrc` 或 `babel.config.js` 中添加插件配置: ```json { "plugins": [ ["import", { "libraryName": "antd", "libraryDirectory": "es", "style": "css" // 自动加载组件对应的 CSS 样式 }] ] } ``` --- #### **3. 修改 Webpack 配置(针对 create-react-app 项目)** 若使用 `create-react-app`,需通过 `react-app-rewired` 和 `customize-cra` 覆盖配置: 1. 安装工具: ```bash npm install react-app-rewired customize-cra --save-dev ``` 2. 创建 `config-overrides.js`: ```javascript const { override, fixBabelImports } = require('customize-cra'); module.exports = override( fixBabelImports('antd', { libraryName: 'antd', libraryDirectory: 'es', style: 'css', // 若需自定义主题,改为 true 并配置 less-loader }) ); ``` 3. 修改 `package.json` 的启动命令: ```json "scripts": { "start": "react-app-rewired start", "build": "react-app-rewired build" } ``` --- #### **4. 验证按需加载** - 在代码中仅引入所需组件: ```javascript import { Button } from 'antd'; // 仅打包 Button 组件及其样式 ``` - 重启项目后,通过控制台查看网络请求或使用 `webpack-bundle-analyzer` 分析打包体积[^1]。 --- #### **5. 进阶:自定义主题(可选)** 若需修改主题变量(如主色 `@primary-color`),需配置 Less 变量覆盖: 1. 修改 `config-overrides.js`: ```javascript const { override, addLessLoader } = require('customize-cra'); module.exports = override( addLessLoader({ lessOptions: { modifyVars: { '@primary-color': '#1DA57A' }, // 自定义变量 javascriptEnabled: true } }) ); ``` 2. 将 Babel 插件配置中的 `style` 改为 `true` 以启用 Less 编译[^4]。 --- ### **性能优化效果** - **体积减少**:完整 antd 样式约 3MB,按需加载后仅保留使用组件的 CSS。 - **加载速度提升**:首屏资源加载时间减少 30%-50%[^3]。 - **避免冗余代码**:消除未使用组件的 JavaScript 和 CSS[^1]。 --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值