Webpackインポートsvgアイコン
svgはXML形式に基づく画像記述音声で、ベクトルマップであり、canvasと比較して拡大時に歪みはなく、画像に比べてテキスト形式が存在するため、サイズが小さくなる.従来の使用方法では、svgを必要な場所にコピーしたり、importをあちこちにコピーしたりして、コードが美しくないだけでなく、メンテナンスが面倒で、特にアイコンが多くなったときです.次に、コンポーネントでsvgアイコン(vueを例にreactと同様)を使用する方法について説明します.
実現原理:svgのuseタグを利用して、idを通じて対応するsvgアイコンを参照する
上記のsvgコードでは、htmlページに埋め込まれた2つのアイコンは表示されません.あるアイコンを使用する必要がある場合(id=「icon-close」)を例にとると、htmlページで以下のように参照できます.
まず、すべてのsvgファイルをsvgラベルにパッケージ化し、symbolラベルごとにidを設定します.ここでは、webpackのsvg-sprite-lpaderで実現できます.
一般的には、アイコンとして使用するsvgファイルをすべてフォルダの下に置き、includeでこのファイルの下のsvgファイルを処理し、この方法で使用する必要のない他のsvgが処理されないようにします.
次に、svgファイルをすべてインポートする方法を考えます.ここではwebpackのrequireを使用します.contextで実現
まず、SvgIconをグローバルコンポーネントに登録します.これにより、importをあちこちで使用する必要はありません.次の3行のコードはrequireです.contextはsvgsの下に動的に導入する.svgの最後のファイルです.ここでは、このコンテキストに基づいてインポートされたsvgsフォルダパスというローカルwebpackコンテキストを生成します.最後にindexでjsはこのファイルを導入すればよい
最後にSvgIconコンポーネントを実装
次に、コンポーネントで使用できます.
実現原理:svgのuseタグを利用して、idを通じて対応するsvgアイコンを参照する
上記のsvgコードでは、htmlページに埋め込まれた2つのアイコンは表示されません.あるアイコンを使用する必要がある場合(id=「icon-close」)を例にとると、htmlページで以下のように参照できます.
まず、すべてのsvgファイルをsvgラベルにパッケージ化し、symbolラベルごとにidを設定します.ここでは、webpackのsvg-sprite-lpaderで実現できます.
{
test: /\.svg$/,
loader: 'svg-sprite-loader',
include: [resolve('src/icons/svgs')],
options: {
symbolId: 'icon-[name]'
}
}
一般的には、アイコンとして使用するsvgファイルをすべてフォルダの下に置き、includeでこのファイルの下のsvgファイルを処理し、この方法で使用する必要のない他のsvgが処理されないようにします.
次に、svgファイルをすべてインポートする方法を考えます.ここではwebpackのrequireを使用します.contextで実現
import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon'
Vue.component('svg-icon',SvgIcon)
let req = require.context('./svgs',false,/\.svg$/)
let importAll = r => r.keys().map(r)
importAll(req)
まず、SvgIconをグローバルコンポーネントに登録します.これにより、importをあちこちで使用する必要はありません.次の3行のコードはrequireです.contextはsvgsの下に動的に導入する.svgの最後のファイルです.ここでは、このコンテキストに基づいてインポートされたsvgsフォルダパスというローカルwebpackコンテキストを生成します.最後にindexでjsはこのファイルを導入すればよい
最後にSvgIconコンポーネントを実装
export default {
name: 'SvgIcon',
props: {
icon: {
type: String,
required: true
},
w: {
type: [Number, String],
default: '20px'
},
h: {
type: [Number, String],
default: '20px'
}
},
computed: {
iconName() {
return '#icon-' + this.icon
}
}
}
次に、コンポーネントで使用できます.