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

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

推薦する

Linuxカーネルの浮動小数点演算のサポートに関する簡単な説明

現在、ほとんどの CPU は浮動小数点ユニット (FPU) をサポートしています。FPU は、プロセ...

jquery+springbootでファイルアップロード機能を実現

この記事の例では、ファイルアップロード機能を実現するためのjquery+springbootの具体的...

ウェブページ作成時に標準 HTML コードを使用する際のポイント

多くの Web サイト デザイナーが犯す最も一般的な間違いは、Web ページが IE で正常に表示さ...

CSSで制御可能な点線を実装する方法

序文CSS を使用して点線を生成するのは、フロントエンド開発者にとっては簡単です。一般的に、これを実...

数千万件のレコードをMySQLに素早く挿入する方法に関する実践的なチュートリアル

1. データベースを作成する 2. テーブルを作成する1. deptテーブルを作成する テーブル「d...

Vue の高度なコンポーネント機能コンポーネントの使用シナリオとソースコード分析

目次導入使用シナリオソースコード分析要約する導入Vue は、コンポーネントをステートレスかつインスタ...

Vue はボタンをクリックしてファイルをダウンロードする操作コードを実装します (バックエンド Java)

前回の記事では、ボタンをクリックしてファイルをダウンロードするVueの機能を紹介しました。今日は、ボ...

JavaScript PromiseとAsync/Awaitの詳細な説明

目次概要4つの例例1: 誕生日で説明する約束の基本例2: 数字当てゲーム例3: Web APIから国...

モバイルプラットフォーム開発におけるメタタグの適用の詳細な説明

デスクトップ プラットフォームの Web レイアウトのメタ タグは誰もがよく知っています。これは常に...

Doubanウェブサイトのウェブサイトコンテンツに小さな変更を加える方法

<br />読みやすさはウェブサイトにとって非常に重要な部分であり、ウェブサイトの核心と...

Linux で crond ツールを使用してスケジュールされたタスクを作成する方法

序文Crond は Linux のスケジュール実行ツール (Windows のスケジュールされたタス...

DockerコンテナでArthasを使用するための詳細な手順

Arthas はあなたのために何ができるでしょうか? Arthas 、開発者に深く愛されている Al...

nginx での listen ディレクティブの例の分析

プロットレビュー前回の記事では、ロケーション命令の解析プロセスを分析しました。この内容を簡単に確認し...

Vue3とTypeScriptを組み合わせたプロジェクト開発の実践記録

目次概要1. コンポジションAPI 1. ref と reactive の違いは何ですか? 2. 周...

マウスを置いたときに半透明効果のテキスト説明を実現するための純粋な CSS (初心者は必読)

効果は以下のとおりです。 例1 例2:例1[結婚式の計画]を例にとるHTML: <div cl...