分享一个icon管理方案
2024-3-3loader分享
相信大家都用过svg, png等,各种使用方法优缺点不赘述了…
// 版本比较老了, 三年前的代码
"svg-sprite-loader": "^3.9.2",
"svgo": "^1.0.5",
"svgo-loader": "^2.2.0"
{
test: /^((?!\.color).)*((?!\.color).)\.svg$/,
include: [path.resolve(__dirname, './src/assets/icons')],
use: [
{ loader: 'svg-sprite-loader' },
{
loader: 'svgo-loader',
options: {
plugins: [
{ removeTitle: true },
{ convertColors: { shorthex: true } },
{ convertPathData: true },
{ removeComments: true },
{ removeDesc: true },
{ removeUselessDefs: true },
{ removeEmptyAttrs: true },
{ removeHiddenElems: true },
{ removeEmptyText: true },
{ removeUselessStrokeAndFill: true },
{ moveElemsAttrsToGroup: true },
{ removeStyleElement: true },
{ cleanupEnableBackground: true },
{ removeAttrs: { attrs: '(stroke|fill|filter)' } },
],
},
},
],
},
const Icon = ({ name, size = 16, fill = '#5AD2FF', ...props }) => {
return <svg width={size} height={size} fill={fill} {...props}>
<use xlinkHref={'#' + name} />
</svg>
}
统一管理
以上方法相信不少人也用过,那如果我要想像antd/icon一样使用呢(common)?
不少聪明同学说仿造antd/icon建一个private的npm来使用。
如果还要兼顾业务svg呢?每次业务开发都要上传到npm吗?如果高频敏捷开发呢?
那就不得不提到styled-components https://github.com/styled-components/styled-components
styled-components
业务svg流程:
1.verdaccio private的npm
2. 包
import styled from 'styled-components';
const SocialMediaWrapper = styled.div`
...
`
const Icon = ({ children, props }) => {
return <SocialMediaWrapper {...props}>
{children}
</SocialMediaWrapper>
}
3.common/svg 通过脚本(手动)生成components/svgIcon(内部使用npm包Icon)
取svg标签 之间的有效内容
4.引用components/svgIcon
问题:为什么不直接使用svg呢?
1.直接使用不方便改样式,或要使用svgloader,如果用svgloader又做不到2.
2.styled-components可以兼容公用和业务svg,做到统一。
tips:
关于image:包里的image发包时通过脚本上传到oss统一管理和使用。
styled-components https://medium.com/itsoktomakemistakes/react-create-react-app-svg-icons-styled-component-570b4e9f07b
verdaccio https://github.com/verdaccio/verdaccio