react-create-app(react17+craco)使用svg

安装svg插件

npm install svg-sprite-loader svgo-loader --dev

 修改craco.config.js配置
const path = require('path');
const resolve = dir => path.resolve(__dirname, dir)
​
module.exports = {
  webpack:{
    alias: {
      '@': resolve('src')
    },
    configure: (webpackConfig, { env, paths }) => {
      webpackConfig.module.rules[1].oneOf = [
          ...[
              {
                  test: /.svg$/,
                  // 存放svg的文件夹
                  include: resolve('./src/static/svg'),
                  use: [
                    { loader: 'svg-sprite-loader', options: {} },
                    { loader: 'svgo-loader', options: {symbolId: "icon-[name]"} },
                  ],
              },
          ],
          ...webpackConfig.module.rules[1].oneOf,
      ];
      return webpackConfig;
    },
  },
  devServer: {
    open: false,
  },
}
 引入全局的svg图片,在svg文件夹下创建index.js文件,代码如下
// 使用 require.context 获取指定文件夹下的所有 SVG 文件
const importAll = r => {
  const svgs = {};
  r.keys().map(key => {
    return (svgs[key] = r(key));
  });
  return Object.keys(svgs);
};
const iconList = importAll(require.context('./svg', false, /\.svg$/));

// 获取图标icon-(*).svg名称列表, 例如[shouye, xitong, zhedie, ...]
export const getNameList = () => {
  const regex = /\/icon-(.*?)\.svg/;
  return iconList.map(item => item.match(regex)[1]);
};
 封装svg组件IconSvg.js
import React from 'react';
import './style.scss';

const IconSvg = React.memo(({ width, height, name, className }) => {
  return (
    <svg className={className || 'icon-svg'} aria-hidden="true" width={width} height={height}>
      <use xlinkHref={'#icon-' + name}></use>
    </svg>
  );
});

export default IconSvg;

.icon-svg {
  width: 1em;
  height: 1em;
  fill: currentColor;
  overflow: hidden;
}
 在其他组件中使用
import * as Icon from '@/icons';
import IconSvg from '@components/IconSvg';

const App = ()=> {
  const [iconList] = useState(Icon.getNameList());
  return (
    <>
     {iconList.map((item, index) => <IconSvg name={item} />)}
    </>
  )
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值