如何在 React 中使用 SVG

SVG 是一种基于 XML 的矢量图形图像格式。SVG 代表 可缩放矢量图形。它是在 1990 年代后期开发的,直到 2016 年左右才得到很好的支持。

今天,很大一部分图标库,如Flaticon,Font Awesome,Material Icon等,完全支持SVG。Twitter,YouTube,Udacity,Netflix等品牌使用SVG作为他们的一些图像和图标。

为什么使用 SVG 而不是其他图像格式?

您可能比 SVG 更熟悉 JPEG、GIF 和 PNG 等图像格式。但是,您希望使用 SVG 而不是这些其他格式的原因有很多。让我们看看 SVG 相对于其他图像格式的一些优势:

  • 可扩展性和分辨率:win10系统无法输出HDMI音频怎么办?HDMI线连接常见问题和解决方法这是 SVG 相对于其他格式的最大优势。SVG 使用形状、数字和坐标,而不是像其他图像格式那样使用像素网格。如何在笔记本电脑上设置Wi-Fi热点?启动Wi-Fi热点可能遇到的错误这使得在不损失质量的情况下放大和缩小 SVG 图像成为可能,并使 SVG 能够无限缩放

  • 小文件大小:与其他文件格式相比,SVG 文件大小通常很小,并且它们易于压缩,这使得它们的大小更小

  • 高性能和速度:由于体积小,SVG 图像对于浏览器来说非常容易和快速渲染。这就像渲染文本与其他图像格式的像素和颜色相比。此外,如果您在代码中使用内联 SVG,浏览器不必发出请求来获取图像,并像文件中的所有其他代码一样呈现它。在这种情况下,没有提出任何请求。但是在你有复杂的图像SVG文件的情况下,如何拆戴尔Inspiron 15 5570笔记本电脑并安装M.2固态硬盘?戴尔笔记本拆机图文教程例如蒙娜丽莎的照片,我建议使用PNG或JPEG,因为SVG的加载时间和性能可能会急剧下降

  • 类似 DOM 的、可样式的和可编辑的:SVG 图像就像代码一样,因此这意味着它们可以像 DOM 元素一样导航,也可以设置样式。某些属性将具有不同的名称。但是,您可能希望使用 而不是 ,例如。电脑运行启动命令有哪些?在 Windows中打开“运行”命令窗口的8种方法你也可以用CSS来设置SVG的样式。同样,由于 SVG 类似于 DOM,因此可以使用任何文本编辑器创建、编辑和动画 SVGfill``color

  • 可动画:SVG 可以动画化。这可以通过Web动画API,WebGL,CSS动画等工具完成。在这篇详细的文章中阅读有关使用 CSS 对 SVG 进行动画处理的更多信息

  • 易于集成:SVG 可以以多种方式使用:它们可以显示徽标图像和图标、图形、动画、效果等

  • 可访问性和 SEO:SVG 包含文本,从而提高了可访问性。这也意味着它们可以被搜索、索引、脚本化等。

如何在 React 中使用 SVG

下面我们将介绍在网页上使用或渲染此 React SVG 徽标的各种方式。 值得注意的是,Create React App 具有用于处理 SVG 的内置配置。如何从Excel单元格中删除多个字符?一次删除所有不需要的字符本文中一些需要修改 webpack 设置的示例仅适用于使用 webpack 作为捆绑器的自定义 React 项目。

如果您不将 webpack 用于自定义 React 项目,则可能需要不同的插件。

将标记用于静态 SVG<img>

为了在标签中使用 SVG 或任何其他图像格式,我们必须在我们使用的任何模块捆绑器中设置文件加载器系统。在这里,如果您已经在使用 webpack 作为捆绑器,我将向您展示如何通过几个步骤进行设置。<img>

如果您使用的是 webpack 4,请首先使用命令 .这会将其安装为开发依赖项。$ npm install file-loader --save-dev

您可以使用以下代码更新 webpack 配置文件规则:

const webpack = require('webpack');
​
module.exports = {
  entry: './src/index.js',
  module: {
    rules: [
      //...
      {
        test: /\.(png|jp(e*)g|svg|gif)$/,
        use: [
          {
            loader: 'file-loader',
            options: {
              name: 'images/[hash]-[name].[ext]',
            },
          },
        ],
      },
    ],
  },
  //...
};

但是,如果您使用的是 webpack 5,趣知笔记则不推荐使用文件加载器库。请改用资产模块。借助资产模块,您可以在项目设置中使用资源文件,而无需安装其他加载程序。更新 webpack 配置文件的规则字段以包含以下内容:

module.exports = {
  entry: "./src/index.js",
  module: {
    rules: [
      //...
      {
        test: /\.(png|jp(e*)g|svg|gif)$/,
        type: "asset/resource",
      },
    ],
  },
  //...
};

现在,您可以导入 SVG 并将其用作变量,如下所示:

import React from 'react';
{/*images*/}
import ReactLogo from './logo.svg';
​
const App = () => {
  return (
    <div className="App">
      <img src={ReactLogo} alt="React Logo" />
    </div>
  );
}
export default App;

使用元素<svg>

使用上述相同的 webpack 设置,趣知笔记网站地图我们可以通过将文件的内容复制并粘贴到我们的代码中来使用该元素。下面是一个示例用例:<svg>``.svg

import React from 'react';
​
const App = () => {
  return (
    <div className="App">
      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3">
        <g fill="#61DAFB">
          <path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/>
          <circle cx="420.9" cy="296.5" r="45.7"/>
          <path d="M520.5 78.1z"/>
        </g>
      </svg>
    </div>
  );
}
export default App;

您可能已经看到了使用此方法的缺点。当图像更复杂时,SVG 文件会变大,并且由于 SVG 存储在文本中,这意味着我们的代码中有一大堆文本。

