Как заменить% PUBLIC_URL% в приложении React на лазурном веб-сайте

У меня есть приложение для реагирования, которое отлично работает локально, когда я развертываю его в Azure, у меня появляется несколько ошибок 404 в index.html.

Все с тегом% PUBLIC_URL%

Согласно документации, они будут заменены в процессе сборки, но не знаю, как это делается, чтобы при развертывании правильные URL-адреса были помещены на место.

<!doctype html>
<html lang = "en" dir = "ltr">
  <head>
    <meta charset = "utf-8">
    <meta name = "viewport" content = "width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <meta name = "theme-color" content = "#000000">
    <!--
          manifest.json provides metadata used when your web app is added to the
          homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/
    -->
    <link rel = "manifest" href = "%PUBLIC_URL%/manifest.json">
    <link rel = "icon" type = "image/png" sizes = "32x32" href = "%PUBLIC_URL%/favicon.png">
    <link href = "https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700" rel = "stylesheet" async>
    <link async rel = "stylesheet" href = "%PUBLIC_URL%/css/ionicons.min.css">
    <link rel = "stylesheet" href = "https://unpkg.com/[email protected]/style.min.css">
    <link rel = "stylesheet" href = "https://unpkg.com/[email protected]/dist/leaflet.css"
         integrity = "sha512-M2wvCLH6DSRazYeZRIm1JnYyh22purTM+FDB5CsyxtQJYeKq83arPe5wgbNmcFXGqiSH2XR8dT/fJISVA1r/zQ= = "
         crossorigin = "" async/>
    <!--
          Notice the use of %PUBLIC_URL% in the tags above.
          It will be replaced with the URL of the `public` folder during the build.
          Only files inside the `public` folder can be referenced from the HTML.

          Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
          work correctly both with client-side routing and a non-root public URL.
          Learn how to configure a non-root public URL by running `npm run build`.
    -->
    <title>Isomorphic</title>
  </head>
  <body>
    <noscript>
      You need to enable JavaScript to run this app.
    </noscript>
    <div id = "root"></div>
    <!--
          This HTML file is a template.
          If you open it directly in the browser, you will see an empty page.

          You can add webfonts, meta tags, or analytics to this file.
          The build step will place the bundled scripts into the <body> tag.

          To begin the development, run `npm start` or `yarn start`.
          To create a production bundle, use `npm run build` or `yarn build`.
    -->
  </body>
</html>
%PUBLIC_URL% будет заменен фактическим значением в сборке, как вы сказали. Вы уверены, что развертываете файл index.html из каталога build, а не из каталога public?
Tholle 09.11.2018 13:07

У меня есть CI / CD, когда что-то фиксируется в репозитории vsts git, запускается сборка и развертывание, позвольте мне отправить вам несколько снимков экрана

Luis Valencia 09.11.2018 13:09

не уверен, поможет ли этот снимок экрана. screencast.com/t/y279smspa

Luis Valencia 09.11.2018 13:10

тогда конвейер развертывания действительно прост: screencast.com/t/033U0cZHm

Luis Valencia 09.11.2018 13:12
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
9
4
15 372
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это похоже на индексный файл, взятый из public вместо build.

Как сказано в документации, %PUBLIC_URL% заменяется при сборке проекта.

Предполагая, что вы использовали create-react-app, убедитесь, что вы используете npm run build и размещаете файлы из каталога build.

большие вопросы, заменяется ли это чем? есть ли где-нибудь файл параметров, куда я должен поместить этот общедоступный URL-адрес?

Luis Valencia 13.11.2018 23:43

есть свойство homepage, которое вы можете установить внутри package.json, которое указывает, где размещается приложение для реагирования. Если это свойство не установлено, команда сборки предполагает, что приложение размещено в корневом каталоге. Если он установлен и содержит путь после домена, команда сборки заменяет %PUBLIC_URL% на путь. пример: если я установил "homepage": "http://example.com/reactapp/", то %PUBLIC_URL% заменяется на /reactapp, но если "homepage": "http://example.com/"%PUBLIC_URL% просто заменяется пустой строкой.

Smarticles101 13.11.2018 23:57

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

Luis Valencia 14.11.2018 00:16

@LuisValencia, где вы используете npm run build? CI использует скрипт или это просто графический интерфейс?

Smarticles101 14.11.2018 00:18

Я не слишком знаком с Azure, пробовали ли вы использовать задачу «Развертывание службы приложений Azure»? Вы должны иметь возможность обновить значение пакета или папки на этом до $(System.DefaultWorkingDirectory)/build.

Smarticles101 14.11.2018 00:35

Я почувствовал себя очень глупо, когда нашел этот ответ, но вы избавили меня от серьезной головной боли, так что спасибо!

Nick Coad 25.06.2019 07:45
Ответ принят как подходящий

КАК ЗАМЕНИТЬ% PUBLIC_URL%

По умолчанию Create React App создает сборку, если ваше приложение размещено в корне сервера. example.com Если ваш веб-сайт обслуживается не из этого корня (возможно, вы хотите обслуживать его из example.com/relativepath, вы можете переопределить это, указав домашнюю страницу в своем package.json).

"homepage": "http://example.com/relativepath",

Это позволит Create React App правильно определить корневой путь для использования в сгенерированном HTML-файле.

Однако в вашем случае, я думаю, вы получаете ошибку 404, потому что Azure пытается найти index.html (или какой-либо другой index. * С именем). Чтобы исправить это, Azure необходимо знать, как передать предполагаемый маршрут единственному файлу index.html, размещенному в корне сайта. Создайте новый файл с именем web.config внутри папки /site/wwwroot со следующим содержимым:

<?xml version = "1.0" encoding = "UTF-8"?>
<configuration>
   <system.webServer>
      <rewrite>
         <rules>
            <rule name = "React Routes" stopProcessing = "true">
               <match url = ".*" />
               <conditions logicalGrouping = "MatchAll">
                  <add input = "{REQUEST_FILENAME}" matchType = "IsFile" negate = "true" />
                  <add input = "{REQUEST_FILENAME}" matchType = "IsDirectory" negate = "true" />
                  <add input = "{REQUEST_URI}" pattern = "^/(api)" negate = "true" />
               </conditions>
               <action type = "Rewrite" url = "/" />
            </rule>
         </rules>
      </rewrite>
   </system.webServer>
</configuration>

Это скажет Azure переписать все URL-адреса, как если бы они указывали на наш корневой файл, и наше приложение SPA сможет правильно обрабатывать ссылки.

Использованная литература:

Я надеюсь это поможет тебе

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