Używam aplikacji create-react-app. Próbuję wywołać obraz z mojego publicznego folderu z pliku w moim src/components
. Otrzymuję ten komunikat o błędzie.
./src/components/website_index.js Nie znaleziono modułu: próbujesz zaimportować ../../public/images/logo/WC-BlackonWhite.jpg, który znajduje się poza katalogiem src / projektu. Względne importowanie poza src / nie jest obsługiwane. Możesz przenieść go do src / lub dodać do niego dowiązanie symboliczne z node_modules / projektu.
import logo from '../../public/images/logo_2016.png';
<img className="Header-logo" src={logo} alt="Logo" />
Przeczytałem wiele rzeczy, w których napisano, że możesz wykonać import do ścieżki, ale to nadal nie działa dla mnie. Każda pomoc byłaby bardzo mile widziana. Wiem, że jest wiele takich pytań, ale wszystkie mówią mi, żebym zaimportował logo lub obraz, więc wyraźnie brakuje mi czegoś w dużym obrazie.
źródło
../public/images/logo_2016.png
dwukrotnie przejść do góry, najpierw z folderu komponentów, a następnie z folderu src.public
folder znajduje się bezpośrednio w twoimsrc
folderze. Twój komentarz bez komentarza zawiera starą ścieżkę zaczynającą się od,../..
więc nie wiesz, o co ci chodzi?Odpowiedzi:
Jest to specjalne ograniczenie dodane przez twórców aplikacji create-react-app. Jest zaimplementowany w
ModuleScopePlugin
aby zapewnić, że pliki znajdują się wsrc/
. Ta wtyczka zapewnia, że względne importy z katalogu źródłowego aplikacji nie sięgają poza nią.Możesz wyłączyć tę funkcję, ale dopiero później
eject
uruchomieniu projektu create-re-app.Większość funkcji i ich aktualizacje jest ukryta w wewnętrznych elementach systemu tworzenia i reagowania. Jeśli sprawisz, że
eject
nie będziesz już mieć niektórych funkcji i ich aktualizacji. Więc jeśli nie jesteś gotowy do zarządzania i konfigurowania dołączonej aplikacji do konfigurowania webpacka i tak dalej - nie wykonujeject
operacji.Graj według istniejących zasad (przejdź do źródła). Ale teraz możesz już wiedzieć, jak usunąć ograniczenie: zrób
eject
i usuńModuleScopePlugin
z pliku konfiguracyjnego pakietu internetowego .Ponieważ tworzenie reagują app v0.4.0 o
NODE_PATH
zmiennej środowiska pozwala określić drogę absolutnej importu. A ponieważ wersja 3.0.0NODE_PATH
jest przestarzała, na korzyść ustawieniabaseUrl
wjsconfig.json
lubtsconfig.json
.Bezwzględny import umożliwia użycie
import App from 'App'
zamiast tegoimport App from './App'
względem wartości określonej w podstawowym adresie URL.Ta funkcja jest szczególnie przydatna w przypadku monorepos lub innych pytań konfiguracyjnych, ale nie do importowania obrazów lub czegokolwiek innego z
public
folderu.Zawartość
public
folderu zostanie umieszczona wbuild
folderze i będzie dostępna według względnego adresu URL. Ponadto wszystko zaimportowane zostanie przetworzone przez webpack i zostanie również umieszczone wbuild
folderze.Jeśli zaimportujesz coś z
public
folderu, prawdopodobnie zostanie to zduplikowane w plikubuild
folderze i będzie dostępne pod dwoma różnymi adresami URL (lub różnymi sposobami ładowania), co ostatecznie pogorszy rozmiar pobieranego pakietu.Importowanie z folderu src jest preferowane i ma zalety. Wszystko zostanie zapakowane w paczkę internetową do pakietu z kawałkami o optymalnym rozmiarze i dla najlepszej wydajności ładowania .
Istnieją rozwiązania pośrednie, a mianowicie system rewire , który pozwala programowo modyfikować konfigurację webpacka. Ale usunięcie ten
ModuleScopePlugin
plugin nie jest dobry rozwiązaniem; lepiej jest dodać w pełni działające dodatkowe katalogi podobne dosrc
.Obecnie
create-react-app
nie obsługuje dodatkowych katalogów pozasrc
folderem głównym. Można to zrobić za pomocą reagowania na alias aplikacji-rewireźródło
create-react-app
dla tych, którzy nie chcą wysuwać konfiguracji webpacka. Osobiście zawsze wyrzucam, ale niektórzy ludzie nie czują się jeszcze komfortowo, majstrując przy zniechęcającej konfiguracji webpaków.NODE_PATH=./src/..
w.env
pliku. W ten sposób możesz importować spoza folderu src bez przechodzenia przez ból związany z wysuwaniem aplikacji.Do usunięcia wtyczki można użyć pakietu reaguj-app-rewired . W ten sposób nie musisz wysuwać.
Postępuj zgodnie z instrukcjami na stronie pakietu npm (zainstaluj pakiet i odwróć wywołania w pliku package.json) i użyj
config-overrides.js
pliku podobnego do tego:Spowoduje to usunięcie ModuleScopePlugin z używanych wtyczek WebPack, ale resztę pozostawi bez zmian i wyeliminuje konieczność wysuwania.
źródło
react-app-rewired
z [ github.com/arackaf/customize-cra](customize-cra) . Wtedy konfiguracja użyje tylkobabelInclude([path.resolve('src'), path.resolve('../common')])
iremoveModuleScopePlugin()
.config-overrides.js
plik, w którym możesz umieścić kod.ModuleScopePlugin
wtyczki nie jest dobrym pomysłem. Lepiej jest dodać w pełni działające dodatkowe katalogi, podobnie jaksrc
przyAby zaoferować trochę więcej informacji na temat odpowiedzi innych osób. Masz dwie opcje dotyczące sposobu dostarczenia pliku .png do użytkownika. Struktura pliku powinna być zgodna z wybraną metodą. Dwie opcje to:
Skorzystaj z modułu system (
import x from y
) dostarczonego z aplikacją react-create-i dołącz ją do swojego JS. Umieść obraz wewnątrzsrc
folderze.Podaj go z
public
folderu i pozwól Node udostępnić plik. create-react-app również najwyraźniej zawiera zmienną środowiskową, np<img src={process.env.PUBLIC_URL + '/img/logo.png'} />;
. Oznacza to, że możesz odwołać się do niego w swojej aplikacji React, ale nadal możesz go obsługiwać przez Node, z przeglądarką pytającą o to osobno w normalnym żądaniu GET.Źródło: aplikacja create-react-app
źródło
Jeśli twoje obrazy znajdują się w folderze publicznym, powinieneś użyć
w twoim
<img>
src
zamiast importowaniaTo zadziała
źródło
<img src="...">
pozwoliłem sobie wyjaśnić, że mówisz o ścieżce , a nie importujesz ją<img src="/images/logo.png" alt="Logo" />
Musisz przenieść się
WC-BlackonWhite.jpg
do swojegosrc
katalogu.public
Katalog dla plików statycznych, który będzie połączony bezpośrednio w kodzie HTML (takich jak favicon), a nie rzeczy, które masz zamiar importować bezpośrednio do wiązki.źródło
Jest kilka odpowiedzi, które dostarczają rozwiązań
react-app-rewired
, alecustomize-cra
eksponują specjalneremoveModuleScopePlugin()
API, które jest nieco bardziej eleganckie. (To to samo rozwiązanie, ale wyodrębnione przezcustomize-cra
pakiet).npm i --save-dev react-app-rewired customize-cra
package.json
config-overrides.js
źródło
Usuń go za pomocą Craco:
źródło
To ograniczenie zapewnia, że wszystkie pliki lub moduły (eksporty) znajdują się w
src/
katalogu, w którym znajduje się implementacja./node_modules/react-dev-utils/ModuleScopePlugin.js
, w kolejnych wierszach kodu.Możesz usunąć to ograniczenie przez
eject
później usunąćModuleScopePlugin.js
z katalogu.const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');
z./node_modules/react-scripts/config/webpack.config.dev.js
PS: uważaj na konsekwencje wyrzucenia .
źródło
zainstaluj te dwa pakiety
package.json
config-overrides.js
źródło
Nie musisz wysuwać, możesz modyfikować
react-scripts
konfigurację za pomocą biblioteki rescriptsTo zadziałałoby wtedy:
źródło
Myślę Lukas Bach rozwiązanie do użytku reagują-app-Rewired w celu zmodyfikowania WebPack config to dobra droga, jednak ja nie wyklucza cały ModuleScopePlugin ale zamiast białej listy konkretny plik, który może być importowany z zewnątrz src:
config-overrides.js
źródło
Obraz w folderze publicznym
źródło
Jeśli potrzebujesz tylko zaimportować pojedynczy plik, taki jak README.md lub package.json, możesz to jawnie dodać do ModuleScopePlugin ()
config / paths.js
config / webpack.config.dev.js + config / webpack.config.prod.js
źródło
najlepszym rozwiązaniem jest rozwidlenie
react-scripts
, jest to faktycznie wspomniane w oficjalnej dokumentacji, patrz: Alternatywy dla wyrzucaniaźródło
Jeśli potrzebujesz wielu modyfikacji, na przykład podczas korzystania z projektowania Ant , możesz połączyć wiele funkcji, takich jak:
źródło
Dodając do odpowiedzi Bartka Maciejiczka, tak to wygląda z Craco:
źródło