一般来说引入SVG网站有两种方法,一是直接将SVG直接作为图片引入,二是通过SVG-Symbol来引入(这里使用svg-sprite-loader)。
方式一有一个明显的缺点,无法修改图片颜色。
一般使用第二种方法加载SVG。
通过create-react-app创建的React项目,初始并没有webpack的配置文件,需要使用命令行yarn eject获得该文件(不可撤销)。
Get Start
根据svg-sprite-loader和svgo-loader文档安装并配置。
//svg-sprite-loadernpm install svg-sprite-loader -D# via yarnyarn add svg-sprite-loader -D//svgo-loadernpm install svgo svgo-loader --save-devyarn 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 optionsmodule.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文件了。
