Chemin correct pour img sur React.js

135

J'ai un problème avec mes images sur mon projet react. En effet, j'ai toujours pensé que le chemin relatif dans l'attribut src était construit sur l'architecture des fichiers

Voici mon architecture de fichiers:

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

Cependant, j'ai réalisé que le chemin est construit sur l'url. Dans l'un de mes composants (par exemple dans file1.jsx), j'ai ceci:

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

Comment résoudre ce problème? Je veux que dans toute forme de routes gérées par react-router, toutes les images puissent être affichées avec le même chemin.

onedkr
la source
1
il suffit de pointer directement l'image, ne pas utiliser ../ peu importe
omarjmh
4
Vous devez utiliser require. Lisez cette réponse sur SO pour plus d'informations.
aujourd'hui
J'espère que cette réponse vous aidera à
réagir

Réponses:

73

Vous utilisez une URL relative, qui est relative à l'url actuelle, pas au système de fichiers. Vous pouvez résoudre ce problème en utilisant des URL absolues

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

Mais ce n'est pas génial lorsque vous déployez sur www.my-domain.bike ou sur tout autre site. Mieux vaut utiliser une url relative au répertoire racine du site

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

Prekolna
la source
1
Merci, je voudrais souligner le /qui précède details(vs ./details, etc., pour d'autres qui peuvent confondre les deux).
user1322092
1
Même pour moi, ça ne marche pas. Je me sers reactjsavec cordovaet en utilisant ES5comme eslint
Jimit Patel
Bien que cette solution et celle de claireablani fonctionnent, celle de claireablani est ce que la documentation create-react-app recommande. Ils énumèrent un certain nombre d'avantages par rapport à la mise en public des ressources facebook.github.io/create-react-app/docs/…
Athir Nuaimi
@ user1322092 a raison. Souvenez-vous que ce n'est /images/popcorn.pngpas le cas ./images/popcorn.png. A travaillé pour moi avec tous les itinéraires et tout.
Nuhman
335

Dans create-react-apples chemins relatifs pour les images ne semblent pas fonctionner. Au lieu de cela, vous pouvez importer une image:

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

class Nav extends Component { 
    render() { 
        return ( 
            <img src={logo} alt={"logo"}/> 
        )  
    }
}
claireablani
la source
15
qu'en est-il des images dynamiques, par exemple, référencées dans un fichier json, dans create-react-app?
zok
2
@zok Je pense que vous exporteriez la variable du fichier JSON, importeriez la variable dans votre composant. Ensuite, vous pouvez le référencer comme d'habitude. par exemple, exportez const my_src = variable_here, importez {my_src} depuis mon_fichier et src = {my_src}.
claireablani
1
import './styles/style.less'; **import logo from './styles/images/deadline.png';**J'obtiens une erreur sur le module de 2ème ligne non trouvé alors que l'image existe et que le chemin est correct.
Hitendra
Cette méthode est également confirmée par survivre.js si vous souhaitez jeter un œil à l'une des méthodes de l'auteur principal du webpack. Il mentionne également que vous pouvez utiliser babel-plugin-transform-react-jsx-img-import pour éviter d' avoir à importer l'image chaque fois que vous référencez une image.
Andre
2
Non, cela résout uniquement le problème d'image mais ne résout pas le problème de chemin. La réponse de Dima Gershman est la solution de réaction réelle pour le chemin de n'importe quel fichier img ou autre
Sami
130

Si vous avez utilisé create-react-app pour créer votre projet, votre dossier public est accessible. Vous devez donc ajouter votre imagedossier dans le dossier public.

public / images /

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

Rubel Hasan
la source
J'étais sur le point de poser une question mais CETTE réponse a résolu mon problème !!! Doit être marqué comme réponse. Merci!!! +1
Si8
Cela a fonctionné pour moi. N'oubliez pas que vous devez redémarrer l'application si vous avez ajouté une nouvelle image au répertoire public.
awasik
C'est en effet un moyen rapide de traiter les situations, mais cela ne fonctionnera que si vous n'avez pas besoin d'URL relatives. Par exemple, si vous diffusez votre application sur www.example.com/react-app, le dossier public sera exposé sur www.example.com, sans react-app. Cela peut être gênant, donc la réponse acceptée est la bonne. Sources: ajout d'actifs et utilisation du dossier public
Alexandru Pirvu
44

Avec create-react-appil y a un dossier public (avec index.html ...). Si vous placez votre "myImage.png" là, disons sous le sous-dossier img , alors vous pouvez y accéder via:

<img src={window.location.origin + '/img/myImage.png'} />
Dima G
la source
4
Cela devrait être marqué comme la bonne réponse, car il s'agit en fait d'une solution de reactjs pour tous les types de chemins de tous les fichiers
Sami
Je ne comprends pas pourquoi vous pensez que c'est la bonne réponse. J'ai juste essayé cette réponse et la réponse de Claireblani et la réponse de Claire ont fonctionné alors que ce n'était pas le cas. Cette réponse ne fonctionne que si l'image se trouve dans le dossier public. Mes images doivent-elles aller dans le dossier public? @Sami
Maderas
Oui @Maderas la première chose est que cette réponse est la même que celle acceptée => en supprimant simplement {} et l'url de base, vous pouvez utiliser simplement src = '/ chemin relatif de l'image' ou src = 'chemin absolu de l'image' Quoi de plus dans ce La réponse est qu'il accepte un chemin variable pour n'importe quelle image
Sami
Jusqu'à présent fonctionne pour moi comme un charme. Rien d'autre n'a fait! Et j'ai essayé à peu près tout. Merci!
Maria Campbell
32
  1. Créez un dossier images dans src (/ src / images) et gardez votre image dedans. Importez ensuite cette image dans votre composant (utilisez votre chemin relatif). Comme ci-dessous-

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

    Et puis dans votre composant.

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

  2. Une autre méthode consiste à conserver les images dans un dossier public et à les importer en utilisant un chemin relatif. Pour cela, créez un dossier d'images dans un dossier public et conservez-y votre image. Et puis dans votre composant, utilisez-le comme ci-dessous.

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

    Les deux méthodes fonctionnent, mais la première est recommandée car sa manière plus propre et les images sont gérées par webpack pendant la construction.

Mustkeem K
la source
2
cela m'a aidé :)
Raphael
Cela ne fonctionnera pas, une barre oblique (/) est requise au début pour indiquer le chemin relatif, comme ceci: "/images/pitbull-mark.png"
Jeremy Rea
avez-vous essayé celui mentionné dans la réponse? Cela devrait également fonctionner.
Mustkeem K
26

dans mon cas, le code suivant fonctionne aussi.

<img src={require('../logo.png')} alt="logo" className="brand-logo"/>
Sodhi saab
la source
1
Cela a fonctionné pour moi. Cela fonctionne dans le cas où vous NE
VOULEZ
13

Certaines réponses plus anciennes ne fonctionnent pas, d'autres sont bonnes mais n'expliquent pas le thème, en résumé:

Si l'image est dans le répertoire 'public'

Exemple: \public\charts\a.png

En html:

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

En JavaScript:

Créer une image vers une nouvelle img, dynamiquement:

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

Définissez l'image sur img existante avec l'ID comme 'img1', de manière dynamique:

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

Si l'image est dans le répertoire 'src':

Exemple: \src\logo.svg

En JavaScript:

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

Dans jsx:

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

Ajout du chargeur de fichiers npm à webpack.config.js selon ses instructions d'utilisation officielles comme ceci:

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

travaillé pour moi.

Poisson-arbre Zhang
la source
3

Importez des images dans votre composant

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

Et appelez le nom de l'image sur l'image src = {RecentProjectImage_3} en tant qu'objet

 <Img src={RecentProjectImage_3} alt="" />
Md. Rana
la source
2

Un ami m'a montré comment procéder comme suit:

"./" fonctionne lorsque le fichier demandant l'image (par exemple, "example.js") est au même niveau dans l'arborescence des dossiers que le dossier "images".

AdamJSim
la source
1

Placez le logo dans votre dossier public sous par exemple public / img / logo.png, puis reportez-vous au dossier public en tant que% PUBLIC_URL%:

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

L'utilisation de% PUBLIC_URL% dans ce qui précède sera remplacée par l'URL du publicdossier lors de la construction. Seuls les fichiers à l'intérieur du publicdossier peuvent être référencés à partir du HTML.

Contrairement à "/img/logo.png" ou "logo.png", "% PUBLIC_URL% / img / logo.png" fonctionnera correctement à la fois avec le routage côté client et une URL publique non root. Découvrez comment configurer une URL publique non root en exécutant npm run build.

Sami Start
la source