Введение

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

Наконец, я остановился на Meteor для серверной части, React для внешнего интерфейса и Vanilajs ES6 MVC для расширения приложения (это была самая интересная часть). проекта, о нем я расскажу в другом блоге). Сначала все шло хорошо и гладко. Излишне говорить, что React был настолько потрясающим, что я полностью изменил свои мысли при программировании.

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

Предпосылки

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

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

Проблема, с которой я столкнулся

Я могу охарактеризовать проблему одним словом: обслуживаемый.

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

Файл, в котором я закодировал компонент-контейнер, состоял примерно из 700 строк, когда я только что закончил примерно половину работы. Это было явно неприемлемо. Если бы я проигнорировал эту проблему и продолжал писать код, чтобы выполнить работу быстро, это был бы кошмар для сопровождающего/отладчика.

Зная, что это был основной проект моей компании, а это означало, что мы с коллегами будем работать над ним годами, я перестал кодировать функции и начал просматривать код.

Первая попытка

Я посмотрел на все функции контейнера и понял, что их можно разделить на четыре группы:

  • Обязательные функции компонента: getInitialState, getMeteorData, render и т. д.
  • Функции обработчика: все обработчики событий для всех дочерних компонентов контейнера.
  • Вспомогательные функции: функции, помогающие получить необходимые данные для дочерних компонентов контейнера на основе свойств и состояния контейнера. Там функции — это просто чистые функции, они принимают входные данные и производят выходные данные, не касаясь состояния контейнера и не взаимодействуя с сервером Meteor.
  • Логические функции: функции для изменения состояния компонента, вызов методов с сервера. Эти функции вызываются обработчиками событий в ответ на действия пользователя.

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

Каталог контейнера выглядел так:

root
|   ...
|---...
|---poppi:client-container-example-component
    |---client
        |---components
            |---subcomponent1
                |   ...
            |---subcomponent2
                |   ...
            |   ContainerExample.jsx
            |   ContainerExampleContainer.jsx
            |   ContainerExampleHandlers.js
            |   ContainerExampleHelpers.js
            |   ContainerExampleLogicFuncs.js
    |   package.js
|---...

А также код контейнера

ЧИТАТЬ СТАТЬЮ ПОЛНОСТЬЮ ЗДЕСЬ