如何使用 webpack 设置内联 svg

IT技术 javascript svg reactjs webpack loader
2021-04-18 06:18:23

我想知道如何使用 webpack 设置内联 svg?

我正在关注react-webpack-cookbook

使用文件加载器正确设置了我的webpack.config

但是,示例显示使用这样的背景图像:

.icon {
   background-image: url(./logo.svg);
}

这工作正常,但我想要一个内联 svg 图像,我该如何做到这一点以将我的logo.svg内联包含在我的react组件中?

import React, { Component } from 'react'

class Header extends Component {

  render() {
    return (
        <div className='header'>
            <img src={'./logo.svg'} />
        </div>
    );
  }
};

export default Header
6个回答

实际上,Michelle 的回答为我指明了正确的方向,这非常适合使用 webpack 加载 svg 文件并将其用作您的<img>src

但是,要实际获得内联 svg,我需要执行以下操作:

使用svg-inline-loader作为 svg 加载器而不是文件加载器:

{ test: /\.svg$/, loader: 'svg-inline-loader' }

然后在组件中加载 svg 内联:

import React, { Component } from 'react'
import logo from "./logo.svg";

class Header extends Component {

  render() {
    return (
        <div className='header'>
          <span dangerouslySetInnerHTML={{__html: logo}} />
        </div>
    );
  }
};

export default Header

看起来有一个用于 react svg-inline-react的内联 svg 包装器,这将是另一种选择,而不是<div dangerouslySetInnerHTML={{__html: mySvg}} />

目前发布的Twitter的一个很好的案例研究,显示了为什么你应该使用“dangerouslySetInnerHTML”显示SVGs:medium.com/@paularmstrong/...
2021-06-08 06:18:23
请注意,这对服务器渲染根本不起作用......所以不像我曾经想过的那么有用。我已经回到使用 svg 作为背景图像。它似乎也像内联 svg 一样使 JavaScript 包膨胀,当然这取决于 svg 的优化程度。
2021-06-19 06:18:23

这是一个简单的非react解决方案。

  1. 安装Svg 内联加载器
  2. 在 webpack.config.js 添加 { test: /\.svg$/, loader: 'svg-inline-loader' }
  3. 在您的 js 文件中导入 svg 图像并将其添加到 DOM 元素中,如下所示
  import Svg from './svg.svg';

  function component() {
    const element = document.createElement('div');

    element.innerHTML = Svg;

    return element;
  }

  document.body.appendChild(component());
不依赖于 React 和展示 vanilla ECMAScript 的荣誉
2021-05-23 06:18:23

我希望我迟到的答案仍然对某人有用,因为我不喜欢上述任何选项。

react-SVG-装载机的WebPack装载机可以导入SVG图标,如JSX组件:

import Logo from './logo.svg';

class App extends Component {
  render() {
    return (
      <div className="App">
          <Logo fill="red" className="logo" width={50} height={50} />
      </div>
    );
  }
}

和最低配置如下所示:

{
  test: /\.svg$/,
  use: [
    {
      loader: "babel-loader"
    },
    {
      loader: "react-svg-loader",
      options: {
        jsx: true // true outputs JSX tags
      }
    }
  ]
}

最好的部分是它只输出 svg 文件内容,没有任何额外的包装器和dangerouslySetInnerHTML代码。

这适用于最新的 React 16.10 和 Webpack 4.41。谢谢!
2021-06-19 06:18:23

老问题,但我在任何地方都没有看到这个解决方案,所以我决定发布它,希望它能对某人有所帮助。

如果您希望能够设置这些 SVG 图标的样式,您可能需要使用原始加载器加载它们:

webpack.config.js:

 { 
      test: /\.svg$/, 
      loader: 'raw-loader' 
 } 

我认为的进口:

import closeIcon from 'svg/ic_close_black_24px.svg'; 

模板(Mustache 使用 3 个括号插入未编码的 SVG 数据(URL)):

<button id="closeModal">
  {{{closeIcon}}}
</button>

这样 SVG 数据将被插入而不是括号,如下所示:

<button id="closeModal">
  <svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
    <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"></path>
    <path d="M0 0h24v24H0z" fill="none"></path>
  </svg>
</button>

我在 Webpack 2.5.1 中使用 Backbone with Mustache 模板引擎

将使用基于字符串模板的库,如 Backbone + mustache 或 vue,但不使用 react,因为它使用 JSX 而不是原始字符串。不过,可能确实适用于“dangerouslySetInnerHTML”...
2021-06-09 06:18:23

如果我没记错的话,因为您使用的是文件加载器,所以您可以像使用任何其他需求一样使用它。Webpack 将变成require("./logo.svg")文件的路径,它会在捆绑时发出。

import React, { Component } from 'react'

import mySvg from './logo.svg'

class Header extends Component {

  render() {
    return (
        <div className='header'>
            <img src={mySvg} />
        </div>
    );
  }
};

export default Header
只有在我重新启动后才对我有用 npm start
2021-05-23 06:18:23
这增加了 svg 内联?还是将 svg 包装在图像标签中?
2021-06-08 06:18:23
它对我不起作用:(你能发布你的 webpack.config.js 吗?也许我可以在那里发现我的错误。
2021-06-19 06:18:23