如何使用webpack设置内联svg

svn*_*vnm 39 javascript svg loader reactjs webpack

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

我正在关注react-webpack-cookbook.

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

但是,该示例显示使用如下背景图像:

.icon {
   background-image: url(./logo.svg);
}
Run Code Online (Sandbox Code Playgroud)

哪个工作正常,但我想有一个内联svg图像我该怎么做才能在我的react组件中包含我的logo.svg内联?

import React, { Component } from 'react'

class Header extends Component {

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

export default Header
Run Code Online (Sandbox Code Playgroud)

svn*_*vnm 28

实际上,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
Run Code Online (Sandbox Code Playgroud)

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

  • Twitter发布了一个很好的案例研究,显示了为什么您不应该*使用* dangerouslySetInnerHTML来显示SVG:https://medium.com/@paularmstrong/twitter-lite-and-high-performance-react-progressive -web-apps-scale-d28a00e780a3#3732 (3认同)
  • 只是一个说明,这对服务器渲染根本不起作用......所以不像我曾经想象的那么有用。我已经回到使用 svg 作为背景图像。它似乎也像内联 svg 那样使 JavaScript 包膨胀,当然这取决于 svg 的优化程度。 (2认同)

jsa*_*ter 16

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

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

webpack.config.js:

 { 
      test: /\.svg$/, 
      loader: 'raw-loader' 
 } 
Run Code Online (Sandbox Code Playgroud)

在我看来导入:

import closeIcon from 'svg/ic_close_black_24px.svg'; 
Run Code Online (Sandbox Code Playgroud)

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

<button id="closeModal">
  {{{closeIcon}}}
</button>
Run Code Online (Sandbox Code Playgroud)

这样就会插入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>
Run Code Online (Sandbox Code Playgroud)

我正在使用带有Webpack 2.5.1的Backbone和Mustache模板引擎


小智 16

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

反应-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>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

最小配置如下所示:

{
  test: /\.svg$/,
  use: [
    {
      loader: "babel-loader"
    },
    {
      loader: "react-svg-loader",
      options: {
        jsx: true // true outputs JSX tags
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

最好的部分是它只输出svg文件内容,而不需要任何额外的包装器和dangerouslySetInnerHTML代码.


Mic*_*ley 11

如果我没有弄错,因为你正在使用文件加载器,你可以像其他任何需要一样使用它.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
Run Code Online (Sandbox Code Playgroud)

  • 它对我不起作用:(你可以发布你的webpack.config.js吗?也许我可以在那里发现我的错误. (5认同)

Dmi*_*try 6

这是一个简单的非反应性解决方案。

  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());
Run Code Online (Sandbox Code Playgroud)

  • 不依靠反应并呈现香草ECMAScript的荣誉 (2认同)

小智 5

类似于使用React的另一个答案,也有一个方便的Vue插件。

vue-svg-loader只是将其放入您的配置中并开始使用。令人高兴的是,它还将通过SVGO运行svg进行优化。

组态

{
    test: /\.svg$/,
  loader: 'vue-svg-loader', // `vue-svg` for webpack 1.x
  options: {
    // optional [svgo](https://github.com/svg/svgo) options
    svgo: {
      plugins: [
        {removeDoctype: true},
        {removeComments: true}
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

用法

<template>
  <nav id="menu">
    <a href="...">
      <SomeIcon class="icon" />
      Some page
    </a>
  </nav>
</template>

<script>
import SomeIcon from './assets/some-icon.svg';

export default {
  name: 'menu',
  components: {
    SomeIcon,
  },
};
</script>
Run Code Online (Sandbox Code Playgroud)