SVG's não renderizam após o buldling com webpack #2088
-
Olá , no meu projeto tenho alguns icones em svg, estou usando o plugin Esta é minha configuração do webpack: const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const path = require('path');
module.exports = {
entry: './src/js/controller.js',
output: {
filename: 'index.js',
path: path.resolve(__dirname, 'dist'),
clean: true,
},
module: {
rules: [
//Parsing Styles
{
test: /\.s[ac]ss$/i,
use: [
// Creates `style` nodes from JS strings
MiniCssExtractPlugin.loader,
// Translates CSS into CommonJS
"css-loader",
// Compiles Sass to CSS
"sass-loader",
],
},
//Parsing Images
{
test: /\.(png|jpe?g|gif|svg)$/i,
use: [
{
loader: 'file-loader',
options: { name: '[path][name].[ext]' },
},
]
},
],
},
plugins: [
new HtmlWebpackPlugin({
template: './index.html',
filename: 'index.html'
}),
new MiniCssExtractPlugin({
filename: 'style.css'
})
]
} Um exemplo de icone que estou incorporando <button class="btn search__btn">
<svg class="search__icon">
<use href="src/img/icons.svg#icon-search"></use>
</svg>
<span>Search</span>
</button> Talvez seja útil mostrar como é a estrutura deste projeto:
Build
|
Beta Was this translation helpful? Give feedback.
Replies: 2 comments 2 replies
-
Se eu não me engano, posso estar falando besteira, mas o Webpack irá carregar no loader somente os assets que forem referenciados dentro da sua aplicação, apontado pelo entrypoint Se teu svg está sendo referenciado no HTML que não é carregado pelo Webpack por não estar dentro de uma aplicação transpilada (ex: chamando direto pelo HTML, mesmo que sendo template pois se não me engano no template ele apenas troca variáveis por apontamentos do build), ele não aplicará a transformação, logo não processará o svg. |
Beta Was this translation helpful? Give feedback.
-
Finalmente consegui resolver, não especifiquei que meus ícones estão em um sprite chamado A Solução não é minha, aqui tem um post com a resposta https://stackoverflow.com/a/56198354/13433225, porem deixo a forma que resolvi o problema seguindo a solução acima Depois de instalar o loader ( ...
{
test: /\.svg$/,
include: /.*_icons\.svg/, //Include é necessário
use: [
{ loader: 'svg-sprite-loader', options: { publicPath: "" }}
]
} Instanciando plugins: [
new SVGSpriteLoader()
] No meu arquivo principal apenas importei meu //Sprite base
import '../img/_icons.svg'; No html é um pouco diferente, é importante notar o "_" no final do nome do arquivo sprite <button class="btn search__btn">
<svg class="search__icon">
<use xlink:href="#_icons_icon-search"></use>
</svg>
<span>Search</span>
</button> Vlww @ninetails pelo apoio |
Beta Was this translation helpful? Give feedback.
Finalmente consegui resolver, não especifiquei que meus ícones estão em um sprite chamado
icons.svg
, não sei exatamente o motivo do webpack não reconhecer esse tipo de método.Para adicionar sprites é necessário o plugin sprite-svg-loader para o webpack, que ficará a cargo de fazer o devido carregamento.
A Solução não é minha, aqui tem um post com a resposta https://stackoverflow.com/a/56198354/13433225, porem deixo a forma que resolvi o problema seguindo a solução acima
Depois de instalar o loader (
yarn add sprite-svg-loader
) ,devemos fazer algumas configurações simples