Poprawna ścieżka do img w React.js

143

Mam problem z moimi obrazami w moim projekcie React. Rzeczywiście, zawsze myślałem, że ścieżka względna do atrybutu src została zbudowana na architekturze plików

Tutaj moja architektura plików:

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

Jednak zdałem sobie sprawę, że ścieżka jest zbudowana na adresie URL. W jednym z moich komponentów (na przykład do pliku1.jsx) mam to:

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

Jak można rozwiązać ten problem? Chcę, aby w dowolnej formie tras obsługiwanych przez router reagujący wszystkie obrazy mogły być wyświetlane z tą samą ścieżką.

onedkr
źródło
1
po prostu wskaż bezpośrednio obraz, nie używaj ../ cokolwiek
omarjmh
4
Musisz użyć require. Przeczytaj tę odpowiedź na SO, aby uzyskać więcej informacji.
dzisiaj
Mam nadzieję, że ta odpowiedź pomoże ci
Reagować na

Odpowiedzi:

78

Używasz względnego adresu URL, który jest względny w stosunku do bieżącego adresu URL, a nie systemu plików. Możesz rozwiązać ten problem, używając bezwzględnych adresów URL

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

Ale to nie jest dobre w przypadku wdrażania na www.moja-domena.bike lub w jakiejkolwiek innej witrynie. Lepiej byłoby użyć adresu URL względem katalogu głównego witryny

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

prekolna
źródło
2
Dziękuję, chciałbym podkreślić, /że poprzedza details(vs ./details, itp., Dla innych, którzy mogą połączyć te dwa elementy).
user1322092
1
Nawet dla mnie to nie działa. Używam reactjsz cordovai stosując ES5jako eslint
Jimit Patel
Chociaż zarówno to, jak i rozwiązanie Claireablani działają, to claireablani jest tym, co zaleca dokumentacja aplikacji create-react-app. Wymieniają szereg korzyści wynikających z publicznego udostępnienia zasobów facebook.github.io/create-react-app/docs/…
Athir Nuaimi
@ user1322092 ma rację. Pamiętaj, że to /images/popcorn.pngi nie ./images/popcorn.png. Pracował dla mnie ze wszystkimi trasami i takimi rzeczami.
Nuhman
347

W przypadku create-react-appścieżek względnych obrazy nie działają. Zamiast tego możesz zaimportować obraz:

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

class Nav extends Component { 
    render() { 
        return ( 
            <img src={logo} alt={"logo"}/> 
        )  
    }
}
claireablani
źródło
22
A co z dynamicznymi obrazami, na przykład, do których odwołuje się plik json, w aplikacji create-react-app?
zok
2
@zok Myślę, że wyeksportujesz zmienną z pliku JSON, zaimportujesz zmienną do swojego komponentu. Następnie możesz jak zwykle odwołać się do niego. np. eksportuj const my_src = zmienna_tutaj, zaimportuj {my_src} z mojego_pliku i src = {my_src}.
claireablani
1
import './styles/style.less'; **import logo from './styles/images/deadline.png';**Otrzymuję błąd w module drugiej linii nie znaleziono, podczas gdy obraz istnieje, a ścieżka jest poprawna.
Hitendra
Ta metoda jest również potwierdzona przez Survive.js, jeśli chcesz rzucić okiem na jedną z podstawowych metod autora webpacka. Wspomina również, że możesz użyć babel-plugin-transform-aware-jsx-img-import, aby obejść konieczność importowania obrazu za każdym razem, gdy odwołujesz się do obrazu.
Andre
2
Nie to, że rozwiązuje problem tylko obraz, ale nie rozwiązuje problemu ścieżki .. odpowiedź Dima Gershman”jest rzeczywistym reagować rozwiązanie na drodze jakiegokolwiek img plików lub inny
Sami
138

Jeśli utworzyłeś swój projekt za pomocą aplikacji create-react-app, Twój folder publiczny jest dostępny. Musisz więc dodać swój imagefolder do folderu publicznego.

public / images /

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

Rubel Hasan
źródło
Już miałem zadać pytanie, ale TA odpowiedź rozwiązała mój problem !!! Powinien zostać oznaczony jako odpowiedź. Dzięki!!! +1
Si8,
U mnie to zadziałało. Pamiętaj tylko, że musisz ponownie uruchomić aplikację, jeśli dodałeś nowy obraz do katalogu publicznego.
awasik
To rzeczywiście szybki sposób radzenia sobie z sytuacjami, ale zadziała tylko wtedy, gdy nie potrzebujesz względnych adresów URL. Np. Jeśli udostępniasz swoją aplikację pod adresem www.example.com/react-app, folder publiczny będzie widoczny w witrynie www.example.com bez react-app. Może to być kłopotliwe, więc przyjęta odpowiedź jest prawidłowa. Źródła: dodawanie zasobów i korzystanie z folderu publicznego
Alexandru Pirvu
49

