У меня есть новый веб-сайт, который представляет собой не одностраничное приложение, а веб-сайт, отображаемый на сервере (asp.net с использованием Umbraco CMS). Раньше я использовал Angular 1.x на своих веб-сайтах, что легко, потому что вы просто загружаете его с помощью тегов сценария, а код не компилируется.
Недавно я использовал React в SPA, начав с приложения create-react-app, которое заботится о webpack, babel и т. д. За вас и создает единый пакет. Однако я хочу использовать React в нескольких местах на веб-сайте, таких как основной заголовок / меню, контактные формы и т. д., Поэтому имеет смысл создавать несколько пакетов, хотя эти пакеты могут совместно использовать импорт (Moment.js, Formik и т. д.).
На веб-сайте React есть инструкции, показывающие, как включить один скрипт и прикрепить его к элементу на вашем веб-сайте, но нет сложных примеров.
Итак, как мне настроить что-то, что будет переносить все без дублирования кода в пакетах. Нужен ли мне какой-то основной пакет, загруженный на все страницы, и отдельные пакеты для таких вещей, как контактная форма?
Во-вторых, как мне все подключить? В SPA у вас просто есть корневой узел и вы привязываете свое приложение к корневому узлу с помощью response-dom, но если у вас есть мини-части функциональности реагирования, заваленные вашим приложением, тогда вам нужен какой-то мастер-скрипт для привязки всего к правильные элементы?
Любая помощь будет принята с благодарностью, даже если она просто указывает мне направление какого-то шаблонного проекта.
Да, и мне не интересно создавать приложение Next JS с рендерингом на стороне сервера или что-то в этом роде, я думаю, что это может быть слишком сложно для интеграции с CMS.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вы хотите отображать элементы «вне» вашего элемента root приложения реакции, вы можете использовать реагировать порталы. Мы тоже используем этот подход, и все идет хорошо.
Если вы все еще думаете, что хотите, чтобы на одной странице работало несколько приложений mini response, вы можете общаться с ними с помощью ReactDOM.render. По сути, ReactDOM.render можно вызывать несколько раз, он не будет повторно монтировать все приложение, а вместо этого будет запускать обновления и различать дерево реакции (так же, как обычный метод компонентов render).
Фактически, я написал статью с учебником о том, как Интегрируйте React с другими приложениями и фреймворками.
Я также попытался смоделировать этот подход с помощью codeandbox пример
Надеюсь, это поможет.
Я думаю, вы можете сделать один пакет, отображая несколько компонентов в разных местах. Я создал небольшой пример:
import React from "react";
import ReactDOM from "react-dom";
import "./styles.css";
function App() {
return (
<div className = "App">
<h1>Body</h1>
</div>
);
}
function Footer() {
return (
<div className = "App">
<h1>Footer</h1>
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
const footerElement = document.getElementById("footer");
ReactDOM.render(<Footer />, footerElement);
Вы можете поиграть с ним в этом примере песочницы. https://codesandbox.io/s/34nvv4nvy5
В дополнение к приведенному выше ответу вы можете исключить React, ReactDOM и / или React Router (и любые другие зависимости) из своих пакетов и включить их на страницу, чтобы вы не объединяли их X раз. Таким образом, у вас могут быть отдельные файлы ввода для каждого приложения.
webpack.config.js
externals: {
'react': 'React',
'react-dom': 'ReactDOM',
}
index.html
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js" integrity = "sha256-JBRLQT7aJ4mVO0H2HRhGghv/K76c5WzE57wW0Flc6ZY = " crossorigin = "anonymous"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/cjs/react-dom.production.min.js" integrity = "sha256-j2ERTIovDFVe0R+s0etuSiBQ2uxrNE6q0ow/rXxHvLA = " crossorigin = "anonymous"></script>