Возможно ли не иметь жесткий код контекста root для пользователя реакции-маршрутизатора
Поскольку концепция корневого контекста веб-приложения обычно рассматривается как проблема развертывания, а не как проблемы разработки, я хотел бы знать, возможно ли не жестко задавать корневой каталог контекста в исходном коде при использовании React Router для навигации по веб-страницам.
То, что я хотел бы сделать, это развернуть мое веб-приложение с любым корневым контекстом, как указано в дескрипторах развертывания, например, web.xml, без изменения какого-либо исходного кода React.
Ниже приведено продолжение ответа Павла.
Прежде всего, большое спасибо, Пол. Я полностью согласен, что свойство "basename" может быть использовано в этом отношении. И мы можем использовать сценарии сборки для замены "baseName" другими значениями, которые будут соответствовать конечному корневому контексту, указанному дескрипторами развертывания.
Тем не менее, я бы сказал, что это будет скрывать, а не изменять тот факт, что корневой каталог контекста должен быть встроен в исходный код, что концептуально должно быть проблемой развертывания.
Мне очень интересно, почему React Router решил не разрешать путь "/" относительно корня контекста, то есть сопоставлять "/" с " http://host:port/webapp/", или, по крайней мере, предоставлять опцию например,
<Route path="/" relativeToContextRoot="true" …>
В конце концов, трактовка фактической ценности корневого контекста не как задачи разработки является скорее нормой, чем исключением. Будет ли это разумным запросом для отправки в команду React Route?
1 ответ
React Router позволяет указать базовое имя для приложения. Базовое имя будет удалено из пути, а местоположения будут сопоставлены с оставшейся частью пути.
Например, если вы установите базовое имя /mysite
затем запрос /mysite/page-one
будет пытаться соответствовать пути /page-one
против ваших определенных маршрутов.
Установка значения базового имени динамически будет просто вопросом внедрения значения в ваш код таким образом, чтобы ваш код мог получить доступ к этому значению при создании history
экземпляр, который будет использоваться вашим <Router>
,
Одним из возможных решений было бы установить переменную на window
когда вы рендеринг HTML.
<script>
window.__BASENAME__ = '/some/root';
</script>
После этого вы сможете получить доступ к этому значению в своем приложении при создании history
пример.
const BASENAME = window.__BASENAME__ || '/';
const history = useRouterHistory(createHistory)({
basename: BASENAME
});