最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • react17.0.1 按需引入 antd

    正文概述 掘金(Cccccccr)   2021-03-29   717

    安装需要的依赖

    默认使用 cnpm

    cnpm install babel-plugin-import less-loader --dev
    cnpm install antd --save
    

    reject 项目

    npm run reject
    

    修改 package.json: 添加 antd 库的样式

     "babel": {
        "presets": [
          "react-app"
        ],
        "plugins": [
          [
            "import",
            {
              "libraryName": "antd",
              "style": true
            }
          ]
        ]
      }
    

    webpack.config.js 文件修改(重点)

    找到 config 文件夹下的 webpack.config.js

    1 增加 style 样式正则

    大约在 60 行

    // style files regexes
    const cssRegex = /\.css$/;
    const cssModuleRegex = /\.module\.css$/;
    const sassRegex = /\.(scss|sass)$/;
    const sassModuleRegex = /\.module\.(scss|sass)$/;
    // 增加的正则
    const lessRegex = /\.less$/;
    const lessModuleRegex = /\.module\.less$/;
    

    2 配置 1 中添加的正则和 less-loader

    在 552 行左右,sass-loader 下方,file-loader 上。

     // 添加如下内容
    {
      test: lessRegex,
      exclude: lessModuleRegex,
      use: getStyleLoaders({ importLoaders: 2 }, 'less-loader'),
    },
    // Adds support for CSS Modules, but using SASS
    // using the extension .module.scss or .module.sass
    {
      test: lessModuleRegex,
      use: getStyleLoaders(
        {
          importLoaders: 2,
          modules: true,
          getLocalIdent: getCSSModuleLocalIdent,
        },
        'less-loader'
      ),
    },
    {
      test: /\.less$/,
      use: [
        require.resolve('style-loader'),
        {
          loader: require.resolve('css-loader'),
          options: {
            importLoaders: 1,
          },
        },
        {
          loader:require.resolve('less-loader'),
          options: {
            modules: false,
            modifyVars: {
                "@primary-color": "#f9c700"
            }
          }
        }
      ],
    },
    

    有些教程在test: /.less$/中会配置浏览器相关的信息。本人在配置后打包会提示不要在这上面配置相关信息。所以删除了,并不影响使用。

    3 定义全局样式

    在138行左右
    原来的配置:

    if (preProcessor) {
      loaders.push(
        {
          loader: require.resolve('resolve-url-loader'),
          options: {
            sourceMap: isEnvProduction ? shouldUseSourceMap : isEnvDevelopment,
            root: paths.appSrc,
          },
        },
        {
          loader: require.resolve(preProcessor),
          options: {
            sourceMap: true,
          },
        }
      );
    }
    

    修改后的配置

    if (preProcessor) {
      loaders.push(
        {
          loader: require.resolve('resolve-url-loader'),
          options: {
            sourceMap: isEnvProduction ? shouldUseSourceMap : isEnvDevelopment,
            root: paths.appSrc,
          },
        },
        // {
        //   loader: require.resolve(preProcessor),
        //   options: {
        //     sourceMap: true,
        //   },
        // }
      );
      let loader = require.resolve(preProcessor)
      if (preProcessor === "less-loader") {
        loader = {
          loader,
          options: {
            modifyVars: { //自定义主题
              'primary-color':' #1890ff ',
            },
            javascriptEnabled: true,
          }
        }
      }
      loaders.push(loader);
    }
    

    这里的resolve-url-loader是和解析url相对路径和sass有关的插件。想深究的同学可以进一步查询资料,我也不懂。所以这里没有注释掉,而是保留了下来,只修改了preProcessor的配置。

    4 修改js,添加antd库的样式

    404行左右test: /.(js|mjs|jsx|ts|tsx)$/

    {
      test: /\.(js|mjs|jsx|ts|tsx)$/,
      include: paths.appSrc,
      loader: require.resolve('babel-loader'),
      options: {
        customize: require.resolve(
          'babel-preset-react-app/webpack-overrides'
        ),
        presets: [
          [
            require.resolve('babel-preset-react-app'),
            {
              runtime: hasJsxRuntime ? 'automatic' : 'classic',
            },
          ],
        ],
        
        plugins: [
          [
            require.resolve('babel-plugin-named-asset-import'),
            {
              loaderMap: {
                svg: {
                  ReactComponent:
                    '@svgr/webpack?-svgo,+titleProp,+ref![path]',
                },
              },
            },
          ],
          // 添加的样式
          ['import', { libraryName: 'antd', style: true }],  // import less
          isEnvDevelopment &&
            shouldUseReactRefresh &&
            require.resolve('react-refresh/babel'),
        ].filter(Boolean),
        // 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,
        // See #6846 for context on why cacheCompression is disabled
        cacheCompression: false,
        compact: isEnvProduction,
      },
      },
    

    450行左右test: /.(js|mjs)$/

    {
      test: /\.(js|mjs)$/,
      exclude: /@babel(?:\/|\\{1,2})runtime/,
      loader: require.resolve('babel-loader'),
      options: {
        babelrc: false,
        configFile: false,
        compact: false,
        presets: [
          [
            require.resolve('babel-preset-react-app/dependencies'),
            { helpers: true },
          ],
        ],
        // 添加plugin
        plugins: [
          ['import', { libraryName: 'antd', style: true }],  // import less
        ],
        cacheDirectory: true,
        // See #6846 for context on why cacheCompression is disabled
        cacheCompression: false,
        
        // Babel sourcemaps are needed for debugging into node_modules
        // code.  Without the options below, debuggers like VSCode
        // show incorrect code and set breakpoints on the wrong lines.
        sourceMaps: shouldUseSourceMap,
        inputSourceMap: shouldUseSourceMap,
      },
    }
    

    test: /.(js|mjs)$/中可以不用添加。根据oneof规则和include,我们编写的代码都是在src下的,会匹配到第一个规则。

    配置过程中遇到的错误及解决方法

    1 can't find module "less"

    cnpm i less --dev
    

    2 .plugins[1][1] must be an object, false, or undefined

    上面配置plugin的时候参考其他的教程出现的错误。

    // 参考教程中数组第二个元素有[]包裹
    ['import', [{ libraryName: 'antd', style: true }]]
    
    // 去掉[]
    ['import', { libraryName: 'antd', style: true }]
    

    3 TypeError: this.getOptions is not a function

    原因: less-loader安装的版本过高
    解决方法:安装5.0.0版本

    如果使用npm uninstall less-loader可能会出错。建议使用如下方法:
    在package.json中把less-loader的版本改成5.0.0。删除node_modules,重新cnpm i。

    参考的教程

    • juejin.cn/post/684490…
    • blog.csdn.net/qq_37674616…

    起源地下载网 » react17.0.1 按需引入 antd

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元