vue3+vite プロジェクトで svg を使用する方法の詳細なグラフィック説明

vue3+vite プロジェクトで svg を使用する方法の詳細なグラフィック説明

今日、vue3+viteプロジェクトの実践で、svgを使用する場合、以前の記述方法が使用できないことがわかりました。以前の使用方法は、vue2でのsvgのエレガントな使用を指します

const req = require.context('./icons/svg', false, /\.svg$/)
const requireAll = requireContent => requireContent.keys().map(requireContent)
すべて必須(必須)

それから、いろいろな資料を探して、ようやく実現しました。さっそく、コードをご紹介します。

ステップ1: ファイルディレクトリ

ステップ2: svg-sprite-loaderをインストールする

npm インストール svg-sprite-loader -D
# 糸経由
糸にSVGスプライトローダーを追加 -D

ステップ3: svgIcon.vueファイルを作成する

   <テンプレート>
  <svg :class="svgClass" v-bind="$attrs" :style="{color: color}">
    <use :xlink:href="iconName" rel="external nofollow" />
  </svg>
</テンプレート>

<スクリプトの設定>


「vue」から、defineProps、computed をインポートします。

const props = defineProps({
  名前: {
      タイプ: 文字列、
      必須: true
    },
    色:
      タイプ: 文字列、
      デフォルト: ''
    }
})

const iconName = computed(()=>`#icon-${props.name}`);
const svgClass = 計算済み(()=> {
  コンソールにログ出力します。
  if (props.name) {
        `svg-icon icon-${props.name}` を返します
      }
      'svg-icon' を返す
});
</スクリプト>

<スタイル lang='scss'>
.svgアイコン{
  幅: 1em;
  高さ: 1em;
  塗りつぶし: 現在の色;
  垂直位置合わせ: 中央;
}
</スタイル>

ステップ4: SVGファイルを保存するアイコンフォルダを作成する

ステップ5: main.jsにsvg-iconコンポーネントをグローバルに挿入する

'vue' から {createApp} をインポートします。
'./App.vue' からアプリをインポートします。

'./components/svgIcon.vue' から svgIcon をインポートします。

createApp(App).component('svg-icon', svgIcon).mount('#app');

ステップ 6: プラグイン フォルダーに svgBuilder.js を作成します (ここが重要なポイントです)。ts バージョン参照: https://github.com/JetBrains/svg-sprite-loader/issues/434

'fs' から { readFileSync, readdirSync } をインポートします。

idPerfix = '' とします
const svgTitle = /<svg([^>+].*?)>/
const clearHeightWidth = /(幅|高さ)="([^>+].*?)"/g

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

定数クリアリターン = /(\r)|(\n)/g

関数 findSvgFile(dir) {
  定数svgRes = []
  定数 dirents = readdirSync(dir, {
    ファイルタイプ: true
  })
  for (const dirent of dirents) {
    (dirent.isDirectory())の場合{
      svgRes.push(...SvgFile を検索(dir + dirent.name + '/'))
    } それ以外 {
      const svg = readFileSync(dir + dirent.name)
        .toString()
        .replace(クリアリターン、'')
        .replace(svgTitle, ($1, $2) => {
          // コンソール.log(++i)
          // console.log(dirent.name)
          幅を0にする
          高さを0にする
          コンテンツ = $2.replace(
            クリア高さ幅、
            (s1, s2, s3) => {
              s2 === '幅'の場合{
                幅 = s3
              } そうでない場合 (s2 === '高さ') {
                高さ = s3
              }
              戻る ''
            }
          )
          if (!hasViewBox.test($2)) {
            コンテンツ += `viewBox="0 0 ${幅} ${高さ}"`
          }
          `<symbol id="${idPerfix}-${dirent.name.replace( を返します。
            '.svg',
            ''
          )}" ${content}>`
        })
        .replace('</svg>', '</symbol>')
      svgRes.push(svg)
    }
  }
  svgResを返す
}

エクスポート const svgBuilder = (path, perfix = 'icon') => {
  if (path === '') 戻り値
  idPerfix = パーフィックス
  const res = findSvgFile(パス)
  // コンソール.log(res.length)
  // 定数 res = []
  戻る {
    名前: 'svg-transform',
    変換インデックスHTML(html) {
      html.replace() を返す
        '<本文>',
        `
          <本文>
            <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" スタイル="位置: 絶対; 幅: 0; 高さ: 0">
              ${res.join('')}
            </svg>
        `
      )
    }
  }
}

ステップ7: 最後に、vite.config.jsの設定を変更します。

'./src/plugins/svgBuilder' から { svgBuilder } をインポートします。 

デフォルトのdefineConfigをエクスポートする({
  plugins: [svgBuilder('./src/icons/svg/')] // src/icons/svg/ の下にあるすべての svg ファイルはここでインポートされているため、個別にインポートする必要はありません})

要約する

これで、Vue3+Vite プロジェクトで SVG を使用する方法に関するこの記事は終了です。Vue3+Vite で SVG を使用する方法に関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • vite2.0+vue3 モバイルプロジェクトの詳細な説明

<<:  CSS ピクセルとさまざまなモバイル画面適応の問題に対する解決策

>>:  シェルを使用して複数のサーバーでバッチ操作を実行する方法

推薦する

テーブル関連の配置とJavascript操作テーブル、tr、td

適切に機能するテーブル プロパティ設定:コードをコピーコードは次のとおりです。 <テーブル セ...

Vueにおける仮想DOMの理解のまとめ

これは本質的に、ビュー インターフェース構造を記述するために使用される共通の js オブジェクトです...

Centos7 インストール mysql5.6.29 シェル スクリプト

この記事では、参考までにmysql5.6.29のシェルスクリプトを共有します。具体的な内容は次のとお...

MySQLバッチは特定のフィールドのスペースを削除します

Mysql で特定のフィールドからスペースを一括削除する方法はありますか?文字列の前後のスペースだけ...

JS を使用してデータ型を決定する 4 つの方法

目次序文1. 型2. インスタンス3. コンストラクター詳細: 4. 文字列要約する序文Javasc...

JavaScript - Vue でのスロットの使用: スロット

目次Vue でのスロットの使用: slotスコープ付きスロット: テンプレートタグで囲む要約するVu...

jQueryフレームワークは、要素の表示と非表示の3つのアニメーションメソッドを実装しています。

目次1. デフォルトで表示と非表示を切り替える2. スライドして表示と非表示を切り替える3. フェー...

MySQL トリガーの追加、削除、変更、クエリ操作の例

この記事では、例を使用して、MySQL トリガーの追加、削除、変更、およびクエリ操作について説明しま...

CSSアニメーションがJSによってブロックされるかどうかについての簡単な議論

CSS のアニメーション部分は JS によってブロックされますが、transform のアニメーショ...

MySQL 継続的集計の原理と使用法の分析

この記事では、例を使用して、MySQL の継続的な集計の原理と使用方法を説明します。ご参考までに、詳...

CSS3 のディスプレイのグリッドレイアウトとフレックスレイアウトの詳細な説明

Gird レイアウトは Flex レイアウトといくつかの類似点があり、どちらもコンテナーの内部項目を...

なぜ Tomcat が起動できないのでしょうか?

目次現象:ポートの使用:ファイルにスペルミスがあります:現象: Tomcat がインストールされ、W...

Vue3における7種類のコンポーネント通信の詳細

目次1. Vue3コンポーネント通信方式2. Vue3通信の使い方2.1 小道具2.2 $エミット2...

MySQL は対応するクライアント プロセスにどのように接続しますか?

質問特定の MySQL 接続について、それがどのクライアント プロセスからのものであるかをどのように...

Springboot プロジェクトの Docker-compose イメージリリースプロセス分析

導入Docker-Compose プロジェクトは、Docker コンテナ クラスターの迅速なオーケス...