Ruta correcta para img en React.js

135

Tengo algún problema con mis imágenes en mi proyecto de reacción. De hecho, siempre pensé que la ruta relativa al atributo src se basaba en la arquitectura de archivos

Aquí mi arquitectura de archivos:

components
    file1.jsx
    file2.jsx
    file3.jsx
container
img
js 
... 

Sin embargo, me di cuenta de que el camino se basa en la url. En uno de mis componentes (por ejemplo, en file1.jsx) tengo esto:

localhost/details/2
<img src="../img/myImage.png" /> -> works

localhost/details/2/id
<img src="../img/myImage.png" /> -> doesn't work, images are not displayed

¿Cómo es posible resolver este problema? Quiero que en cualquier forma de rutas manejadas por react-router, todas las imágenes se puedan mostrar con la misma ruta.

onedkr
fuente
1
solo apunta directamente a la imagen, no uses ../ lo que sea
omarjmh
44
Necesitas usar require. Lea esta respuesta en SO para obtener más información.
hoy
Espero que esta respuesta te ayude Reaccionar imágenes locales
mokesh moha

Respuestas:

73

Estás utilizando una URL relativa, que es relativa a la url actual, no al sistema de archivos. Puede resolver esto usando URL absolutas

<img src ="http://localhost:3000/details/img/myImage.png" />

Pero eso no es bueno para cuando se implementa en www.my-domain.bike o en cualquier otro sitio. Mejor sería usar una url relativa al directorio raíz del sitio

<img src="/details/img/myImage.png" />

prekolna
fuente
1
Gracias, enfatizaría lo /que precede details(vs ./details, etc., para otros que pueden combinar los dos).
user1322092
1
Incluso para mí no está funcionando. Estoy utilizando reactjscon cordovay utilizar ES5como eslint
Jimit Patel
Si bien esto y la solución de claireablani funcionan, claireablani es lo que recomiendan los documentos de create-react-app. Enumeran una serie de beneficios sobre poner los recursos en público facebook.github.io/create-react-app/docs/…
Athir Nuaimi
@ user1322092 tiene razón. Recuerda que es /images/popcorn.pngy no ./images/popcorn.png. Me funcionó con todas las rutas y esas cosas.
Nuhman
335

En los create-react-appcaminos relativos para las imágenes no parecen funcionar. En cambio, puede importar una imagen:

import logo from './logo.png' // relative path to image 

class Nav extends Component { 
    render() { 
        return ( 
            <img src={logo} alt={"logo"}/> 
        )  
    }
}
claireablani
fuente
15
¿Qué pasa con las imágenes dinámicas, por ejemplo, referenciadas en un archivo json, en create-react-app?
zok
2
@zok Creo que exportaría la variable del archivo JSON, importaría la variable a su componente. Entonces puedes hacer referencia a él como de costumbre. por ejemplo, exportar const my_src = variable_aquí, importar {my_src} desde my_file y src = {my_src}.
claireablani
1
import './styles/style.less'; **import logo from './styles/images/deadline.png';**Recibo un error en el módulo de segunda línea no encontrado mientras la imagen existe y la ruta es correcta.
Hitendra
Este método también es confirmado por survival.js si desea echar un vistazo a uno de los métodos principales del autor del paquete web. También menciona que puede usar babel-plugin-transform-react-jsx-img-import para evitar tener que importar la imagen cada vez que hace referencia a una imagen.
Andre
2
No es esto, solo resuelve el problema de la imagen, pero no resuelve el problema de la ruta. La respuesta de Dima Gershman es la solución de reacción real para la ruta de cualquier archivo img o de lo contrario
Sami
130

Si usó create-react-app para crear su proyecto, entonces se puede acceder a su carpeta pública. Por lo tanto, debe agregar su imagecarpeta dentro de la carpeta pública.

public / images /

<img src="/images/logo.png" />

Rubel Hasan
fuente
Estaba a punto de hacer una pregunta, pero ESTA respuesta resolvió mi problema. Debe marcarse como respuesta. ¡¡¡Gracias!!! +1
Si8
Funcionó para mi. Solo recuerde que debe reiniciar la aplicación si agregó una nueva imagen al directorio público.
awasik el
De hecho, es una forma rápida de tratar las situaciones, pero funcionará solo si no necesita URL relativas. Por ejemplo, si sirve su aplicación en www.example.com/react-app, la carpeta pública estará expuesta en www.example.com, sin react-app. Esto puede ser problemático, por lo que la respuesta aceptada es la correcta. Fuentes: agregar activos y usar la carpeta pública
Alexandru Pirvu
44

Con create-react-apphay una carpeta pública (con index.html ...). Si coloca su "myImage.png" allí, digamos debajo de la subcarpeta img , puede acceder a ellos a través de:

