React + TypeScript с проблемой развертывания маршрутизатора на страницах Github

Local работает нормально, но при запуске "npm run deploy" веб-сайт возвращает 404.

У меня есть приложение React + TypeScript, которое использует BrowserRouter для навигации по страницам.

Я осведомлен о проблеме на страницах github с реактивным маршрутизатором, поэтому я попытался добавить basename = {process.env.PUBLIC_URL}, изменить его на HashRouter и многое другое. Я занимаюсь этой проблемой 7 часов подряд ... и, похоже, нет ресурсов по этой конкретной проблеме для Typescript.

Может кто-нибудь мне помочь!

index.tsx

ReactDOM.render(
  <AppRouter />,
  document.getElementById('root') as HTMLElement
);

Router.tsx

export const AppRouter: React.StatelessComponent<{}> = () => {

return (

    <BrowserRouter basename = {process.env.PUBLIC_URL}>
        <div>
            <NavBar />
            <Switch>
                <Route exact = {true} path='/' component = {App} />
                <Route exact = {true} path='/' component = {Notes} />
                <Route exact = {true} path='/About' component = {About} />
            </Switch>  
        </div>
    </BrowserRouter>
);

Также пробовал Router.tsx

export const AppRouter: React.StatelessComponent<{}> = () => {

return (

    <HashRouter>
        <div>
            <NavBar />
            <Switch>
                <Route exact = {true} path='/' component = {App} />
                <Route exact = {true} path='/' component = {Notes} />
                <Route exact = {true} path='/About' component = {About} />
            </Switch>  
        </div>
    </HashRouter>
);

NavBar.tsx

export const NavBar: React.StatelessComponent<{}> = () => {

return (
    <div id='nav-bar'>
        <AppBar position='static' color='default'>
            <Toolbar>
                <span id='navbar-title'>
                    <Typography variant='title' color='default'>
                        Keep
                    </Typography>
                </span>
                <Link to = "/">
                    <Button size = "large" color = "primary" variant = "text">Notes</Button>
                </Link>
                <Link to = "/About">
                    <Button size = "large" color = "primary" variant = "text">About</Button>
                </Link>
            </Toolbar>
        </AppBar>
    </div>
)

Спасибо за чтение.

РЕДАКТИРОВАТЬ ниже - это точный ответ веб-консоли на ошибку 404. Что-то о фавиконе, это может быть проблемой? Расположение совершенно неправильное

json469.github.io/:1 Refused to load the image 'https://json469.github.io/favicon.ico' because it violates the following Content Security Policy directive: "img-src data:".

Я также пробовал отладку, распечатав process.env.PUBLIC_URL, однако он вернул пустую строку ...

EDIT2 ниже - это изменение, внесенное в Router.tsx, которое устранило проблему.

    <HashRouter>
        <div>
            <NavBar />
                <main>
                    <Switch>
                        <Route exact = {true} path='/' component = {App} />
                        <Route exact = {true} path='/' component = {Notes} />
                        <Route exact = {true} path='/About' component = {About} />
                    </Switch>
                </main>
        </div>
    </HashRouter>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
482
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вряд ли это связано с TypeScript или даже с React Router. Если вы получаете 404, это связано с тем, что ваш сервер должен перенаправить пользователя в ваше приложение React, если они посещают маршрут, который сервер не знает, и ваше приложение может затем сделать вид, что выполняет фактическую маршрутизацию.

Однако похоже, что GitHub Pages не поддерживает это. Таким образом, вы не можете использовать «правильные» URL-адреса, такие как username.github.io/page/some-route. Как вы упомянули, обходным путем является использование Hash Router, но это означает, что URL-адреса будут выглядеть как username.github.io/page#/some-route.

Таким образом, ваша проблема, вероятно, в том, что вы пробуете первый путь, а не второй. Чтобы решить эту проблему, вы можете попробовать такой маршрут или перейти на другой хост.

Спасибо за выявление проблемы! Я пробовал HashRoute, но мне все равно не повезло. Будет ли что-то еще, что мне нужно будет изменить из второго кода Router.tsx? Поскольку это был метод HashRoute, который я пробовал, но все равно получил 404 :(

Jesse 13.11.2018 22:02

@Jesse Было бы полезно, если бы вы могли показать нам, какой маршрут вы пробовали, который дает вам 404. Если вы используете HashRouter, по крайней мере, вы должны оказаться на своей индексной странице, а не на странице GitHub 404.

Vincent 15.11.2018 07:03

@ Джесси О, я только что видел твою правку. Если вы видите только 404 в своей консоли, это потому, что браузеры автоматически пытаются получить /favicon.ico, если он не определен, - не о чем беспокоиться. Если вы хотите узнать об этом больше, см. en.wikipedia.org/wiki/Favicon. Теперь, когда вы также разместили свое имя пользователя GitHub, я вижу, что ваше приложение также не находится на GitHub: github.com/json469/json469.github.io Не могли бы вы показать свой package.json и результат при запуске npm run deploy?

Vincent 15.11.2018 07:08

Уточнение проблемы вне TS было для меня хорошим началом! Мне удалось начать все заново и заставить его работать с HashRoute. Я считаю, что виноват я, когда я как-то неправильно вложил HashRoute? Я обновил изменение, которое заставило его работать. Спасибо за вашу помощь :)

Jesse 16.11.2018 10:03

Приятно слышать, что вы ее решили - я думаю, иногда просто нужно посмотреть на проблему под другим углом :)

Vincent 16.11.2018 12:58

Другие вопросы по теме