Pull to refresh

Comments 16

iced coffee script ( и возможно не только он ) даёт похожий функционал при помощи await и defer

Мне не понятно зачем нужно было переносить переменные request и response в this. ИМХО удобнее передавать их через аргументы функции, как в express. И выносить поддержку co за пределы koa до появления async/await в v8, как-то преждевременно.

В Koa 2.0 практически так и есть, там передается контекст объекта запроса в middleware первым аргументом. В этом объекте есть свойство request и response. Также в ctx вы можете добавить свой объект, который могут использовать другие middleware.
app.use(co.wrap(function *(ctx, next) {
  // ctx.request
  // ctx.response
  yield next();
}));
Смотрится странно, когда синтаксические конструкции языка считают плюсом фреймворка — их с равным успехом можно использовать и в plain-js и в любом другом фреймворке. Рассматривать это как конкурентное преимущество я бы не стал.
Ну я не совсем это хотел сказать. Фреймворк опираеться на будущий стандарт языка ES2017 (ES8), который еще не принят (поэтому «новое поколение»). С помощью babel на нем разрабатывать можно уже сейчас.

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

Кроме того я хочу отметить что авторами Koa являються (более 70-ти) человек, часть которых учавствуют в разаработке Express, который значительно консерватавнее к новым возможностям JS.
Эм… я про другое. callback, promise, generators, await, Koa — какое слово в этом ряду лишнее? Koa, потому что первые четыре — синтаксические конструкции языка, которые можно применять не привязываясь к конкретному фреймворку, а пятое — фреймворк, который что-то из этого использует. То, что фрейворк написан с использованием es2017 — это с точки зрения разработки на нём не минус и не плюс — разве что планируется в процессе юза лезть в его кишки. Я вот эксплуатирую связку React / redux и в ней я так же могу использовать es2017 в полный рост. Хотя я не сильно интересуюсь стайлгайдом кишков реакта.

Бабель-фуябель генерирует неоптимизируемый V8 код и это, очевидно, может заметно негативно сказаться на производительности. Пока в движок не будет добавлен синтаксис async/await, во фреймворке нет смысла (не свитая небольших проектов "для души").

Бабель-фуябель генерирует неоптимизируемый V8 код

O_o. Откуда дровишки? Почему V8, по вашему, не будет оптимизировать js код после babel-а? Чем он провинился? :)

Взгляните, что генерирует Babel. Если разобрать _asyncToGenerator, там есть неоптимизируемый try..catch. Но это полбеды, посмотрите, во что превращается безобидный код. Попробуйте разобраться, сколько лишнего всего происходит при использовании async/await: конвертация в генератор, вызов вот этой функции (изменение proto налету, ага), вызов вот этой (и всего, что в ней находится). Вы по-прежнему хотите это на сервере? Мы вроде-как наоборот стараемся ускорить приложения на ноде, ну да ладно.

там есть неоптимизируемый try..catch.

Посмотрел. А в чём проблема то? Там же всего пару строк. try-catch вынесен уровнем выше. Самое главное — оптимизации подлежит.


Попробуйте разобраться, сколько лишнего всего происходит при использовании async/await

Да вроде ничего особенного, учитывая контекст применения. Для высоконагруженных частей кодовой базы, может и не сгодится, но в остальных случаях — более чем. Следует понимать, что async-await в принципе не будет работать особенно то быстро, т.к. там всегда будет большой switch-case автомат и промисы. Это ведь в первую очередь удобство.


Я использую co и generator-ы (т.е. без babel). Выжимал по ab на простенькой веб-странице 1600 запросов в секунду (и это сквозь целую цепочку таких вот await-генераторов). Мне кажется такой производительности более чем достаточно для скриптового то языка. А позже и нативная реализация подойдёт. Правда я не думаю, что она будет заметно эффективнее.

А зачем такой громкий пафосный заголовок? К чему это? Ожидал увидеть какие-нибудь новые подходы или фишки. Не стоит так писать.

«Next generation» это позиционирование фреймворка. В аннотации к статье это написано. Цель статьи популяризация фрейворка в основе которого лежит использование современного стандарта JS. Я сознательно старался сделать статью покороче.

Вы знаете, мне кажется, сейчас каждый, кто начинает писать свой framework использует babel async-await или их имитацию через генераторы. Нет в этом никакого "фреймворка нового поколения". Если вы действительно считаете koa чем то выдающимся, то стоило именно об этом и написать. А так получилось что статья с ну прямо очень громким заголовком и описанием того, что мол есть babel и есть co, используйте. Я же по вашим примерам вижу в нём тот же самый express, который всегда не вызывал у меня ничего кроме недоумения.

Пожалуй, вы правы насчет заголовка. Но не согласен по поводу кода на koa — это не express. Просто не хотелось погружаться вдетали. В идеологии Koa есть upstreem-обработчики и downstreem обработчики:
app.use(convert(function *(next) {
  const start = new Date(); // Это выполниться до того как будет отдан ответ на запрос
  yield next;
  const ms = new Date() - start;                                    // Это выполниться после того 
  console.log(`${this.method} ${this.url} - ${ms}ms`);     // как будет отдан ответ на запрос
}));

Если не нужен обработчик на upstreem-и или downstreem-е эту часть кода опускаем. Никаких колбеков. Где же тут express? Использование middleware? Так это у половины фреймворков такой стиль!

Мне не правится express и мне неприятно Ваше обобщение.
Просто не хотелось погружаться вдетали.

Ну тогда вы знаете о чём стоит написать в следующей статье про Koa :)

Sign up to leave a comment.

Articles

Change theme settings