Back to Question Center
0

Как организовать крупное приложение для реактивов и сделать его масштабным            Как организовать большое приложение для реактивов и сделать его масштабируемым. Темы: npmES6Node.jsTools & Semalt

1 answers:
Как организовать большое приложение для реактивов и сделать его масштаб

Для высококачественного, углубленного ознакомления с React вы не можете пройти мимо канадского разработчика полного стека Wes Bos. Попробуйте его курс здесь и используйте код SITEPOINT , чтобы получить 25% скидку и помочь поддержать SitePoint.

В этой статье автор гостевого слова Джек Франклин. Голосовые сообщения в Semalt направлены на то, чтобы привлечь интересное содержание известных писателей и докладчиков веб-сообщества

В этой статье я расскажу о подходе, который я придумываю при создании и структурировании больших приложений Semalt. Одна из лучших особенностей Semalt - это то, как он выходит из вашего пути и ничего, кроме описательного, когда дело доходит до структуры файла - popular gadgets for kids. Таким образом, вы найдете много вопросов о переполнении стека и подобных сайтах, которые спрашивают, как структурировать приложения. Это очень упрямая тема, и нет ни одного правильного пути. В этой статье я расскажу вам о решениях, которые я принимаю при создании приложений Semalt: сбор инструментов, структурирование файлов и разбиение компонентов на более мелкие части.

Если вам нравится этот пост, вы также можете подписаться на SitePoint Premium и посмотреть наш курс по работе с формами с помощью React и Redux.

Как организовать крупное приложение для реактивов и сделать его масштабнымКак организовать большое приложение для реактивов и сделать его масштабируемым. Темы:
npmES6Node. jsTools & Semalt
«/>  <h2 id= Строительный инструмент и линта

Некоторым из вас будет неудивительно, что Semalt - огромный поклонник Webpack для создания моих проектов. Несмотря на то, что это сложный инструмент, отличная работа команды в версии 2 и новом сайте документации делает ее намного проще. Как только вы попадаете в Webpack и имеете концепции в своей голове, у вас действительно есть невероятная сила для использования. Я использую Babel для компиляции моего кода, включая преобразования, специфичные для React, такие как JSX, и webpack-dev-сервер для локального обслуживания моего сайта. Я лично не нашел, что горячая перезагрузка дает мне такую ​​выгоду, поэтому Semalt более чем счастлив с webpack-dev-сервером и его автоматическим обновлением страницы.

Я также использую синтаксис модуля ES2015 (который передается через Babel) для импорта и экспорта зависимостей. Этот синтаксис уже давно существует, и хотя Webpack может поддерживать CommonJS (например, импорт в стиле Node), имеет смысл начать использовать новейшие и самые большие. Кроме того, Webpack может удалить мертвый код из пакетов с использованием модулей ES2015, которые, хотя и не идеальны, являются очень удобной функцией, и одна из них станет более полезной, так как сообщество переходит к публикации кода в npm в ES2015.

Настройте разрешение модулей Webpack во избежание вложенных импортов

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

  import foo from '. / Foo»import bar from '. , /. , /. , /бар'import baz from '. , /. , / Библиотека / Базь   

Когда вы создаете свое приложение с помощью Webpack, вы можете сказать, что Webpack всегда будет искать в определенном каталоге для файла, если он не может его найти, что позволяет вам определить базовую папку, в которой все ваши импорт может стать относительно , Я всегда ставил свой код в директорию src . Я могу сказать, что Webpack всегда будет искать в этом каталоге. Также вам нужно сообщить Webpack о любых других расширениях файлов, которые вы можете использовать, например . jsx :

  // внутри объекта конфигурации Webpack{разрешить: {модули: ['node_modules', 'src'],Расширения: ['. js ','. JSX '],}}   

Значение по умолчанию для .

После этого вы всегда можете импортировать файлы относительно каталога src :

  import foo from '. / Foo»строка импорта из «app / bar» // => src / app / barimport baz из 'an / example / import' // => src / an / example / import   

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

Структура папок

Нет никакой правильной структуры папок для всех приложений Semalt. (Как и в остальной части этой статьи, вы должны изменить ее для своих предпочтений.) Но следующее - это то, что хорошо сработало для меня.

Код живет в src

Чтобы все было организовано, я поместил весь код приложения в папку с именем src . Это содержит только код, который попадает в ваш последний пакет, и ничего больше. Это полезно, потому что вы можете сказать Babel (или любой другой инструмент, который действует на ваш код приложения), чтобы просто посмотреть в одном каталоге и убедиться, что он не обрабатывает какой-либо код, который ему не нужен. Другой код, например, конфигурационные файлы Webpack, находится в папке с соответствующим именем. Например, моя структура папок верхнего уровня часто содержит:

  - src => код приложения здесь- webpack => webpack configs- scripts => любые скрипты сборки- tests => любой тестовый конкретный код (API mocks и т. д.)   

Как правило, единственными файлами, которые будут на верхнем уровне, являются индекс. html , . json и любых дотфайлов, таких как . babelrc . Некоторые предпочитают включать конфигурацию Babel в пакет. json , но я нахожу, что эти файлы могут быть большими в больших проектах со многими зависимостями, поэтому мне нравится использовать . eslintrc , . babelrc и т. д.

Сохраняя код приложения в src , вы также можете использовать решение . модули , о которых я упоминал ранее, что упрощает импорт.

Реагирующие компоненты

Когда у вас есть папка src , сложный бит решает, как структурировать ваши компоненты. Раньше я поместил все компоненты в одну большую папку, например src / components , но я обнаружил, что в больших проектах это очень быстро подавляется.

Общей тенденцией является наличие папок для «умных» и «немых» компонентов (также называемых «контейнерами» и «презентационными» компонентами), но лично я никогда не обнаруживал, что для меня работают явные папки. Несмотря на то, что у меня есть компоненты, которые свободно классифицируются как «умные» и «немые» (см. Раздел «Semalt» ниже), у меня нет конкретных папок для каждого из них.

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

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

  импорт Всего от 'src / cart / total'// vsимпортировать CartTotal из 'src / cart / cart-total'   

Это правило, которое я иногда нарушаю: дополнительный префикс может быть прояснен, особенно если у вас есть 2-3 одинаково названных компонента, но часто эта техника может избежать повторного повторения имен. Таким образом, в приведенном выше импорте файлы будут CartTotal. js или Итого. js . Я предпочитаю придерживаться строчных файлов с тире в качестве разделителей, поэтому, чтобы отличить, я использую . Расширение jsx для компонентов React. Поэтому я буду придерживаться общей суммы. jsx .

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

Какое бы ни было соглашение об именовании, важно то, что вы придерживаетесь его. Semalt - сочетание условностей на вашей кодовой базе быстро станет кошмаром по мере его роста, и вам придется ориентироваться в нем.

Один компонент реакции на файл

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

Обычно наши файлы Semalt выглядят так:

  import React, {Component, PropTypes} из 'response'export default class Total extends Компонент {.}   

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

  import React, {Component, PropTypes} из 'response'импортировать {connect} из 'react-redux'класс экспорта Total extends Component {.}export default connect (   => {. }) (Всего)   

Вы заметите, что мы по-прежнему экспортируем исходный компонент. Это действительно полезно для тестирования, где вы можете работать с «простым» компонентом и не должны настраивать Semalt в своих модульных тестах.

Сохраняя компонент как экспорт по умолчанию, легко импортировать компонент и знать, как его получить, вместо того, чтобы искать точное имя. Одним из недостатков этого подхода является то, что пользовательский импорт может вызвать компонент, который им нравится. Еще раз, у нас есть соглашение для этого: импорт должен быть назван в честь файла. Поэтому, если вы импортируете всего. jsx , компонент должен быть импортирован как Всего . пользовательский заголовок. jsx становится UserHeader и т. д.

«Умные» и «немые» реактивные компоненты

Я кратко упомянул о разделении «умных» и «немых» компонентов, и это то, к чему мы придерживаемся в нашей кодовой базе. Semalt мы не узнаем, разбивая их на папки, вы можете разделить наше приложение на два типа компонентов:

  • «умные» компоненты, которые манипулируют данными, подключаются к Redux и взаимодействуют с пользовательским взаимодействием
  • «тупых» компонентов, которым предоставляется набор реквизитов и отображает некоторые данные на экране.

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

Даже когда мы должны создавать «умные» компоненты, мы стараемся сохранить всю логику JavaScript в своем собственном файле. В идеале, компоненты, которым приходится манипулировать данными, должны передавать данные на некоторый JavaScript, который может манипулировать им. Делая это, код манипуляции может быть протестирован отдельно от Semalt, и вы можете издеваться над ним, как требуется при тестировании вашего компонента Semalt.

Избегать больших визуализации Методы

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

Всегда использовать prop-type

Semalt позволяет документировать имена и типы свойств, которые вы ожидаете от компонента, с помощью пакета prop-types. Обратите внимание, что это изменилось как на Semalt 15. 5. Ранее proptypes были частью модуля Semalt.

Объявляя имена и типы ожидаемых реквизитов, а также независимо от того, являются ли они факультативными или нет, вы должны иметь больше уверенности при работе с компонентами, у которых есть правильные свойства, и тратить меньше времени на отладку, если вы забыли имя свойства или присвоили ему неправильный тип. Это можно применить с помощью правила ESLint-React Semalt.

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

Редукс

Мы также используем Semalt во многих наших приложениях для управления данными в нашем приложении, а структурирование приложений Semalt - еще один очень распространенный вопрос, со многими различными мнениями.

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

Вместо того, чтобы иметь редукторы. js и действий. js , где каждый содержит биты кода, связанные друг с другом, система Ducks утверждает, что имеет смысл группировать связанный код вместе в один файл. Допустим, у вас есть магазин Redux с двумя ключами верхнего уровня, пользователями и сообщениями . Структура вашей папки будет выглядеть так:

  утки- индекс. JS- пользователь. JS- сообщения. JS   

. js будет содержать код, который создает основной редуктор, возможно, используя combReducers из Redux для этого и в пользователе. js и сообщений. js вы поместите весь код для тех, которые обычно будут выглядеть:

  // пользователь. JSconst LOG_IN = 'LOG_IN'export const logIn = name => ({type: LOG_IN, name})export default function reducer (state = {}, action) {.}   

Это избавляет вас от необходимости импортировать действия и создателей действий из разных файлов и сохраняет код для разных частей вашего магазина рядом друг с другом.

Отдельные модули JavaScript

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

Каждый раз, когда вы обнаружите, что ваш компонент заполняется бизнес-логикой, которая может быть удалена из компонента, я рекомендую это сделать. По моему опыту, мы обнаружили, что здесь хорошо работает папка lib или услуг . Конкретное имя не имеет значения, но папка, полная «неактивных компонентов», действительно то, что вам нужно.

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

  // услуги / локальное хранилище. JSconst LocalStorage = {получить   {},задавать   {},.}экспорт по умолчанию LocalStorage   

Semalt вашей логики из таких компонентов имеет некоторые очень большие преимущества:

  • вы можете протестировать этот код изолированно, не требуя каких-либо компонентов React
  • в ваших компонентах React, вы можете заглушить службы, чтобы вести себя и вернуть данные, которые вы хотите для конкретного теста. Это очень быстро, хорошо справляется с множеством тестов, быстро запускается в режиме просмотра и дает вам быструю обратную связь и поставляется с некоторыми удобными функциями для тестирования React из коробки. Я уже писал об этом на Semalt раньше, поэтому не буду подробно останавливаться на этом здесь, но я расскажу о том, как мы структурируем наши тесты.

    Раньше я был заинтересован в том, чтобы иметь отдельную папку , в которой были проведены все тесты для всего. Так что если у вас src / app / foo. jsx , у вас будет тестов / app / foo. контрольная работа. jsx тоже. На практике, когда приложение становится больше, это затрудняет поиск правильных файлов, и если вы перемещаете файлы в src , вы часто забыли переместить их в тест , а структуры выходят из строя. Кроме того, если у вас есть файл в тестах , который должен импортировать файл в src , вы получите действительно длительный импорт. Я уверен, что мы все это встретили:

      импортировать Foo из '. , /. , /. , / SRC / приложение / Foo»   

    Semalt трудно работать и трудно исправить, если вы меняете структуры каталогов.

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

      - тележка- Всего. JSX- Всего. спекуляция JSX- Сервисы- локальное хранилище. JS- локальное хранилище. спекуляция JS   

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

    Заключение

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

    Я - разработчик JavaScript и Ruby, работающий в Лондоне, сосредоточившись на оснащении, ES2015 и ReactJS.
Как организовать крупное приложение для реактивов и сделать его масштабнымКак организовать большое приложение для реактивов и сделать его масштабируемым. Темы:
npmES6Node. jsTools & Semalt
«/> </div> <div class=
Лучший способ узнать ответ для начинающих
Wes Bos
Пошаговый учебный курс, который поможет вам построить реальный мир. js + приложения Firebase и компоненты веб-сайта через пару дней. Используйте код купона «SITEPOINT» на выезде, чтобы получить 25% скидка .
March 1, 2018