【问题标题】:Loading SVGs within .scss with Webpack and svgr loader使用 Webpack 和 svgr 加载器在 .scss 中加载 SVG
【发布时间】:2019-01-02 09:07:24
【问题描述】:

Webpack 配置:

  1. 对于.svg,我使用 config:{ test: /\.svg$/, use: ['svgr/webpack'] }
  2. 对于.scss,我使用css-loaderpostcss-loadersass-loader

文件夹结构:

我的文件夹结构如下所示:

- App
-- styles
--- globals.scss // Here I import my partials
--- partials
---- _my_partial.scss
-- icons
--- svgs
---- my_icon.svg

svgr 加载器:

我喜欢svgr loader,因为它允许我只导入我的图标并将其用作 React 组件:

import MyIcon from './icons/svgs/my_icon.svg';
...
<MyIcon />

实际问题:

我对这种方法很好,但我必须将其中一个 svg 作为background-image,所以在_my_partial.scss 里面我写道:

background-image: url(../icons/svgs/my_icon.svg);

我在这个url 中只有一个文件夹,因为在上升两个时,它抱怨它无法解决它 - 我想这是因为我在我的globals.scss 中导入了我的部分。

通过这个设置,我在浏览器中得到的只是:

GET http://localhost:3005/[object%20Module] 404 (Not Found)

【问题讨论】:

  • “我在这个url 中只有一个文件夹,因为当上升两个时,它抱怨它无法解决它”。两个文件夹中的导入是怎么写的?
  • 我的意思是,当我编写路径../../icons/svgs/my_icon.svg 时,它抱怨它无法解决它。它现在没有抱怨,当我写 ../icons/svgs/my_icon.svg

标签: javascript reactjs svg webpack sass


【解决方案1】:

svgr/webpack 将您的 svg 转换为反应组件,因此当将 svg 用于 scss 时,它实际上是一个对象/反应组件。将 svgr/webpack 更改为 file-loader 以使用它。如果您仍想同时使用这两种方法,可以尝试以下方法:

{ test: /\.react.svg$/, use: ['svgr/webpack'] }
{ test: /\.svg$/, use: ['file-loader'] }

然后将您想要作为 React 组件的所有 svg 重命名为 filename.react.svg,其余的则使用 .svg。

我还没有测试过这个:)

更新:查看文档(部分:在 CSS、Sass 或 Less 中处理 SVG),您似乎可以将 svgr/webpack 与文件加载器一起使用:

https://github.com/smooth-code/svgr/tree/master/packages/webpack

{
  {
    test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
    issuer: {
      test: /\.jsx?$/
    },
    use: ['babel-loader', '@svgr/webpack', 'url-loader']
  },
  {
    test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
    loader: 'url-loader'
  },
}

无论哪种方式,您可能需要进行一些更改以满足您的需求,但它支持它:)

【讨论】:

  • 这是一个很好的解决方法,但是当需要在组件和css中使用相同的svg时,我必须在2个版本中使用相同的文件。
  • 我更新了答案,您现在可以将其作为文件导入,也可以从同一个文件中导入:)
  • 非常感谢!我没有读到文档的结尾:( issuer 配置让它工作了!
猜你喜欢
  • 2019-11-06
  • 2021-01-12
  • 2018-03-03
  • 2016-07-01
  • 2017-01-16
  • 2019-09-21
  • 2019-01-23
  • 2016-01-23
  • 2016-04-30
相关资源
最近更新 更多