J'ai créé un projet Vuejs en utilisant @ vue/cli version 3.0.0-beta.16 et dans mon composant de fichier unique Home.vue, je souhaite importer et ajouter un SVG en ligne dans le modèle, mais j'ai du mal à le faire.
Le problème est vue cli utilise déjà l'extension de fichier .svg pour le chargeur de fichiers comme ceci:
webpackConfig.module
.rule('svg')
.test(/\.(svg)(\?.*)?$/)
.use('file-loader')
.loader('file-loader')
.options({
name: getAssetPath(options, `img/[name].[hash:8].[ext]`)
})
J'ai déjà essayé d'utiliser le plugin html-loader pour inclure svg dans le modèle et cela fonctionne très bien si j'efface l'utilisation par défaut de svg dans mon vue.config.js et ajoute mon propre chargeur comme ceci:
// vue.config.js
chainWebpack: config => {
const svgRule = config.module.rule('svg')
// clear all existing loaders.
// if you don't do this, the loader below will be appended to
// existing loaders of the rule.
svgRule.uses.clear()
// add replacement loader(s)
svgRule
.test(/\.(svg)$/)
.use('html-loader')
.loader('html-loader')
.options({
})
}
et dans mon modèle:
// Home.vue
<div v-html="require('./../assets/inline.svg')"></div>
Mais le problème est qu'il remplace également svg src dans les balises <img />
Par du code svg en ligne. Ce que je veux, c'est utiliser le chargeur de fichiers pour <img src="something.svg" />
Et utiliser le chargeur html pour require('./inline.svg')
. Comment utiliser plusieurs chargeurs pour la même règle dans le webpack? Ou est-ce la bonne approche? Toute aide serait appréciée.
Edit Je pense que le problème est que j'ajoute les deux chargeurs dans le mauvais sens. Voici comment je les ajoute dans mon fichier:
// vue.config.js
svgRule
.test(/\.(svg)$/)
.use('file-loader')
.loader('file-loader')
.options({
name: getAssetPath(options, `img/[name].[ext]`)
})
svgRule
.test(/\.(svg)$/)
.use('html-loader')
.loader('html-loader')
.options({
attrs: ['div:v-html']
})
Vous y êtes presque, dites simplement à Webpack quel chargeur utiliser:
<div v-html="require('html-loader!./../assets/inline.svg')"/>
Vous voudrez peut-être utiliser les deux chargeurs de webpack, mais aussi dire à votre chargeur html de se limiter aux éléments div
avec v-html
avec la syntaxe suivante dans les options du chargeur:
{
attrs: ['div:v-html']
}
Les documents pour le chargeur html sont trouvés ici .
Vous pouvez ajouter un !
dans l'expression require pour "remplacer" les chargeurs existants configurés par la configuration du webpack.
<div v-html="require('!html-loader!./../assets/inline.svg')"></div>
Cela fonctionnera sans modification de vue.config.js
(tant que html-loader est installé)
De plus, au lieu d'utiliser html-loader, regardez dans svg-inline-loader in peut ajouter des hachages aux classes et aux identifiants, vous n'avez donc pas à vous soucier des collisions de noms si vous avez plusieurs svgs en ligne sur votre page.