使用 SVG 作为组件

SVG 可以导入并直接用作 React 代码中的 React 组件。图像不会作为单独的文件加载;相反,它与 HTML 一起呈现。示例用例如下所示:

import React from 'react';
import {ReactComponent as ReactLogo} from './logo.svg';
​
const App = () => {
  return (
    <div className="App">
      <ReactLogo />
    </div>
  );
}
export default App;

请注意,这种方法仅适用于Create React App.CRA在后台使用SVGR来转换和导入SVG作为React组件。如果您不使用Create React App,我建议您使用其他方法。

使用 SVGR

SVGR 是一个很棒的工具,可以将你的 SVG 转换为 React 组件。那么我们如何设置它呢?

首先,通过运行命令 来安装软件包。然后,更新您的 webpack 配置规则以对 SVG 使用 SVGR:$ npm install @svgr/webpack --save-dev

const webpack = require('webpack');
​
module.exports = {
  entry: './src/index.js',
  module: {
    rules: [
      //...
      {
        test: /\.svg$/,
        use: ['@svgr/webpack'],
      },
    ],
  },
  //...
};

现在您可以将 SVG 图像作为 React 组件导入,并在我们的代码中使用它们,如下所示:

import React from 'react';
import ReactLogo from './logo.svg';
​
const App = () => {
  return (
    <div className="App">
      <ReactLogo />
    </div>
  );
}
export default App;

使用 SVG 作为数据网址

数据 URL 是以该方案为前缀的 URL,它允许内容创建者在文档中内联嵌入小文件。您可以在 MDN 网络文档中阅读有关它们的更多信息。这种方法允许我们像内联元素一样使用 SVG 图像。data:

您如何实现这一目标?首先,如果您使用的是 webpack,则需要一个合适的加载器。对于此用例,我将使用 .您可以通过运行命令将其添加到您的项目中。svg-url-loader``$ npm install svg-url-loader --save-dev

然后,使用以下内容更新 webpack 配置文件规则部分:

const webpack = require('webpack');
​
module.exports = {
  entry: './src/index.js',
  module: {
    rules: [
      //...
      {
        test: /\.svg$/,
        use: [
          {
            loader: 'svg-url-loader',
            options: {
              limit: 10000,
            },
          },
        ],
      },
    ],
  },
  //...
};

现在你可以导入你的 SVG 文件并在你的 React 组件中使用它,就像这样:

import ReactLogo from './logo.svg';

const App = () => {
  return (
    <div className="App">
      <img src={ReactLogo} alt="React Logo" />
    </div>
  );
}

<img src="data:image/svg+xml,%3csvg..." alt="React Logo" />

这通常会导致 DOM 中出现类似这样的结果:

<img src="data:image/svg+xml,%3csvg..." alt="React Logo" />

使用react-svg

直接在 React 组件中添加 SVG 标记会增加其文件大小,使其难以维护。尽管有此限制,但使用内联 SVG 也有其优势。与使用标签相比,在内联嵌入 SVG 标记时,您可以轻松地将 CSS 样式应用于 SVG 标记。img

要利用内联嵌入 SVG 的好处而不用担心组件的可维护性,您可以使用该包。它异步获取 SVG 并将其内联嵌入。react-svg

您可以从 NPM 包注册表安装它,如下所示:

npm install react-svg

然后,您可以导入组件并将其渲染到 React 应用程序中。该组件将 SVG 的 URL 作为属性的值。它还需要几个可选的道具,你可以在文档中查找:ReactSVGReactSVGsrc

import { ReactSVG } from "react-svg";

<ReactSVG src="icon.svg" />

如何在 React 中为 SVG 制作动画

如介绍中所述,使用 SVG 相对于其他图像格式的好处之一是 SVG 可以进行动画处理。您可以使用CSS或React动画库(如Framer motion和React spring)对SVG进行动画处理。

注意事项:

  • 复杂的图像:图像越复杂,SVG文件就越大 - 我们在尝试使用该元素时看到了这一点。在这里,我建议您使用PNG或JPEG图像<svg>

  • Web 上的向后支持:SVG 没有向后浏览器支持,这意味着大多数较旧的浏览器版本不支持 SVG。因此,SVG 可能无法为仍在使用这些版本的用户正确显示。如果您的目标是旧版本的浏览器,SVG 可能不是您的首选图像格式

结论

SVG 在当今网络上的图像中占很大比例。如上所述,SVG 的文件大小比其他图像格式小。您可以在不损失图像质量的情况下调整它们的大小,并且它们是可动画的。

虽然它的用法在HTML中很简单,但你需要额外的工具和配置才能开始在React等前端框架中使用SVG。大多数流行的 React 项目入门工具集,如 Create React App、Ite 和 Astro,都带有开箱即用的配置,用于处理静态资产,如图像,包括 SVG。

正如文章中所暗示的,Create React App 在引擎盖下使用 SVGR webpack 加载器。因此,您可以导入带有语句的 SVG 并将其呈现在应用程序中。您还可以内联 SVG 标记。但是,以内联方式呈现 SVG 会使组件难以维护。@svgr/webpack``import

对于使用 webpack 作为捆绑器的自定义 React 项目,您可以将加载器配置为加载类似于创建 React 应用程序的 SVG。@svgr/webpack

当您使用 SVG 时,值得一提的是,复杂图像可以包含大型 SVG 文件,尤其是在您想要内联 SVG 时。虽然大多数流行的现代浏览器完全支持 SVG,但某些浏览器(尤其是移动浏览器)并不完全支持某些 SVG 功能。

猜你喜欢

转载自blog.csdn.net/weixin_47967031/article/details/132599896