Detaillierte grafische Erklärung zur Verwendung von SVG im Vue3+Vite-Projekt

Detaillierte grafische Erklärung zur Verwendung von SVG im Vue3+Vite-Projekt

Heute habe ich bei der Verwendung von SVG in der Praxis des VUE3 + VITE-Projekts festgestellt, dass die vorherige Schreibmethode nicht verwendet werden kann. Die vorherige Verwendungsmethode bezieht sich auf die elegante Verwendung von SVG in VUE2

const req = require.context('./icons/svg', false, /\.svg$/)
const erfordertAlles = erfordertInhalt => erfordertInhalt.keys().map(erfordertInhalt)
erfordernAlles(req)

Dann habe ich nach verschiedenen Materialien gesucht und es schließlich realisiert. Ohne weitere Umschweife hier der Code:

Schritt 1: Dateiverzeichnis

Schritt 2: Installieren Sie svg-sprite-loader

npm installiere svg-sprite-loader -D
# über Garn
Garn fügt SVG-Sprite-Loader hinzu -D

Schritt 3: Erstellen Sie die Datei svgIcon.vue

   <Vorlage>
  <svg :class="svgClass" v-bind="$attrs" :style="{color: color}">
    <use :xlink:href="iconName" rel="external nofollow" />
  </svg>
</Vorlage>

<Skript-Setup>


importiere { defineProps, berechnet } von "vue";

const props = defineProps({
  Name: {
      Typ: Zeichenfolge,
      erforderlich: true
    },
    Farbe:
      Typ: Zeichenfolge,
      Standard: ''
    }
})

const iconName = berechnet(()=>`#icon-${props.name}`);
const svgClass = berechnet(()=> {
  console.log(Eigenschaftenname, 'Eigenschaftenname');
  wenn (Eigenschaften.Name) {
        gibt `svg-icon icon-${props.name}` zurück
      }
      gib 'svg-icon' zurück
});
</Skript>

<style lang='scss'>
.svg-Symbol {
  Breite: 1em;
  Höhe: 1em;
  füllen: aktuelle Farbe;
  vertikale Ausrichtung: Mitte;
}
</Stil>

Schritt 4: Erstellen Sie einen Symbolordner zum Speichern von SVG-Dateien

Schritt 5: SVG-Symbolkomponente global in main.js einfügen

importiere { createApp } von 'vue'
App aus „./App.vue“ importieren

importiere svgIcon aus „./components/svgIcon.vue“

App erstellen(App).Komponente('svg-icon', svgIcon).mount('#app');

Schritt 6: Erstellen Sie svgBuilder.js im Plugins-Ordner (hier kommt der entscheidende Punkt), TS-Versionsreferenz: https://github.com/JetBrains/svg-sprite-loader/issues/434

importiere { readFileSync, readdirSync } von 'fs'

let idPerfix = ''
const svgTitle = /<svg([^>+].*?)>/
const clearHeightWidth = /(Breite|Höhe)="([^>+].*?)"/g

const hasViewBox = /(viewBox="[^>+].*?")/g

const clearReturn = /(\r)|(\n)/g

Funktion findSvgFile(dir) {
  const svgRes = []
  const dirents = readdirSync(dir, {
    mitDateitypen: true
  })
  für (const dirent von dirents) {
    wenn (dirent.isDirectory()) {
      svgRes.push(...findSvgFile(dir + dirent.name + '/'))
    } anders {
      const svg = readFileSync(dir + dirent.name)
        .toString()
        .replace(clearReturn, '')
        .replace(svgTitle, ($1, $2) => {
          // konsole.log(++i)
          // konsole.log(dirent.name)
          lass Breite = 0
          sei Höhe = 0
          lass Inhalt = $2.replace(
            klareHöheBreite,
            (s1, s2, s3) => {
              wenn (s2 === 'Breite') {
                Breite = s3
              } sonst wenn (s2 === 'Höhe') {
                Höhe = s3
              }
              zurückkehren ''
            }
          )
          wenn (!hasViewBox.test($2)) {
            Inhalt += `viewBox="0 0 ${width} ${height}"`
          }
          gibt `<symbol id="${idPerfix}-${dirent.name.replace(
            '.svg',
            ''
          )}" ${content}>`
        })
        .replace('</svg>', '</symbol>')
      svgRes.push(svg)
    }
  }
  svgRes zurückgeben
}

export const svgBuilder = (Pfad, Perfix = 'Symbol') => {
  wenn (Pfad === '') return
  idPerfix = Perfix
  const res = findSvgFile(Pfad)
  // console.log(Res.Länge)
  // const res = []
  zurückkehren {
    Name: "svg-transform",
    transformIndexHtml(html) {
      html.replace( zurückgeben
        '<Text>',
        `
          <Text>
            <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position: absolute; breite: 0; höhe: 0">
              ${res.join('')}
            </svg>
        `
      )
    }
  }
}

Schritt 7: Ändern Sie abschließend die Konfiguration in vite.config.js

importiere { svgBuilder } aus './src/plugins/svgBuilder'; 

exportiere Standard-DefineConfig({
  Plugins: [svgBuilder('./src/icons/svg/')] // Alle SVG-Dateien unter src/icons/svg/ wurden hierher importiert, sie müssen nicht separat importiert werden})

Zusammenfassen

Dies ist das Ende dieses Artikels zur Verwendung von SVG in Vue3+Vite-Projekten. Weitere relevante Inhalte zur Verwendung von SVG in Vue3+Vite finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung des mobilen Projekts vite2.0 + vue3

<<:  CSS-Pixel und Lösungen für verschiedene Probleme bei der Anpassung mobiler Bildschirme

>>:  So verwenden Sie die Shell, um Batchvorgänge auf mehreren Servern auszuführen

Artikel empfehlen

Lösungen für MySQL OOM (Speicherüberlauf)

OOM steht für „Out Of Memory“, was so viel bedeut...

Details zur Überwachung von DOM-Elementen durch MutationObServer in JavaScript

1. Grundlegende Verwendung Es kann über den Mutat...

Was tun, wenn Sie das ursprüngliche Passwort für MySQL auf dem MAC vergessen?

Die Lösung zum Vergessen des ursprünglichen MySQL...

Was ist ein MIME-TYP? MIME-Typen-Typensammlung

Was ist ein MIME-TYP? 1. Zunächst müssen wir verst...

Beispiel für einen WeChat-Applet-Rechner

Beispiel für einen WeChat-Applet-Rechner. Zu Ihre...

Einführung in die MySQL-Ansicht und Tutorial zur grundlegenden Bedienung

Vorwort Ansicht ist ein sehr nützliches Datenbank...

Detaillierte Erklärung der JavaScript-Array-Deduplizierung

Inhaltsverzeichnis 1. Array-Deduplizierung 2. Ded...

30 Tipps zum Schreiben von HTML-Code

1. HTML-Tags immer schließen Im Quellcode der vor...

Methoden und Probleme zum Festlegen des HTML-Zeilenabstands

Um den Zeilenabstand von <p></p> festz...

Drei Möglichkeiten zur Kommunikation zwischen Docker-Containern

Wir alle wissen, dass Docker-Container voneinande...

Detaillierte Beschreibung allgemeiner Ereignisse und Methoden von HTML-Text

Veranstaltungsbeschreibung onactivate: Wird ausgel...

Der Unterschied zwischen Name und Wert im Eingabe-Tag

Typ ist das Steuerelement, das für die Eingabe und...

Detaillierte Erklärung zur Verwendung des MySQL-Datentyps DECIMAL

Der MySQL DECIMAL Datentyp wird zum Speichern exa...