前端项目SVG展示方案总结,以Vue3+TS为例

在 前端项目(Vue 3 + TypeScript) 项目中展示 SVG 图片主要有以下几种方式:

1. 直接使用 <img> 标签

这是最简单的方式,适用于不需要对 SVG 进行样式修改或交互的场景。

示例如下:

typescript 复制代码
<template>
  <img src="@/assets/image.svg" alt="SVG Image" />
</template>

<script lang="ts" setup>
// 无需额外代码
</script>  

在上述代码里,@ 通常是 Vite 或 Vue CLI 配置的 src 目录别名。

2. 将 SVG 作为内联代码插入

如果需要对 SVG 进行样式修改或交互,可以将 SVG 代码直接插入到 Vue 模板中。

示例 如下:

typescript 复制代码
<template>
  <div>
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
      <circle cx="50" cy="50" r="40" fill="blue" />
    </svg>
  </div>
</template>

<script lang="ts" setup>
// 无需额外代码
</script>  

3. 使用 vite-svg-loader 将 SVG 作为组件使用(适用于 Vite 项目)

vite-svg-loader 可以让你把 SVG 文件当作 Vue 组件来使用。

安装依赖

bash

css 复制代码
npm install vite-svg-loader --save-dev

配置 Vite

vite.config.ts 中添加如下配置:

typescript 复制代码
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import svgLoader from 'vite-svg-loader';

export default defineConfig({
  plugins: [vue(), svgLoader()],
});

使用 SVG 组件

示例如下:

typescript 复制代码
<template>
  <div>
    <MySvg />
  </div>
</template>

<script lang="ts" setup>
import MySvg from '@/assets/image.svg';
</script>    

4. 使用 @svgr/webpack(适用于 Webpack 项目)

如果你使用的是 Webpack 构建项目,可以使用 @svgr/webpack 把 SVG 文件转换为 Vue 组件。

安装依赖

bash

sql 复制代码
npm install @svgr/webpack --save-dev

配置 Webpack

webpack.config.js 中添加如下配置:

javascript 复制代码
module.exports = {
  module: {
    rules: [
      {
        test: /.svg$/,
        use: ['@svgr/webpack'],
      },
    ],
  },
};

使用 SVG 组件

使用方式与 vite-svg-loader 类似,在 Vue 组件中导入并使用 SVG 文件。

这几种使用方式有何优劣,以及适用场景

1. 直接使用 <img> 标签

优点

  • 简单便捷 :只需在 src 属性里指定 SVG 文件的路径,无需额外配置和复杂的操作。
  • 兼容性好 :所有现代浏览器都支持使用 <img> 标签展示 SVG 图片,无需担心兼容性问题。
  • 缓存机制:浏览器会自动对图片进行缓存,再次加载相同的 SVG 时速度更快。

缺点

  • 无法直接样式修改和交互:不能直接在 CSS 中修改 SVG 的内部样式,也难以对 SVG 元素添加交互事件。
  • 不支持动态内容 :如果 SVG 内容需要根据数据动态变化,这种方式无法满足需求,如currentColor

适用场景

  • 当你只需要展示静态的 SVG 图片,不需要对其进行样式修改和交互时,使用 <img> 标签是最简单高效的选择。例如,展示公司 logo、装饰性图标等。

2. 将 SVG 作为内联代码插入

优点

  • 可灵活样式修改和交互:可以直接在 CSS 中修改 SVG 的内部样式,也能为 SVG 元素添加交互事件,实现动态效果。
  • 支持动态内容:可以结合 Vue 的响应式数据,动态生成 SVG 内容。

缺点

  • 代码冗余:如果多个地方使用相同的 SVG,需要重复编写代码,增加了代码量。
  • 维护成本高:当 SVG 代码发生变化时,需要在多个地方进行修改。

适用场景

  • 当你需要对 SVG 进行复杂的样式修改和交互,或者 SVG 内容需要根据数据动态变化时,适合使用内联 SVG。例如,制作交互式图表、动画效果等。

3. 使用 vite-svg-loader 将 SVG 作为组件使用(适用于 Vite 项目)

优点

  • 组件化管理:将 SVG 封装成组件,提高了代码的可复用性和可维护性。
  • 方便样式修改和交互:可以像使用普通 Vue 组件一样,对 SVG 组件进行样式修改和交互处理。
  • 与 Vite 集成良好:专门为 Vite 设计,配置简单,性能优化。

缺点

  • 额外配置 :需要安装和配置 vite-svg-loader,增加了一定的学习成本。
  • 不适合简单场景:对于只需要展示静态 SVG 的简单场景,使用组件化方式会显得过于复杂。

适用场景

  • 当你在 Vite 项目中,且需要在多个地方复用相同的 SVG,同时需要对其进行样式修改和交互时,使用 vite-svg-loader 将 SVG 作为组件使用是最佳选择。例如,项目中多个页面都使用相同的图标,并且需要对图标进行悬停效果、点击事件等处理。

4. 使用 @svgr/webpack(适用于 Webpack 项目)

优点

  • 组件化管理 :与 vite-svg-loader 类似,将 SVG 封装成组件,提高代码的可复用性和可维护性。
  • 方便样式修改和交互:可以像使用普通 Vue 组件一样,对 SVG 组件进行样式修改和交互处理。
  • 与 Webpack 集成良好:专门为 Webpack 设计,能充分利用 Webpack 的功能。

缺点

  • 额外配置 :需要安装和配置 @svgr/webpack,增加了一定的学习成本。
  • 不适合简单场景:对于只需要展示静态 SVG 的简单场景,使用组件化方式会显得过于复杂。

适用场景

  • 当你在 Webpack 项目中,且需要在多个地方复用相同的 SVG,同时需要对其进行样式修改和交互时,使用 @svgr/webpack 将 SVG 作为组件使用是比较合适的。例如,项目中使用 Webpack 构建,并且有多个模块需要使用相同的 SVG 图标,同时需要对图标进行样式定制和交互处理。

综上所述,可以根据项目的构建工具、需求复杂度和代码复用性等因素来选择合适的展示方式。如果只是简单展示静态 SVG,使用 <img> 标签即可;如果需要复杂的样式修改和交互,可选择内联 SVG 或使用组件化方式;如果项目使用 Vite 构建,推荐使用 vite-svg-loader;如果使用 Webpack 构建,推荐使用 @svgr/webpack

相关推荐
AI大模型顾潇1 小时前
[特殊字符] 本地大模型编程实战(29):用大语言模型LLM查询图数据库NEO4J(2)
前端·数据库·人工智能·语言模型·自然语言处理·prompt·neo4j
九月TTS1 小时前
TTS-Web-Vue系列:Vue3实现内嵌iframe文档显示功能
前端·javascript·vue.js
爱编程的小学究1 小时前
【node】如何把包发布到npm上
前端·npm·node.js
weixin_473894772 小时前
前端服务器部署分类总结
前端·网络·性能优化
LuckyLay2 小时前
React百日学习计划-Grok3
前端·学习·react.js
澄江静如练_2 小时前
小程序 存存上下滑动的页面
前端·javascript·vue.js
互联网搬砖老肖2 小时前
Web 架构之会话保持深度解析
前端·架构
菜鸟una2 小时前
【taro3 + vue3 + webpack4】在微信小程序中的请求封装及使用
前端·vue.js·微信小程序·小程序·typescript·taro
hao_04133 小时前
elpis-core: 基于 Koa 实现 web 服务引擎架构设计解析
前端
狂野小青年3 小时前
npm 报错 gyp verb `which` failed Error: not found: python2 解决方案
前端·npm·node.js