<img src={window.location.origin + '/img/myImage.png'} />
Dima G
fuente
44
Esto debería marcarse como la respuesta correcta, porque en realidad es la solución de reacción para todo tipo de rutas de cualquier archivo
Sami
No entiendo por qué crees que esta es la respuesta correcta. Acabo de probar esta respuesta y la respuesta de Claireblani y la respuesta de Claire funcionaron mientras que esto no. Esta respuesta solo funciona si la imagen está en la carpeta pública. ¿Deberían ir mis imágenes en la carpeta pública? @Sami
Maderas
Sí, @Maderas lo primero es que esta respuesta es la misma que la aceptada => simplemente eliminando {} y la URL base, puede usar simplemente src = '/ relativa ruta de la imagen' o src = 'ruta absoluta de la imagen' ¿Qué hay más en esto? la respuesta es que se adapta a una ruta variable para cualquier imagen
Sami
Hasta ahora funciona para mí como un encanto. ¡Nada más lo hizo! Y probé casi todo. ¡Gracias!
Maria Campbell
32
  1. Haga una carpeta de imágenes dentro de src (/ src / images) Y mantenga su imagen en ella. Luego importe esta imagen en su componente (use su ruta relativa). Como abajo-

    import imageSrc from './images/image-name.jpg';

    Y luego en tu componente.

    <img title="my-img" src={imageSrc} alt="my-img" />

  2. Otra forma es mantener las imágenes en una carpeta pública e importarlas usando la ruta relativa. Para esto, haga una carpeta de imágenes en una carpeta pública y mantenga su imagen en ella. Y luego, en su componente, úselo como a continuación.

    <img title="my-img" src='/images/my-image.jpg' alt="my-img" />

    Ambos métodos funcionan pero se recomienda el primero porque su forma más limpia y las imágenes son manejadas por webpack durante el tiempo de construcción.

Mustkeem K
fuente
2
esto me ayudó :)
Raphael
Esto no funcionará, se requiere una barra (/) al inicio para indicar la ruta relativa, así: "/images/pitbull-mark.png"
Jeremy Rea
¿Has probado el mencionado en la respuesta? Esto también debería funcionar.
Mustkeem K
26

en mi caso, el siguiente código también funciona.

<img src={require('../logo.png')} alt="logo" className="brand-logo"/>
Sodhi saab
fuente
1
Eso funcionó para mí. Esto funciona en el caso de que NO desee almacenar imágenes en una carpeta pública
Mr_LinDowsMac
13

Algunas respuestas anteriores no funcionan, otras son buenas pero no explican el tema, en resumen:

Si la imagen está en el directorio 'público'

Ejemplo: \public\charts\a.png

En html:

<img id="imglogo" src="/charts/logo.svg" />

En JavaScript:

Crear imagen a nueva img, dinámicamente:

var img1 = document.createElement("img");  
img1.src = 'charts/a.png';  

Establezca la imagen en img existente con id como 'img1', dinámicamente:

document.getElementById('img1').src = 'charts/a.png';

Si la imagen está en el directorio 'src':

Ejemplo: \src\logo.svg

En JavaScript:

import logo from './logo.svg';  
img1.src = logo;  

En jsx:

<img src={logo} /> 
Manohar Reddy Poreddy
fuente
3

Agregando npm de cargador de archivos a webpack.config.js según sus instrucciones de uso oficiales de esta manera:

config.module.rules.push(
    {
        test: /\.(png|jpg|gif)$/,
        use: [
            {
                loader: 'file-loader',
                options: {}
            }
        ]
    }
);

trabajó para mi.

Treefish Zhang
fuente
3

Importar imágenes en su componente

import RecentProjectImage_3 from '../../asset/image/recent-projects/latest_news_3.jpg'

Y llame al nombre de la imagen en la imagen src = {RecentProjectImage_3} como un objeto

 <Img src={RecentProjectImage_3} alt="" />
MD Rana
fuente
2

Un amigo me mostró cómo hacer esto de la siguiente manera:

"./" funciona cuando el archivo que solicita la imagen (por ejemplo, "ejemplo.js") está en el mismo nivel dentro de la estructura de árbol de carpetas que la carpeta "imágenes".

AdamJSim
fuente
1

Coloque el logotipo en su carpeta pública, por ejemplo, en public / img / logo.png y luego consulte la carpeta pública como% PUBLIC_URL%:

<img src="%PUBLIC_URL%/img/logo.png"/>

El uso de% PUBLIC_URL% en lo anterior se reemplazará con la URL de la publiccarpeta durante la compilación. Solo los archivos dentro de la publiccarpeta pueden ser referenciados desde el HTML.

A diferencia de "/img/logo.png" o "logo.png", "% PUBLIC_URL% / img / logo.png" funcionará correctamente tanto con el enrutamiento del lado del cliente como con una URL pública no root. Aprenda a configurar una URL pública no root ejecutando npm run build.

Sami Start
fuente