一般来说引入SVG网站有两种方法,一是直接将SVG直接作为图片引入,二是通过SVG-Symbol来引入(这里使用svg-sprite-loader)。
方式一有一个明显的缺点,无法修改图片颜色。
一般使用第二种方法加载SVG。
通过create-react-app创建的React项目,初始并没有webpack的配置文件,需要使用命令行yarn eject获得该文件(不可撤销)。

Get Start

根据svg-sprite-loadersvgo-loader文档安装并配置。

  1. //svg-sprite-loader
  2. npm install svg-sprite-loader -D
  3. # via yarn
  4. yarn add svg-sprite-loader -D
  5. //svgo-loader
  6. npm install svgo svgo-loader --save-dev
  7. yarn add svgo svgo-loader -D
  8. // webpack >= 2 multiple loaders
  9. {
  10. test: /\.svg$/,
  11. use: [
  12. { loader: 'svg-sprite-loader', options: { ... } },
  13. 'svg-transform-loader',
  14. 'svgo-loader'
  15. ]
  16. }
  17. //Put the SVGO config into loader's options
  18. module.exports = {
  19. ...,
  20. module: {
  21. rules: [
  22. {
  23. test: /\.svg$/,
  24. use: [
  25. {loader: 'file-loader'},
  26. {
  27. loader: 'svgo-loader',
  28. options: {
  29. plugins: [
  30. {removeTitle: true},
  31. {convertColors: {shorthex: false}},
  32. {convertPathData: false}
  33. ]
  34. }
  35. }
  36. ]
  37. }
  38. ]
  39. }
  40. }
  41. //在项目中引用,可以通过CSS修改
  42. <svg>
  43. <use xlinkHref={'#' + id}/>}
  44. </svg>

require

如果使用import方法引入SVG,单使用图片无法显示。
这是webpack编译造成的:
当声明变量但不使用,webpack在编译时会将其删除,不会出现在页面。产生该现象的理由是TreeShaking。
解决方法也比较简单,使用require()代替import即可,TreeShaking不适用于require。

去除SVG自带颜色

参考svgo文档,可以通过在配置中添加下列代码得到。

  1. * removeAttrs:
  2. * attrs: 'fill'

一次引入整个目录的SVG

  1. let importAll = (requireContext: __WebpackModuleApi.RequireContext) => requireContext.keys().forEach(requireContext);
  2. try {
  3. importAll(require.context('icons', true, /\.svg$/)); //icons为目录名
  4. } catch (error) {
  5. console.log(error);
  6. }

这样就能任意引入该目录下的所有SVG文件了。