Как использовать React в нескольких местах на обычном веб-сайте

У меня есть новый веб-сайт, который представляет собой не одностраничное приложение, а веб-сайт, отображаемый на сервере (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.

Поведение ключевого слова "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) для оценки ваших знаний,...
6
0
910
3

Ответы 3

Если вы хотите отображать элементы «вне» вашего элемента 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>

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