Мир Fastify – Telegram
Мир Fastify
19 subscribers
1 file
3 links
Заметки и новости экосистемы фреймворка Fastify

По всем вопросам @bondiano
Download Telegram
Channel created
Channel name was changed to «Мир Fastify»
Channel photo updated
👩‍💻Немного истории Fastify
#baza
Во первых, вы попали на канал про Node.js, где основной темой обсуждения будет этот самый хост для JavaScript'а. Во вторых, я думаю, что вы уже имеете общее представление о Fastify, как минимум знаете, что это фреймворк для Node.js. По смыслу схож с Express, но во много другой. В течении следующих постов я постараюсь раскрыть, в чем же отличия, почему я последние 4 года выбираю именно его для всех своих серверных проектов, посмотрим на его составные части, а также экосистему вокруг него.

В 2016 году Маттео Коллина (Matteo Collina), в тот момент уже один из активных членов Node.js сообщества, недовольный состоянием популярных на тот момент Express и Koa приступил к написанию собсвеного решения. Прежде, он уже был известен, как один из авторов pino - быстрого логгера для Node.js и своим выступлением The Cost of Logging.

Теперь пришло время ускорять и web-сервер. После обсуждения был найден "убийца перформенса" - JSON.stringify, с помощью которого осуществлялась сериализация и десереализация. Так, Мануэль Спиголон (Manuel Spigolon) начал реализацию первого важного компонента Fastify fast-json-stringify. В конечном итоге получилось решение превосходящее по скорости JSON.stringify в два раза.

В тоже время на вооружение было взято быстрое решение для HTTP роутинга find-my-way от Томаса Ведова (Tomas Della Vedova), реализующее быструю маршутизацию по строкам вида '/example/near/:lat-:lng/radius/:r' при помощи сжатого префиксного дерева. Томас, будучи одним из первых ментейнеров, собрал и внедрил все важные кусочки во фреймворк: мощную систему плагинов avvio (по верх которой можно было переиспользовать мидлвары из Express), pino в качестве логгера и fast-json-stringify как сериализатор.

И доведя все части до ума в 2018 году, команда выкатила v1.0.0 и статью "Fastify goes LTS with 1.0.0!". Основным заявлением было наличие большого количества готовых плагинов, простота и скорость. Что актуально и по сей день.

На самом деле каждый кусочек Fastify заслуживает отдельного разбора. Что, я и планирую покрыть в следующих постах. А также делать небольшие обзоры на новости новых версий интересных мне пакетов Node.js.

Какая часть Fastify вам интереснее всего? С какими проблемами при изучении и использовании вы сталкивались? Буду рад комментариям и раскрыть интересные топики в следующих постах!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
v5.2.0
#news
Случился релиз минорной версии v5.2.0. Никаких глобальных изменений не случилось. Полный чейнджлог можно посмотреть на страничке релиза.
👉 Добавлен тип для метода addHttpMethod, который позволяет опредилить кастомные HTTP глаголы к стандартным (например, видел новый глагол SEARCH) #5811
👉 Поправлен краш сервера, когда отсутствует заголовок host #5892

Сама релизная политика Fastify такая, что если есть хоть один коммит, помеченный по Conventional Commits как feature, то текущий лид-мейнтейнер поднимает минорную версию и релизит пакет.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Плагины. Регистрация

Когда я спрашиваю на собеседовании "Что такое Fastify?", то чаще всего получаю ответ, что это как Express, только побыстрее. В целом, ответ-то валидный, хотя мне хочется услышать немного другое.

Fastify - это эффективная система плагинов над http сервером. И эти самые плагины являются ключом к организации кода, точками расширений и переиспользуемости. Что могут делать плагины:

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

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


app.register(function noError(fastify, opts, done) {
app.log.info('Registering my first plugin.')
    done() // можно использовать колбек done для передачи управления
})
app.register(function (fastify, opts, done) {
app.log.info('Registering my second plugin.')
try {
    throw new Error('Something bad happened!')
    done() // это может быть полезно для перехвата исключений
} catch (err) {
    done(err) // ну и имеет классический стиль для ноды передачи ошибок
}
})


Без вызова done плагин не прейдет в фазу "зарегистированного" и это одна из причин, полчему сейчас более привычен promise-based стиль плагинов с async/await


app.register(async function myPlugin(fastify, options) {
  app.log.info(options.myplugin.first) // здесь у нас async плагин
}, function options(parent) {
// вторым аргументом можно передать как сразу объект конфигов
// так и функцию возвращающую объект
  return ({
    prefix: '1',
    myPlugin: {
      first: 'option',
    }
  })
})
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5