一般来说引入SVG网站有两种方法,一是直接将SVG直接作为图片引入,二是通过SVG-Symbol来引入(这里使用svg-sprite-loader)。
方式一有一个明显的缺点,无法修改图片颜色。
一般使用第二种方法加载SVG。
通过create-react-app创建的React项目,初始并没有webpack的配置文件,需要使用命令行yarn eject
获得该文件(不可撤销)。
Get Start
根据svg-sprite-loader和svgo-loader文档安装并配置。
//svg-sprite-loader
npm install svg-sprite-loader -D
# via yarn
yarn add svg-sprite-loader -D
//svgo-loader
npm install svgo svgo-loader --save-dev
yarn add svgo svgo-loader -D
// webpack >= 2 multiple loaders
{
test: /\.svg$/,
use: [
{ loader: 'svg-sprite-loader', options: { ... } },
'svg-transform-loader',
'svgo-loader'
]
}
//Put the SVGO config into loader's options
module.exports = {
...,
module: {
rules: [
{
test: /\.svg$/,
use: [
{loader: 'file-loader'},
{
loader: 'svgo-loader',
options: {
plugins: [
{removeTitle: true},
{convertColors: {shorthex: false}},
{convertPathData: false}
]
}
}
]
}
]
}
}
//在项目中引用,可以通过CSS修改
<svg>
<use xlinkHref={'#' + id}/>}
</svg>
require
如果使用import方法引入SVG,单使用图片无法显示。
这是webpack编译造成的:
当声明变量但不使用,webpack在编译时会将其删除,不会出现在页面。产生该现象的理由是TreeShaking。
解决方法也比较简单,使用require()代替import即可,TreeShaking不适用于require。
去除SVG自带颜色
参考svgo文档,可以通过在配置中添加下列代码得到。
* removeAttrs:
* attrs: 'fill'
一次引入整个目录的SVG
let importAll = (requireContext: __WebpackModuleApi.RequireContext) => requireContext.keys().forEach(requireContext);
try {
importAll(require.context('icons', true, /\.svg$/)); //icons为目录名
} catch (error) {
console.log(error);
}
这样就能任意引入该目录下的所有SVG文件了。