Ze create-react-appnie ma publicznego folderu (z index.html ...). Jeśli umieścisz tam swój „myImage.png”, powiedz w podfolderze img , możesz uzyskać do nich dostęp przez:

<img src={window.location.origin + '/img/myImage.png'} />
Dima G
źródło
5
To powinno być oznaczone jako poprawna odpowiedź, ponieważ jest to w rzeczywistości reakcja na wszystkie typy ścieżek dowolnych plików
Sami
Nie rozumiem, dlaczego uważasz, że to poprawna odpowiedź. Właśnie wypróbowałem tę odpowiedź i odpowiedź Claireblani i odpowiedź Claire zadziałały, podczas gdy to nie zadziałało. Ta odpowiedź działa tylko wtedy, gdy obraz znajduje się w folderze publicznym. Czy moje obrazy powinny znaleźć się w folderze publicznym? @Sami
Maderas
Tak, pierwsza rzecz @ Maderas jest taka, że ​​ta odpowiedź jest taka sama jak zaakceptowana => po prostu usuwając {} i podstawowy adres URL, którego możesz użyć po prostu src = '/ względna ścieżka obrazu' lub src = 'absolutna ścieżka obrazu' Co więcej w tym Odpowiedź jest taka, że ​​zawiera zmienną ścieżkę dla dowolnego obrazu
Sami
Jak dotąd działa na mnie jak urok. Nic innego nie zrobiło! Próbowałem prawie wszystkiego. Dzięki!
Maria Campbell
33
  1. Utwórz folder obrazów w src (/ src / images) i zachowaj w nim swój obraz. Następnie zaimportuj ten obraz do swojego komponentu (użyj ścieżki względnej). Jak poniżej

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

    A potem w twoim komponencie.

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

  2. Innym sposobem jest przechowywanie obrazów w folderze publicznym i importowanie ich przy użyciu ścieżki względnej. W tym celu utwórz folder obrazu w folderze publicznym i zachowaj w nim swój obraz. A następnie w swoim komponencie użyj go jak poniżej.

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

    Obie metody działają, ale pierwsza jest zalecana, ponieważ jest bardziej przejrzysta, a obrazy są obsługiwane przez pakiet sieciowy podczas kompilacji.

Mustkeem K
źródło
2
to mi pomogło :)
Raphael
To nie będzie działać, ukośnik (/) jest wymagane na początku, aby wskazać ścieżkę względną, tak jak: „/images/pitbull-mark.png”
Jeremy Rea
czy wypróbowałeś ten wymieniony w odpowiedzi? To też powinno działać.
Mustkeem K
27

Jeśli obraz jest umieszczony w folderze „src”, użyj następującego:

<img src={require('../logo.png')} alt="logo" className="brand-logo"/>
Sodhi saab
źródło
1
To zadziałało dla mnie. Działa to w przypadku, gdy NIE chcesz przechowywać obrazów w folderze publicznym
Mr_LinDowsMac
13

Niektóre starsze odpowiedzi nie działają, inne są dobre, ale nie wyjaśniają tematu, podsumowując:

Jeśli obraz znajduje się w katalogu „public”

Przykład: \public\charts\a.png

W html:

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

W JavaScript:

Utwórz obraz do nowego obrazu, dynamicznie:

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

Ustaw obraz na istniejący img o identyfikatorze jako „img1”, dynamicznie:

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

Jeśli obraz znajduje się w katalogu „src”:

Przykład: \src\logo.svg

W JavaScript:

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

W jsx:

<img src={logo} /> 
Manohar Reddy Poreddy
źródło
4

Dodanie npm programu ładującego pliki do webpack.config.js zgodnie z jego oficjalną instrukcją użytkowania, taką jak:

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

pracował dla mnie.

Treefish Zhang
źródło
3

Importuj obrazy w swoim komponencie

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

I wywołaj nazwę obrazu na image src = {RecentProjectImage_3} jako obiekt

 <Img src={RecentProjectImage_3} alt="" />
Md. Rana
źródło
2

Znajomy pokazał mi, jak to zrobić w następujący sposób:

„./” działa, gdy plik żądający obrazu (np. „example.js”) znajduje się na tym samym poziomie w strukturze drzewa folderów, co folder „obrazy”.

AdamJSim
źródło
1

Umieść logo w swoim folderze publicznym, np. Public / img / logo.png, a następnie odwołaj się do folderu publicznego jako% PUBLIC_URL%:

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

Użycie% PUBLIC_URL% w powyższym zostanie zastąpione adresem URL publicfolderu podczas kompilacji. publicZ kodu HTML można się odwoływać tylko do plików znajdujących się w folderze.

W przeciwieństwie do „/img/logo.png” lub „logo.png”, „% PUBLIC_URL% / img / logo.png” będzie działać poprawnie zarówno z routingiem po stronie klienta, jak iz publicznym adresem URL innym niż główny. Dowiedz się, jak skonfigurować publiczny adres URL inny niż główny, uruchamiając npm run build.

Sami Start
źródło