ReactJS с Django - реальное использование

72

Я немного побеспокоился с React, и мне это очень нравится. Это гораздо более подробный, чем Angular (ng-repeat с | фильтром бесценен), но хорошо.

Вещь, которая меня раздражает, заключается в том, как я должен использовать React с шаблонами Django. Должен ли я помещать все javascript в шаблоны вместе с разметкой "HTML".

Реализация Angular была довольно плавной. Я просто добавил некоторые атрибуты в класс формы /django form, а затем написал javascript в отдельном файле. Включите этот файл и сделайте это.

Как "использовать" реагировать? Каков правильный путь?

Спасибо заранее!

  • 3
    Прямо изо рта лошади: facebook.github.io/react/blog/2013/08/19/…
  • 0
    Спасибо, но я все еще не понимаю, как мне отделить код моего приложения.
Показать ещё 2 комментария

3 ответа

81
Лучший ответ

Поскольку вы хотите использовать React вместе с шаблонами Django, я предполагаю, что код React затронет только определенные части вашей страницы. На основе этого предположения написаны следующие пояснения.

Прежде всего, вам не нужно ставить все JS-код в шаблон - на самом деле это будет беспорядок.

Вы можете создать отдельный процесс сборки на основе JS с помощью Webpack (ознакомьтесь с этим способом). Это улучшает ваши возможности кода на стороне клиента, позволяя вам использовать модули CommonJS в браузере, которые вы можете напрямую извлечь из npm, включая React.

Webpack в свою очередь будет генерировать пакет (или несколько пакетов, в зависимости от характера вашего приложения и конфигурации Webpack), которые вам нужно будет включать в ваши шаблоны Django с помощью тегов <script>, как обычно.

Теперь вам нужно сделать вызов React.render(), чтобы сделать ваше приложение React где-то в существующем макете страницы. Вам нужно будет использовать пустой элемент HTML с определенным именем id/class в качестве точки монтирования для приложения.

Но здесь идет оговорка: вы не можете получить доступ к модулям CommonJS непосредственно из шаблонов браузера или Django. Итак, либо вы,

  • выведите React и ваше приложение в объект window или
  • создать модуль с кодом клей для обработки инициализации приложения и выставить этот метод для объекта window.

В любом случае вам нужно будет вызвать код инициализации непосредственно из шаблонов (проверьте пример кода клея, а вызов для инициализации приложения).

Этот шаг инициализации также позволяет передавать переменные, доступные в шаблонах Django, в JS-код.

Последний шаблон Django будет выглядеть примерно так:

{% load staticfiles %}
{% extends 'base.html' %}

{% block scripts %}
<script type="text/javascript" src="{% static 'path/to/app.bundle.js' %}"></script>
<script type="text/javascript">
  // Initialization glue code
  window.MyApp.init({el: '.app-mountpoint'});
</script>
{% endblock %}

{% block content %}
<!-- Your template contents -->

<!-- The mount point of your app -->
<div class="app-mountpoint" />
{% endblock %}

И код клея:

var React = require('react');

var MyAppComponent = require('MyAppComponent');


window.MyApp = {

  init: function (opts) {
    var mountPoint = document.querySelector(opts.el);

    React.render(<MyAppComponent />, mountPoint);
  }

};

Я знаю, что все это может показаться подавляющим в начале (даже больше по сравнению с несколькими шагами, которые у вас были с Angular), но, поверьте, он окупится в конечном итоге.

Итак, подводя итог:

  • Запись кода React в отдельных файлах JS
  • Используйте Webpack (используя модули CommonJS) для связывания кода React
  • Включить пакет в ваши шаблоны Django
  • Измените код React с помощью кода клея в шаблонах Django
  • 1
    так что в основном история, когда django отображает такие компоненты, как форма или сетка, заканчивается React?
  • 1
    Шаблоны Django ничего не знают о компонентах, которые вы визуализируете с помощью React, и то же самое применяется наоборот. Так, например, React не сможет понять форму, которую вы визуализируете с помощью {{ form.as_p }} , даже если вы добавите атрибуты в поля, как в Angular. В этом контексте форма Django будет служить вам только для проверки стороны сервера данных.
Показать ещё 8 комментариев
8

Что делать, если вы считаете интерфейс и бэкэнд двумя разными независимыми объектами? Я имею в виду следующее:

  • Django должен быть только API и отвечать данными json
  • Интерфейс должен быть только статическими файлами, обслуживаемыми nginx
  • Возможно, вам придется иметь дело с CORS, чтобы обеспечить связь между ними. Один из вариантов заключается в том, чтобы разрешить запросы перед полетом из вашего интерфейса, а другой вариант - настроить прокси-сервер nginx. Это отдельная проблема, и вам нужно найти ее, если вам нужна дополнительная информация.

Я думаю, что эта архитектура позволяет вам разделить вещи и не заниматься их интеграцией. Слишком сложная ситуация в экосистеме frontend/React, поэтому я считаю, что нужно учитывать простоту конфигурации.

Мне также было бы интересно узнать, как процесс развертывания будет искать эту архитектуру (какие инструменты использовать?), поэтому, пожалуйста, добавьте комментарии, если у вас есть предложения, и я обновлю ответ, чтобы предоставить полезную информацию для будущего читатели.

4

Я реализовал нечто похожее на то, что вы просите. Мой интерфейс полностью связан с реакцией, которая скомпилирована с помощью webpack, и мои шаблоны создаются в django.

Итак, я делаю следующее: -

  • Используйте реактивный маршрутизатор и реагируйте на создание кода .jsx/.js.
  • Скомпилируйте с помощью webpack.
  • Используйте django-webpack

Итак, django-webpack работает очень хорошо и помогает вам изолировать компиляцию за пределами django, чтобы заставить мысли работать красиво и масштабируемо.

  • 0
    что вы подразумеваете под "frontend целиком и полностью на Resjj", но "шаблоны создаются в Django"? Если веб-интерфейс целиком и полностью зависит от реагирования, то используете ли вы шаблоны Django вообще? (У меня есть некоторые формы, отрисованные Django, и теперь я пытаюсь использовать DRF, чтобы перевести рендеринг в React. Пытаюсь разобраться с ограниченным количеством информации / документов, доступных в Интернете - следовательно, спрашиваю. Спасибо)
  • 0
    У меня было несколько шаблонов в django, когда я начинал свой проект, но затем я медленно переместил весь интерфейс, чтобы отреагировать на Django Rest в качестве бэкенда. Сейчас я использую шаблоны только для рендеринга на стороне сервера в целях SEO. Если вам нужна помощь в отношении миграции, я бы с радостью помог :)
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню