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 ピクセルとさまざまなモバイル画面適応の問題に対する解決策

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

推薦する

Vue3 における親コンポーネントと子コンポーネント間の値の転送の詳細な説明

vue3 が誕生してからかなり時間が経ち、筆者も最近になって vue3 を学び始めました。 vue2...

HTML/CSS での空白処理とページ内の空白を保持する方法

HTML の空白ルールHTML では、コンテンツ内の複数のスペースは通常 1 つとみなされ、連続する...

CentOS 8 に MariaDB をインストールするための詳細なチュートリアル

MariaDB データベース管理システムは MySQL のブランチであり、主にオープンソース コミュ...

React+axios は github 検索ユーザー機能を実装します (サンプル コード)

負荷リクエスト成功リクエストに失敗しました cmdをクリックし、ファイルパスでEnterキーを押しま...

親要素に対する CSS 子要素の固定配置ソリューションの詳細な説明

基本概念絶対配置: 絶対配置に設定された要素ボックスはドキュメント フローから完全に削除され、その包...

MySQL 8.0.18 のインストールと設定方法のグラフィック チュートリアル (Linux)

この記事では、Linux MySQL 8.0.18のインストールと設定のグラフィックチュートリアルを...

WeChatアプレットの入力レベルとテキストエリアレベルの浸透率が高すぎる問題の解決策

WeChat ミニプログラムのネイティブ コンポーネントであるカメラ、キャンバス、入力 (フォーカス...

CSSトランジションは高さを変更することで要素を拡大したり縮小したりします。

一般的な開発ニーズとして、要素の一部を必要になるまで折りたたんでおきたいことが挙げられます。 Boo...

Linuxシステムにmsfをインストールするプロセスの詳細な説明

または、インストールプロセスを自分で書き留めてください。私のサーバーシステムはAliyun Linu...

UbuntuはPythonスクリプトのサンプルコードを定期的に実行する

オリジナルリンク: https://vien.tech/article/157序文この記事では、Ub...

Navicat を MySQL に接続するときに発生する 2059 エラーの解決方法

最近、Djangoを学習しているときにデータベースを使用する必要があったため、MySQLで使用するた...

Keepalived を使用して Nginx の自動再起動とデュアルアクティブ ホットスタンバイの高可用性を実現する方法について

目次1. 概要2. Keepalivedを使用してNginxを自動的に再起動する2.1 シェルスクリ...

カルーセルの制作方法を実現するjs

この記事では、カルーセル画像の表示を実現するためのjsの具体的なコードを参考までに共有します。具体的...

nginx で第 3 レベルドメイン名を設定する方法の例

問題の説明nginx を設定することで、異なるポートを介して異なる Web アプリケーションにアクセ...

MySQL で削除されたレコードが有効にならない理由のトラブルシューティング

オンライン MySQL トランザクションの問題の記録先週の金曜日、大きなテーブルを削除する操作を実行...