IconFont是国内功能知名度非常高、强大且图标内容很丰富的SVG开源库,除此之外,还有一些常见的开源SVG库
-
Font Awesome
-
Iconicons
-
css.gg
-
Featheroicons
-
Eva Icons
-
Heroicon
-
Bootstrap iconsl
-
Remix icons
...
这些常用的SVG开源库,都拥有非常庞大的SVG图标资源。
SVG Sprite
SVG To React
将SVG转换为React组件
重新梳理下上述方案思路,明确要做的事情:
1. 创建独立SVG组件库,存放通用的SVG图片
我们主要介绍2和3
将SVG转换为独立的React Component
-
强大:svgr支持处理所有类型的svg,并将其转换为React组件
-
通用:支持多种方式,在线、CLI、Nodejs、webpack插件、Rollup插件... 支持列表名单很长
-
可定制:svgr是完全可配置的,可以使用内置设置,也可以完全自定义创建自己的配置
-
使用广泛:很多开源社区项目,都使用了svgr,8.1K的star数目
function propTypesTemplate({ template }, opts, { imports, interfaces, componentName, props, jsx, exports }) {
const plugins = ['jsx'];
if (opts.typescript) {
plugins.push('typescript');
}
const typeScriptTpl = template.smart({ plugins });
return typeScriptTpl.ast`
${imports}
${interfaces}
const ${componentName} = (${props}) => {
const color = props.color ? props.color : props.style?.color ? props.style.color : 'currentColor';
props = { ...props, fill: color };
return ${jsx};
}
${exports}
`;
}
module.exports = propTypesTemplate;
const SvgArrowBoldRight = (props: React.SVGProps<SVGSVGElement>) => {
const color = props.color ? props.color : props.style?.color ? props.style.color : 'currentColor';
props = { ...props, fill: color };
return (
<svg width="1em" height="1em" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" {...props}>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M5.94 18.06a1.5 1.5 0 010-2.12L11.878 10l-5.94-5.94a1.5 1.5 0 112.122-2.12l6.116 6.115a2.75 2.75 0 010 3.89L8.06 18.06a1.5 1.5 0 01-2.122 0z"
/>
</svg>
将React Component编译构建出esm和cjs
{
"build:es": "npm run build:es:types && cross-env NODE_ENV=es babel src --out-dir es --extensions '.ts,.tsx'",
"build:js": "npm run build:js:types && babel src --out-dir lib --extensions '.ts,.tsx'",
}
{
"main": "lib/index.js",
"module": "es/index.js",
}
import { ArrowUp } from 'react-svg-component';
<ArrowUp style={{ fontSize: '48px', color: 'red' }} />
● svg是基于xml语法描述的一种图像文件格式,最大的优点是放大不失真、方便修改大小和色值,实际工作中非常适合作为静态图片展示;
● 公司内部往往会有自己通用的一些SVG Icon,将这些SVG Icon沉淀成组件库,可以方便设计、产品和开发实时取用;
● 搭建SVG库的思路,主要体现在,将SVG转换为独立的React Component,再将React Component输出对应的esm和cjs格式;
往期推荐
本文来自微信公众号“网易雷火UX用户体验中心”(ID:LeihuoUX)。大作社经授权转载,该文观点仅代表作者本人,大作社平台仅提供信息存储空间服务。