ReactJS з Django - реальне використання


74

Я трохи возився з React, і мені це дуже подобається. Це набагато детальніше, ніж Angular (ng-повторення з | фільтром безцінне), але добре.

Річ, яка мене хвилює, полягає в тому, як я повинен використовувати React із шаблонами Django. Чи слід розміщувати весь javascript у шаблонах разом із розміткою "HTML".

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

Як "використати" реакцію? Який правильний шлях?

Спасибі заздалегідь!


3
Прямо з пащі коня: facebook.github.io/react/blog/2013/08/19/…
rnevius

Дякую, але я все ще не розумію, як слід відокремлювати код програми.
n1_

4
ми використовуємо django з реакцією на інтерфейсі. Ми просто використовуємо django для нашого API для відпочинку та інтерфейсу всіх реакцій.
zackify

Ну, це єдиний спосіб, який я можу собі уявити зараз
n1_

Відповіді:


83

Оскільки ви хочете використовувати React разом із шаблонами Django, я припускаю, що код React впливатиме лише на певні частини вашої сторінки. Наступні пояснення написані на основі цього припущення.

Перш за все, вам не потрібно розміщувати весь шаблон JS у шаблоні - насправді це було б безлад.

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

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

Тепер вам потрібно React.render()зателефонувати, щоб зробити програму React десь у існуючому макеті сторінки. Вам потрібно буде використовувати порожній елемент HTML із певним іменем / класом як точку монтування програми.

Але тут є застереження: ви не можете отримати доступ до модулів 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), але, повірте, це довго окупається.

Отже, підсумовуючи:

  1. Напишіть код React в окремі файли JS
  2. Використовуйте Webpack (використовуючи модулі CommonJS), щоб об’єднати ваш код React
  3. Включіть набір у ваші шаблони Django
  4. Візуалізуйте код React, використовуючи клейовий код у шаблонах Django

1
так в основному історія, коли django відображає такі компоненти, як форма або сітка, закінчується React?
n1_

1
Шаблони Django нічого не знають про компоненти, які ви відтворюєте за допомогою React, і те саме стосується і навпаки. Так, наприклад, React не зможе зрозуміти форму, яку ви рендеруєте {{ form.as_p }}, навіть якщо ви додаєте атрибути в поля, як це було б в Angular. У цьому контексті форма Django буде служити вам лише для перевірки сторони сервера даних.
липень

Отже, як писав zackify, у цьому випадку Django - це чистий серверний сервер, який обслуговує дані. Весь логічний шаблон і візуалізація марний, оскільки весь HTML знаходиться в JS (компоненти React). Правда?
n1_

1
Це залежить від вас, але це не обов’язкова наявність 100% коду React для вашої програми Django. Це здебільшого залежить від того, який інтерфейс та взаємодії ви хочете побудувати на стороні клієнта. Як показано вище, можна мати як шаблони Django, так і код React поруч.
липень

1
Це звучить так, як посилання на глобальний об’єкт є неправильним ( window.MyAppабо подібним); переконайтесь, що ви ввели його правильно. Також перед викликом потрібно включити файл сценарію, який визначає код клею.
липень

9

Що, якби ви розглядали інтерфейс та серверну систему як дві різні незалежні сутності? Я маю на увазі наступне:

  1. Django повинен бути лише API і відповідати json-даними
  2. Інтерфейс повинен бути лише статичними файлами, що обслуговуються nginx
  3. Можливо, вам доведеться мати справу з CORS , щоб дозволити спілкування між ними. Одним із варіантів було б дозволити передпольотні запити з вашого інтерфейсу, а іншим варіантом було б встановити проксі-сервер nginx. Це окреме питання, і вам потрібно його шукати, якщо вам потрібна додаткова інформація.

Я думаю, що ця архітектура дозволяє тримати речі окремо і не мати справу з їх інтеграцією. В екосистемі frontend / React справи вже занадто складні, тому я думаю, що потрібно враховувати простоту конфігурації.

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


4

Я реалізував щось подібне до того, про що ви просите. Мій інтерфейс повністю на реакторі, який компілюється за допомогою webpack, а мої шаблони створюються в django.

Тому я роблю наступне: -

  1. Використовуйте response-router та реагуйте на створення коду .jsx / .js.
  2. Скомпілюйте за допомогою webpack.
  3. Використовуйте django-webpack

Отже, django-webpack працює дуже добре і допомагає вам ізолювати компіляцію поза django, щоб отримати думки, які працюють у приємній та масштабованій формі.


що ви маєте на увазі під словом "frontend повністю на реакторах", але "шаблони створюються в Django"? Якщо інтерфейс повністю на реакторі, ви взагалі використовуєте шаблони Django? (У мене є деякі форми, надані Django, і зараз я намагаюся використовувати DRF для переміщення візуалізації до React. Намагаюся зрозуміти ситуацію за допомогою обмеженої інформації / документів, доступних в Інтернеті - отже, запитання. Дякую)
Анупам,

Коли я запускав свій проект, у мене було мало шаблонів у django, але потім я повільно перемістив весь інтерфейс, щоб реагувати на Django Rest як серверну систему. Зараз я використовую шаблони лише для візуалізації на стороні сервера для цілей SEO. Якщо вам потрібна будь-яка допомога щодо міграції, я хотів би допомогти :)
Харкірат Салуя,

Дякую - чи знаєте ви якісь хороші приклади, які демонструють візуалізацію форм Django через DRF та React? Я витрачав значний час на це, але реальний приклад справді допоміг би підтвердити моє розуміння. Є кілька прикладів DRF + React, але я спеціально шукаю такий, який надсилає дані форми через DRF, а React, у свою чергу, робить форму з даними.
Анупам

Я не намагався використовувати форми django з реакцією, тому що виявив, що форма redux дійсно дивовижна та масштабована для мого проекту. Я б настійно рекомендував
додати редукс

1
Шаблони Django не допомагають використовувати SSR. Для цього вам потрібен Node. Насправді немає переваг у використанні шаблонів Django взагалі. Ви можете створити повністю ізольований інтерфейс ReactJS і просто заповнити дані через REST API до / з DRF.
Джеймс,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.