Как правильно обслуживать индекс create-реагировать на приложение с сервера? - PullRequest
4 голосов
/ 07 января 2020

Я занимаюсь разработкой приложения с помощью create-реакции-приложения, и все идет хорошо, за исключением того факта, что я хотел бы изначально обслуживать index.html из бэкэнда, и у меня возникают проблемы при этом.

Причина, по которой я хочу это сделать, заключается в том, что я могу добавить некоторые пользовательские c Javascript на страницу index.html, а также запускать различные другие запросы, когда пользователь изначально заходит на страницу ( похоже на этого человека )

Таким образом, вместо подключения к localhost:3000 для просмотра приложения, я бы вместо этого подключился к localhost:8080, чтобы сервер обслуживал этот файл index.html. (все остальные ресурсы (js, css, изображения) по-прежнему будут на localhost:3000)

Одна из проблем, возникающих при этом, заключается в том, что теги сценариев не включены в файл index.html по умолчанию, и вместо этого генерируются create-реагировать-приложение. То есть, скажем, это мой index.html файл:

<html lang="en">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
  </head>
  <body>
    <div id="root"></div>
  </body>
</html>

Если я запусту npm start, а затем проверю источник, он будет вместо этого (из-за инъекций во время выполнения CRA, я предполагаю):

<html lang="en">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <link rel="shortcut icon" href="/favicon.ico">
  </head>
  <body>
    <div id="root"></div>
  </body>
  <script src="/static/js/bundle.js"></script><script src="/static/js/0.chunk.js"></script><script src="/static/js/main.chunk.js"></script>
</html>

В результате на сервере я сейчас пытаюсь что-то вроде этого:

#[get("/")]
fn handle_index() {
    let scripts = r#"<script src="https://localhost:3000/static/js/bundle.js"></script>
                     <script src="https://localhost:3000/static/js/0.chunk.js"></script>
                     <script src="https://localhost:3000/static/js/main.chunk.js"></script>"#;

    let index_html = include_str!("../frontend/public/index.html");

    let document = format!(r#"<script type="application/javascript">
                                 window.APP_GLOBALS = { user_id: 5, color: "red" };
                              </script> {}{}"#, data, index_html, scripts);

    return document;
}

Потому что я не уверен ни в каком другом способе внедрения этих тегов скрипта. Похоже, что create-реакции-приложение делает это только для моей localhost:3000 страницы, а не для localhost:8080 страницы.

Кажется, что несколько работает. То есть страница загружается, но есть две проблемы.

  1. Многие URL-адреса ресурсов теперь неверны. Вместо этого они указывают на localhost:8080 вместо localhost:3000, и URL-адрес %PUBLIC_URL% также не работает (я полагаю, это еще один процесс, который больше не происходит)

  2. Девайс websocket с автозагрузкой больше не работает. Это работает, когда я перехожу на localhost:3000, но не localhost:8080. Когда я редактирую файл и сохраняю, страница просто становится белой без ошибок в консоли.

Я думаю, что все эти проблемы связаны с одной и той же причиной: create-react-app обычно препроцессирует файл index.html каким-то образом (преобразование %PUBLIC_URL%, добавление этих тегов сценария, обработка перезагрузки), но он больше не делает этого, когда файл вместо этого возвращается с сервера.

What I'm интересно, как я могу восстановить эту функциональность. По сути, эти теги сценариев и процессы %PUBLIC_URL% происходят без необходимости выполнения этого моим внутренним сервером.

1 Ответ

1 голос
/ 07 января 2020

Когда вы запускаете npm start, вы говорите CRA сделать сборку разработки с использованием веб-пакета. Webpack выполняет всю обработку, которую вы видите, как внедрение скриптов и замена %PUBLIC_URL%. Вы не хотите, чтобы ваш сервер обслуживал index.html в папке public, потому что этот файл не был обработан веб-пакетом. Вместо этого вам нужен бэкэнд для обслуживания вывода сборки веб-пакета.

Конфигурация npm start - это сборка для разработки, которая хороша для разработки, но не для производства. (Кроме того, он не сохраняет свои выходные данные в файловой системе, поэтому вы даже не могли бы обслуживать его из своего бэкэнда, если бы захотели. См. Проблема CRA # 1070 ). Если вы запустите npm run build, вы получите производственную сборку в папке build, которую вы должны обслуживать из своего бэкэнда (а затем сможете делать любые необходимые инъекции).

Недостатком этого является то, что сборка занимает больше времени, она не перестраивается автоматически при изменении файлов внешнего интерфейса, и я не уверен, что ошибки, которые он выдает, столь же полезны, как npm start. Таким образом, вы можете захотеть использовать npm start при разработке внешнего интерфейса и npm run build при тестировании вашего внутреннего интерфейса. Есть также некоторые проекты, такие как patch-package , которые позволят вам сделать вывод сборки npm start в файловой системе, чтобы вы могли его обслуживать, но я не пробовал ни один из них.

Кстати - будьте осторожны, вставляя скрипты в html из своего бэкэнда. Подумайте о том, чтобы установить файлы cookie в своем бэкенде и вместо этого читать их в своем интерфейсе Это безопаснее, проще для отладки и т. Д. c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...