Koajs 2.0: нове покоління фреймворку нового покоління

KoaJS logo«Next generation web framework for node.js» — так написано в документації до версії 1.0. Звучить непогано, я до цього додам що 2 роки тому після впровадження koa на одному з проектів у наших програмістів з'явився термін «псевдо-синхронний код» (Це коли код виглядає як синхронний але насправді виконується асинхронно). Що за маячня Як це працює я розповім під катом.

Що таке KoaJS
Щоб не повторюватися:
З допомогою особливості роботи генераторів і директиви yield ми можемо асинхронно виконати Promise або спеціально нами сконструйовану thinkify-функцію і після виконання промиса/функції повернутися в ту точку, де викликався yield повернути результат і продовжити виконання коду.

Приклад такого коду:
//...
let userId = Number(this.request.userId);
let projects = yield users.getActiveProjectsByUserId(userId); // Наприклад, звертаємося до БД

for (let project of projects) {
project.owners = yield projects.getProjectOwnersById(project.id); // Тут теж звертаємося до БД
}

this.body = yield this.render('userProjects', projects); // Тут асихронно рендерим відповідь
//...

Навіщо мені KoaJS?
Ідея Koa ідеально лягати на парадигму микросервисов, яку я вже давно впровадив в нашій компанії. Ядро фреймворку мінімалістично, код middleware для коа читається і розуміється дуже легко, що дуже важливо для командної розробки. Активне использоване фреймворком можливостей ES2015, мінімальне травмування психіки програміста, який до цього писав на PHP (ці хлопці колбеки не люблять :) ).

Чудово, чим здивує KoaJS 2.0?
Те що було основою KoaJS, а саме бібліотека co, побудована на генераторах тепер видалена з базової реалізації Koa 2.

Давайте посторим Hello world!
const Koa = require('koa');
const app = new Koa();

// response
app.use(ctx => {
ctx.body = 'Hello Koa';
});

app.listen(3000);


Як бачите тут генераторів немає, але тоді як же писати расхваленый мною «псевдо-синхронний код». В найпростішому випадку можна обійтися нативним кодом:

app.use((ctx, next) => {
const start = new Date();
return next().then(() => {
const ms = new Date() - start;
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});
});

next — є промисом, ctx — контекст запиту.

У такому вигляді без колбеков багато речей реалізувати не можна, тому автори пропонують використовувати новий синкасис async/await, який ще не став стандартом і нативно не підтримується NodeJS але вже давно реалізовано в транспилере Babel. Виглядає це так:
app.use(async (ctx, next) => {
const start = new Date();
await next();
const ms = new Date() - start;
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});


Також передбачений варіант з додатковим підключенням бібліотеки co і генераторами:
app.use(co.wrap(function *(ctx, next) {
const start = new Date();
yield next();
const ms = new Date() - start;
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
}));


Сумісність з Koa 1.x
Коли я говорив про «выпиленных» генераторах, то був не зовсім точний. Для сумісності, якщо ви оформите middleware в стилі koa 1.0, koa 2.0 його підключить і виконає при цьому в консолі буде «Koa deprecated Support for generators will been removed in v3...» Іншими словами до версії 3.x все буде працювати.

Ось приклад:
// Koa will convert
app.use(function *(next) {
const start = new Date();
yield next;
const ms = new Date() - start;
console.log(`${this.method} ${this.url} - ${ms}ms`);
});


Також можна перетворити існуючий middleware у формат 2.0 самостійно за допомогою модуля koa-convert
const convert = require('koa-convert');

app.use(convert(function *(next) {
const start = new Date();
yield next;
const ms = new Date() - start;
console.log(`${this.method} ${this.url} - ${ms}ms`);
}));


В цьому випадку жодних попереджень на консоль, тому я рекомендую використовувати саме такий спосіб підключення legacy middleware.

Навіщо переходити на 2.0
Звичайно, я не можу стверджувати на 100%, але півроку стабільної роботи одного з типових сервісів дають мені впевненість у тому, що 2.0 досить стабільний.

Я хочу мати право вибору яким способом реалізовувати свій middleware. Koa 2.0 дає мені три шляхи: нативний, генератори і async/await

Koa 2.0 вже підтримують багато популярні middleware, а якщо не підтримують, то працюють через koa-convert

Якщо ви зараз приглядываетесь до нових фреймворкам, спробуйте щось невелике закодить на Koa — впевнений, Ви не пошкодуєте що витратите на це час.

переглянути
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.