Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Zhigalov/07962f75825f91230f60daed6ff08e0b to your computer and use it in GitHub Desktop.
Save Zhigalov/07962f75825f91230f60daed6ff08e0b to your computer and use it in GitHub Desktop.
Материалы к докладу про бекенд на NodeJS

Бекенд на JavaScript. Быть или не быть, вот в чём вопрос

Предпосылки

  1. Нет проблем с передачей значений от фронтенда к бекенду и обратно:
    • В C# если передать "ложь" на клиента как есть, то она доедет строкой "False"
    • В питоне поля именуются не в camelCase, а через землю. В итоге в коде бекенда встречаются два типа именований полей. Грязь.
    • В плюсах огромная проблема собрать JSON. А даже когда собрали, то надо проверить что всё многообразие целых чисел правильно уместилось в JavaScript int.
  2. Фронтендер может быстро поправить пару мест на бекенде. Если фронтендер и бекендер это разные люди, то они начинают общаться в поямом смысле на одном языке. Фулстек разработка.
  3. Бекенд - это место где нужно сходить во много источников (базка, другой бекенд, за файлом и т.п.), перемолоть и вренуть фронтенду. Походы за данными - асинхронная задача. Если запускать на каждого клиента по новому потоку, как это обычно делают в компилируемых языках, то эти потоки только и будут делать что ждать. NodeJS отлично справляется с обработкой асинхронных запросов в один поток (TODO: график)
  4. Язык запросов Mongodb на JavaScript. Удобно писать бекенд и запрос на одном языке.
  5. JavaScript самый популярный язык программирования (TODO: найти источник). Для работодателя - много разработчиков на рынке, для разработчика - большой выбор мест работы.

Как приготовить свой бекенд на NodeJS

  1. Выбрать фреймворк. KOA, потому что проще работать с асинхронностью.
  2. Мидлвара авторизации. Прокидывание результата через state.
  3. Разделение ответственности по MVC, которое выкристаллизировалось со временем:
    • контроллер: ассерты данных, отдаёт команды моделям, передаёт данные вью
    • модель: варит данные, никаких проверок полей
    • вью: сериалайзер, меняет формат данных от модели для потребителя
  4. Юнит тесты моделей + интеграционные тесты контроллеров. Базу используем живую, подкладываем рядом. Внешние источники мокаем.
  5. Ручка heartbeat, которая опрашивает все дочерние сервисы вашего бекенда и делает запрос в базу.
  6. Документация на swagger. Близко к коду, значит больше вероятность что она в актуальном состоянии. Вместо описания ответов живые запросы - "Лучше один раз увидеть, чем сто раз прочитать".

Сравнение производительности

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

  1. Реализация на ноде. Красивый код на лодаше, но очень медленный.
  2. Оптимизируем реализацию на ноде. Некрасивый код, но работает в семь раз быстрее.
  3. Пишем решение на плюсах. Работает ещё быстрее, но время разработки и читаемость кода не радуют.

Итог

На JavaScript легко написать прототип, с которым можно жить. Это хорошее общее решение. Когда упёрлись во что-то конкретное, тогда и нужно выбирать подходящий инструмент.

QR code на репозиторий с примером бекенда, который решает задачу про комментарии. Можно использовать его как точку отсчёта для вашего бекенда.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment