Последние несколько месяцев я использую технологию под названием Strapi в проекте среднего размера, чтобы сэкономить много времени. Если вы хотите пропустить разделы Что такое…, мой опыт и мои личные за и против, в конце есть TL; DR.

Что такое Страпи?

Если вы не знакомы с этим, Strapi - это CMS с открытым исходным кодом (система управления контентом) с открытым исходным кодом. Это мощная система, которая справляется с множеством монотонных задач, которые может выполнить разработчик приложений, и в то же время предоставляет возможность не разработчикам создавать, редактировать и управлять контентом.

«Без головы» в этом контексте означает, что вы можете использовать любой стек интерфейсных технологий, который вам нравится. Это отличается от чего-то вроде традиционного WordPress, где вы привязаны к интерфейсному стеку (PHP) этого фреймворка.

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

Зачем мне использовать Strapi?

Я думаю, что некоторые из наиболее примечательных функций и атрибутов Strapi:

  • Современный интерфейс управления контентом
  • Поддержка любой модели данных
  • Автоматически созданные конечные точки REST и GraphQL
  • Система плагинов для добавления таких вещей, как электронная почта, аутентификация и авторизация пользователей, управление мультимедиа и документация по API.
  • Возможность использования любым интерфейсом

Лично я использовал одно развертывание Strapi как серверную часть как для мобильного приложения React Native, так и для приложения для управления серверной частью React.

Мой опыт работы со Strapi

Начать работу со Strapi было очень легко, мне потребовалось всего 5 минут, чтобы что-то заработало. Мой опыт в первые несколько недель был очень похож на те первые 5 минут.

Когда мы обнаружили бизнес-требования, я мог обновить модель контента и через несколько минут выполнить операции CRUD над REST и GraphQL для этих новых сущностей. По сравнению с монотонной задачей написания миграций, создания сервисов и контроллеров и подключения общедоступного API для каждого отдельного объекта, это было находкой.

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

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

Что было здорово

В целом, мой опыт работы со Страпи был приятным. Было много областей, в которых у меня было эффективное и удобное время для разработки. Приведенные ниже функции являются некоторыми из этих областей, и в совокупности они, вероятно, сократили мое первоначальное время разработки примерно на 70%. Это абсолютно не все функции, которые предоставляет Strapi, но некоторые из функций, которые я считаю наиболее полезными.

Авто-генерация

Автоматическое создание многих таблиц базы данных, контроллеров, служб, конечных точек REST и типов GraphQL очень полезно. В прошлых проектах я часто переписывал одни и те же несколько фрагментов кода повсюду, каждая модель требует создания, обновления, нескольких методов поиска, а иногда и удаления. Как правило, я писал эти контроллеры индивидуально - при этом придерживаясь DRY, насколько мог, - для поддержки потенциального расширения в будущем.

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

Управление содержанием

Если вы собираетесь использовать автономную систему управления контентом, лучше, ну, управляйте контентом; У Страпи с этим нет проблем. Контроль доступа на основе ролей, медиа-библиотека, в целом приятный пользовательский интерфейс, вот и все. Strapi практически полностью удовлетворяет мои требования к CMS общего назначения.

Аутентификация и авторизация

Если вы выберете Strapi, вы также можете установить плагин Roles & Permissions. Этот плагин делает в значительной степени именно то, что вы ожидаете, с некоторыми оговорками, описанными ниже.

Подобно автоматически сгенерированному коду, это просто то, о чем мне не нужно беспокоиться о переписывании в десятитысячный раз. Кажется, что каждое отдельное приложение требует регистрации, входа в систему, забытого пароля, сброса пароля, единого входа и т. Д. Плагин Roles & Permissions предоставляет стандартные реализации всех этих вещей, а также RBAC (управление доступом на основе ролей), как и вы. можно ожидать от имени плагина. Это не безупречно (например, мне пришлось накатить собственное решение для OAuth на мобильном телефоне), но в целом это здорово.

Эл. адрес

Как и многие другие системы управления контентом, Strapi поддерживает различные электронные письма прямо из коробки - например, вспомните забытый пароль. Конечно, вы можете добавлять разные плагины для разных поставщиков услуг электронной почты, в нашем случае мы используем SendGrid через пакет strapi-provider-email-sendgrid. У меня не было проблем с электронной почтой, и я с нетерпением жду возможности реализовать более настраиваемые транзакционные электронные письма в будущем.

Медиа библиотека

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

Администраторы или пользователи Strapi могут загружать ресурсы, а в случае изображений Strapi будет генерировать несколько версий этого контента разного размера. Как и любой другой контент в системе Strapi, эти активы можно обновлять, удалять и просто управлять ими. В нашем случае мы также используем strapi-provider-upload-aws-s3 для загрузки в выделенную корзину S3 вместо опции дискового хранилища по умолчанию.

Настройка

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

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

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

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

Области для улучшения

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

Поддержка TypeScript

Отсутствие поддержки TypeScript в Strapi чуть не помешало. Сейчас я использую TypeScript практически в каждом проекте JavaScript, который я разрабатываю; Функции безопасности типов и самодокументирования, которые предоставляет TypeScript, неоценимы.

Я не одинок в своем желании поддерживать TypeScript, и команда Strapi хорошо осознает необходимость в ней. Учитывая поверхность API Strapi, я думаю, что это одна из основных областей, в которых им необходимо улучшить. Использование их платформы станет намного проще (и безопаснее) с добавлением типов API и автоматически сгенерированных типов контроллеров, моделей и сервисов.

База данных и перенос данных

Strapi поддерживает несколько разных баз данных с помощью двух разных пакетов, Bookshelf.js (для баз данных SQL) и Mongoose (для mongodb). Они также предоставляют оболочку для этих двух пакетов для общих простых операций CRUD.

Для ясности, когда я упоминаю «простые операции CRUD», я имею в виду следующее: create, update, delete, findOne и findMany. Иногда есть несколько других, например search или count, но я обычно говорю о первых пяти.

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

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

Плагин GraphQL

Для меня поддержка GraphQL была очень желанной функцией. Взаимодействие с GraphQL API из клиентского приложения намного приятнее, чем взаимодействие с традиционным REST API. Хотя в целом это хорошо, я думаю, что у плагина GraphQL есть пути, которые нужно пройти, прежде чем он станет беспроблемным.

Одной из самых неприятных вещей в плагине GraphQL было то, как он взаимодействовал с плагином аутентификации и пользовательскими контроллерами. Если вы напишете свои контроллеры так, как их предоставляют примеры - вызывая метод объекта context для возврата стандартных ошибок и сообщений HTTP, - вы обнаружите, что эти ошибки не отображаются автоматически через GraphQL. Фактически, эти ошибки полностью скрывают несоответствие типов между вашим типом GraphQL и тем, что возвращает контроллер. Проблема в том, что плагин GraphQL ожидает появления throw для сообщения об ошибках, тогда как REST API легко обрабатывает способ написания примеров контроллеров. Вы должны убедиться, что для каждого контроллера с поддержкой GraphQL вы действительно вставляете в свои резолверы, когда он встречает любую из ошибок HTTP внутри context.

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

Производительность, архитектура и другие мелкие детали

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

Производительность экосистемы Strapi в целом хорошая. Фактически, у меня практически не было проблем с любым кодом, связанным с ORM, или с автоматически сгенерированными контроллерами, особенно когда я добавил кеширование. Есть несколько проблем, связанных с подключаемым модулем пользовательских разрешений, где выполняется несколько запросов к базе данных - один для роли пользователя и несколько для разрешений, которые есть у этой роли, - для каждого запроса. Я реализовал расширение политики по умолчанию, чтобы уменьшить эти опасения, но решил, что о них стоит упомянуть.

Лично я обнаружил, что создание собственного admin плагина было немного… тяжеловесным. Есть много необходимого кода (большая часть которого автоматически инициализируется!) И не очень много документации. Если вы попытаетесь привести свой плагин в соответствие с общим дизайном остальной части интерфейса администратора Strapi, вам придется копаться в существующих плагинах, чтобы выяснить, какие компоненты React использовать.

Наконец, я считаю, что архитектура системы Strapi немного странная. Практически все вложено в глобальный strapiобъект. Сюда входят контроллеры, модели, службы, перехватчики, доступ к данным и многое другое, что вы можете себе представить. По моему скромному - и, вероятно, неуместному - мнению, было бы лучше спроектировать все в более проверенной манере. Например, я думаю, что использование внедрения зависимостей в контроллеры или службы для предоставления доступа к другим службам или моделям было бы отличным дополнением.

Я рекомендую использовать Strapi?

да.

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

Если у вас нет ограничений по времени (что маловероятно!), Вы ненавидите JavaScript или реализуете значительный набор функций, который не соответствует такой модели на основе CRUD, то, возможно, вам стоит поискать в другом месте. Экономия времени на системе может быть перевешена дополнительной настройкой и обучением, которые вам потребуются, чтобы написать что-то совершенно уникальное. Нельзя сказать, что это невозможно, но, возможно, вы не получите максимальной пользы от Strapi.

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

TL;DR

Добро:

  • Открытый исходный код
  • Управление контентом через современный пользовательский интерфейс «администратора».
  • Автоматически созданные конечные точки REST / GraphQL
  • Аутентификация и авторизация пользователя
  • Система плагинов
  • Относительно легко модифицировать и расширять
  • Полезные плагины по умолчанию, такие как Roles & Permissions, GraphQL и Media Library.
  • Это общее использование

Не очень хорошо:

  • Отсутствие поддержки TypeScript
  • Нет поддержки миграции / заполнения базы данных
  • Проблемы с плагином GraphQL
  • Тяжелая настройка администратора
  • Широкое использование глобального объекта strapi
  • Производительность и оптимизация в определенных областях

Вердикт: 👍