Router React umożliwia obsługę aplikacji React /arbitrary/route
. Aby to zadziałało, potrzebuję, aby mój serwer wysyłał aplikację React na dowolną dopasowaną trasę.
Jednak serwer webpack nie obsługuje dowolnych punktów końcowych.
Jest tutaj rozwiązanie wykorzystujące dodatkowy serwer ekspresowy. Jak zezwolić serwerowi webpack-dev-server, aby zezwolił na punkty wejścia z routera reagującego
Ale nie chcę uruchamiać innego serwera ekspresowego, aby umożliwić dopasowanie tras. Chcę tylko powiedzieć serwerowi webpack dev, aby dopasował dowolny adres URL i wysłał mi moją aplikację do reagowania. Proszę.
reactjs
ecmascript-6
webpack
react-router
eguneys
źródło
źródło
Odpowiedzi:
Znalazłem najłatwiejsze rozwiązanie, aby dołączyć małą konfigurację:
Znalazłem to odwiedzając: PUSHSTATE WITH WEBPACK-DEV-SERVER .
źródło
--history-api-fallback
devServer: { port: 3000, historyApiFallback: true },
historyApiFallback w oficjalnej dokumentacji dla webpack-dev-server wyjaśnia jasno, w jaki sposób możesz to osiągnąć używając
który po prostu wraca do index.html, gdy trasa nie zostanie znaleziona
lub
źródło
historyApiFallback
webpack-dev-server
jest następcąwebpack-serve
, a nie na odwrót, jak wspomniano na stackoverflow.com/questions/31945763/… .Dodanie publicznej ścieżki do config pomaga webpackowi zrozumieć prawdziwy root (
/
), nawet gdy jesteś na podtrutach, np./article/uuid
Więc zmodyfikuj konfigurację swojego webpacka i dodaj:
Bez
publicPath
zasobów może nie zostać poprawnie załadowany, tylko plik index.html.Przetestowano na Webpack
4.6
Większa część konfiguracji (żeby mieć lepszy obraz):
źródło
historyApiFallback
jakiegoś powodu ta sztuczka zadziałała tylko w przypadku ostatniej części adresu URL./test
zadziała, ale/test/test
da 404.historyApiFallback: {index: '/'}
lubhistoryApiFallback: true
(oba działały dla mnie), ustawieniepublicPath
było również niezbędne w moim przypadku (router 5.2).U mnie tak działa
Praca nad aplikacją do zamieszek
źródło
Moja sytuacja była trochę inna, ponieważ używam kątowego CLI z pakietem webpack i opcji „eject” po uruchomieniu polecenia ng eject . Zmodyfikowałem wyrzucony skrypt npm dla 'npm start' w package.json, aby przekazać flagę --history-api-fallback
źródło
Jeśli zdecydujesz się na użycie
webpack-dev-server
, nie powinieneś używać go do obsługi całej aplikacji React. Powinieneś go używać do obsługi swojegobundle.js
pliku, a także statycznych zależności. W takim przypadku należałoby uruchomić 2 serwery, jeden dla punktów wejścia Node.js, które faktycznie będą przetwarzać trasy i obsługiwać kod HTML, a drugi dla pakietu i zasobów statycznych.Jeśli naprawdę potrzebujesz jednego serwera, musisz przestać używać
webpack-dev-server
i zacząć używać oprogramowania pośredniczącego webpack-dev-middleware na serwerze aplikacji. Będzie przetwarzać pakiety „w locie” (myślę, że obsługuje buforowanie i wymianę modułów na gorąco) i upewnia się, że połączeniabundle.js
są zawsze aktualne.źródło
Możesz włączyć
historyApiFallback
obsługęindex.html
błędu zamiast 404, gdy żaden inny zasób nie został znaleziony w tej lokalizacji.Jeśli chcesz obsługiwać różne pliki dla różnych identyfikatorów URI, możesz dodać podstawowe reguły przepisywania do tej opcji. Plik
index.html
Nadal będzie służył do innych ścieżek.źródło
Wiem, że to pytanie dotyczy serwera webpack-dev-server, ale każdego, kto używa webpack-serv 2.0. z pakietem internetowym 4.16.5 ; webpack-serv zezwala na dodatki. Będziesz musiał stworzyć
serve.config.js
:Odniesienie
Będziesz musiał zmienić skrypt deweloperski z
webpack-serve
nanode serve.config.js
.źródło
Dla mnie miałem kropki "." w mojej ścieżce np.
/orgs.csv
więc musiałem umieścić to w moim webpack confg.źródło
Zgadzam się z większością istniejących odpowiedzi.
Jedną kluczową rzeczą, o której chciałem wspomnieć, jest to, że jeśli napotkasz problemy podczas ręcznego ponownego ładowania stron na głębszych ścieżkach, gdzie zachowuje całą sekcję ścieżki oprócz ostatniej i pinezki w nazwie
js
pliku pakietu, prawdopodobnie potrzebujesz dodatkowego ustawienia (w szczególnościpublicPath
ustawienia ).Na przykład, jeśli mam ścieżkę
/foo/bar
i mój plik pakietu ma nazwębundle.js
. Kiedy próbuję ręcznie odświeżyć stronę, pojawia się komunikat 404, że/foo/bundle.js
nie można znaleźć. Co ciekawe, jeśli spróbujesz ponownie załadować ze ścieżki,/foo
nie zobaczysz żadnych problemów (dzieje się tak, ponieważ obsługuje to rozwiązanie awaryjne).Spróbuj użyć poniższej instrukcji w połączeniu z istniejącą
webpack
konfiguracją, aby rozwiązać problem.output.publicPath
jest kluczowym elementem!źródło