El proyecto Vue presenta y usa svg
Con el aumento de las páginas del proyecto, el icono svg de la biblioteca de la interfaz de usuario es gradualmente insuficiente. Así que la interfaz de usuario proporcionó muchos iconos nuevos de svg. Obviamente, no es práctico introducirlos uno por uno, por lo que colocan el svg en la 指定
carpeta y luego los importan en lotes y utilizan este montón de svg a través de los componentes.
Estructura del proyecto
|--build
| `-- webpack.base.js
`--src
`-- assets
`-- icons
|-- index.js
`-- svg
`-- 全部的svg图标 `xxx.svg`
Probablemente la estructura del directorio sea la siguiente, porque es escribir su propia configuración de paquete web, inferior diría vue.config.js
que cómo transformar
todos los iconos svg en la assets/icons/svg
carpeta. assets/icons/index.js
¿Es nuestro archivo de entrada importado?
Importar dinámicamente todos los svg
- assets / icons / index.js
const requireAll = requireContext => requireContext.keys().map(requireContext)
const req = require.context('./svg', false, /\.svg$/)
requireAll(req)
El documento index.js es introducir
./svg
todos los.svg
archivos de directorio , use requireAll introducido, uno necesitaría introducirlo manualmente
Crea componentes, usa svg
Solo svg recursos en el directorio de activos, seguido del nuevo ensamblado, por lo que en src/components
el directorio, cree un nuevo SvgIcon.vue
componente
- src / components / SvgIcon.vue
<template>
<svg class="svg-icon" aria-hidden="true" v-if="iconName">
<use :xlink:href="iconName" />
</svg>
</template>
<script>
import '../assets/icons/index'
export default {
name: 'SvgIcon',
props: {
name: {
default: '',
type: String
}
},
computed: {
iconName() {
let name = this.name
if (name) {
return `#icon-${name}`
} else {
return '#icon-icon'
}
}
}
}
</script>
Preste atención al código de la línea 8 e introduzca el archivo js correspondiente. Así que cuando registremos el componente, automáticamente introduciremos el icono correspondiente.
Presta atención a la línea 21
#icon-${name}
que explicaré más adelante.
Modificar la configuración del paquete web
Los componentes están listos, pero el paquete web solo reconoce archivos js, por lo que tenemos que encontrar los complementos correspondientes que admitan svg svg-sprite-loader
npm i svg-sprite-loader -D
La configuración del paquete web del proyecto
Si tiene un paquete web de configuración autodefinido, busque module.rules
agregar un svg de procesamiento:
- webpack.config.js
svgoConfig es el contenido personalizado de mi proyecto, solo como referencia, opcional a pedido
En segundo lugar, si la configuración de svg entra en conflicto con otras bibliotecas (como iview), configuré solo designado
/src/assets/icons
para hacer la conversión, y el resto queda paraurl-loader
tratarDado que svg-sprite-loader ha procesado la carpeta especificada,
url-loader
debe repetir el proceso (para comprender esta parte de la configuración de las funciones principales del efecto es la misma)De esta manera, el svg original del proyecto puede procesarse sin verse afectado, y el complemento también procesa el icono svg recién agregado.
var svgoConfig = JSON.stringify({
plugins: [
{
removeTitle: true },
{
convertColors: {
shorthex: true } },
{
convertPathData: true },
{
cleanupAttrs: true },
{
removeComments: true },
{
removeDesc: true },
{
removeUselessDefs: true },
{
removeEmptyAttrs: true },
{
removeHiddenElems: true },
{
removeEmptyText: true }
]
})
module: {
rules: [
{
test: /.*\.svg$/,
loaders: [
{
loader: 'svg-sprite-loader',
options: {
symbolId: 'icon-[name]'
}
},
'svgo-loader?' + svgoConfig
],
include: [
// 处理不了 iview 的字体,所以只处理本地svg
resolve('/src/assets/icons')
]
},
{
test: /\.(woff2?|eot|ttf|otf|svg)(\?.*)?$/,
loader: 'url-loader',
options: {
publicPath: '../../',
limit: 10000,
name: utils.assetsPath('fonts/[name].[ext]?[hash:7]')
},
exclude: [resolve('/src/assets/icons')] // 已经交由 svg-sprite-loader 处理,就排除指定文件夹
}
]
}
Configuración de vue-cli
Documento de configuración de vue-cli
Del mismo modo, vue-cli tiene por defecto el procesamiento del complemento svg, por lo que la primera src/assets/icons
exclusión
Luego, a través del svg-sprite-loader para configurar el icono de procesamiento
module.exports = {
chainWebpack(config) {
config.module
.rule('svg')
.exclude.add(resolve('src/assets/icons'))
.end()
config.module
.rule('icons')
.test(/\.svg$/)
.include.add(resolve('src/assets/icons'))
.end()
.use('svg-sprite-loader')
.loader('svg-sprite-loader')
.options({
symbolId: 'icon-[name]'
})
.end()
}
}
El misterio del nombre del icono
Puede ver si es la configuración del paquete web o la configuración de vue-cli, hay un período en la icon-[name]
configuración options.symbolId . Es por eso que identificamos los componentes clave de los que, al final, svg usa, por lo que aquí se icon-
necesitan y devuelven componentes del #icon-${name}
mismo formato.
Si no desea llamarlo icon-xxx
, recuerde cambiar los componentes y la configuración del paquete web tuvo que sincronizar las modificaciones.
Usar componente svg
Los pasos para introducir componentes no están escritos. El uso es el siguiente:
ejemplo es el nombre de archivo del svg, el archivo es el siguiente: assets/icons/svg/example.svg
<svg-icon name="example" />
De esta manera, puede usar el svg personalizado felizmente.