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ą.


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" />


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"}/> 
        )  
    }
}

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" />


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'} />

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.


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"/>

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} /> 

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.


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="" />

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”.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.