Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

1.1K
Visualizações
Libro de cuentos: no se pudo ejecutar 'createElement' en archivos svg usando @svgr/webpack

Mi error en primer lugar es exactamente el mismo que se describe aquí . Estoy usando el paquete @svgr/webpack para importar mis archivos .svg como un componente React así:

 import Shop from './icons/shop.svg' return <Shop />

Funciona bien en mi aplicación, pero cuando traté de hacer lo mismo en Storybook , aparece este error:

Error al ejecutar 'createElement' en 'Documento': el nombre de etiqueta proporcionado ('static/media/shop.61b51e05.svg') no es un nombre válido.

Así que agregué el cargador a mi archivo .storybook/main.js para extender la configuración predeterminada del paquete web de Storybook:

 // ... webpackFinal: async config => { config.module.rules.push({ test: /\.svg$/, enforce: 'pre', loader: require.resolve('@svgr/webpack'), });

El error aún ocurrió, así que traté de anular la prueba predeterminada de Storybook para archivos .svg como se sugiere en la respuesta de la pregunta anterior :

 const fileLoaderRule = config.module.rules.find(rule => { rule.test !== undefined ? rule.test.test('.svg') : '' }); fileLoaderRule.exclude = /\.svg$/;

Pero luego me sale este error:

TypeError: no se puede establecer la propiedad 'excluir' de indefinido

Así que decidí hacer un archivo console.log de rule.test y, curiosamente, las únicas pruebas predeterminadas que provienen de la configuración de Storybook son las tesis:

 { test: /\.md$/, ... } { test: /\.(js|mjs|jsx|ts|tsx)$/, ... } { test: /\.js$/, ... } { test: /\.(stories|story).mdx$/, ... } { test: /\.mdx$/, ... } { test: /\.(stories|story)\.[tj]sx?$/, ... } { test: /\.(ts|tsx)$/, ... }

Como puede ver, no hay ninguna prueba que afecte a un archivo .svg . Entonces, ¿alguien tiene una idea de por qué mi configuración no funciona usando:

 { test: /\.svg$/, enforce: 'pre', loader: require.resolve('@svgr/webpack'), }

La versión de mi libro de cuentos es 6.0.0-beta.3 .

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Su devolución de llamada de find siempre devuelve undefined . Cámbielo para devolver el bool correcto:

 const fileLoaderRule = config.module.rules.find(rule => rule.test && rule.test.test('.svg'));

De todos modos, la configuración predeterminada del libro de cuentos debería tener una regla para las imágenes con esta prueba: /\.(svg|ico|jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|cur|ani|pdf)(\?.*)?$/ . Entonces su código (pero con la devolución de llamada de búsqueda correcta) funciona bien para mí.

main.js final:

 module.exports = { stories: ['../src/**/*.stories.[tj]s'], webpackFinal: config => { // Default rule for images /\.(svg|ico|jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|cur|ani|pdf)(\?.*)?$/ const fileLoaderRule = config.module.rules.find(rule => rule.test && rule.test.test('.svg')); fileLoaderRule.exclude = /\.svg$/; config.module.rules.push({ test: /\.svg$/, enforce: 'pre', loader: require.resolve('@svgr/webpack'), }); return config; } };
over 4 years ago · Santiago Trujillo Relatório

0

Solo impórtalo así:

 import { ReactComponent as Shop } from './icons/shop.svg'

Lo está transformando como un componente React para que pueda pasarle propiedades:

 <Shop fill="tomato" {...args} />
over 4 years ago · Santiago Trujillo Relatório

0

Como estoy usando webpack@4 y, por lo tanto, @svgr/webpack@5 , tuve que usar url-loader .

 module.exports = { stories: ['../src/**/*.stories.@(ts|tsx|js|jsx)'], webpackFinal: config => { // remove svg from existing rule const fileLoaderRule = config.module.rules.find( (rule) => rule.test && rule.test.test('.svg') ) fileLoaderRule.exclude = /\.svg$/ config.module.rules.push({ test: /\.svg$/, use: ['@svgr/webpack', 'url-loader'], }) return config } };
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda