docs: koa vs express draft
This commit is contained in:
parent
969614dba1
commit
40c64a37d7
1 changed files with 128 additions and 0 deletions
128
docs/koa-vs-express.md
Normal file
128
docs/koa-vs-express.md
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
|
||||||
|
THIS DOCUMENT IS IN PROGRESS. THIS PARAGRAPH SHALL BE REMOVED WHEN THIS DOCUMENT IS DONE.
|
||||||
|
|
||||||
|
TO DO:
|
||||||
|
|
||||||
|
- Remove benchmark from readme
|
||||||
|
|
||||||
|
# Koa vs Express
|
||||||
|
|
||||||
|
## Does Koa replace Express?
|
||||||
|
|
||||||
|
It's more like Connect, but a lot of the Express goodies
|
||||||
|
were moved to the middleware level in Koa to help form
|
||||||
|
a stronger foundation. This makes middleware more enjoyable
|
||||||
|
and less error-prone to write, for the entire stack, not
|
||||||
|
just the end application code.
|
||||||
|
|
||||||
|
Typically many middleware would
|
||||||
|
re-implement similar features, or even worse incorrectly implement them,
|
||||||
|
when features like signed cookie secrets among others are typically application-specific,
|
||||||
|
not middleware specific.
|
||||||
|
|
||||||
|
## Does Koa replace Connect?
|
||||||
|
|
||||||
|
No, just a different take on similar functionality
|
||||||
|
now that generators allow us to write code with less
|
||||||
|
callbacks. Connect is equally capable, and some may still prefer it,
|
||||||
|
it's up to what you prefer.
|
||||||
|
|
||||||
|
## Why isn't Koa just Express 4.0?
|
||||||
|
|
||||||
|
Koa is a pretty large departure from what people know about Express,
|
||||||
|
the design is fundamentally much different, so the migration from
|
||||||
|
Express 3.0 to this Express 4.0 would effectively mean rewriting
|
||||||
|
the entire application, so we thought it would be more appropriate
|
||||||
|
to create a new library.
|
||||||
|
|
||||||
|
## Is Koa faster than Express?
|
||||||
|
|
||||||
|
To our amazement, yes, but only if you use [`yield *next`](http://wiki.ecmascript.org/doku.php?id=harmony%3agenerators#delegating_yield). We do not provide examples of using delegated yields as we find it confusing as well as unnecessary for most people. Here are Koa's benchmarks when using delegated yields:
|
||||||
|
|
||||||
|
```
|
||||||
|
1 middleware
|
||||||
|
8849.36
|
||||||
|
|
||||||
|
5 middleware
|
||||||
|
8685.74
|
||||||
|
|
||||||
|
10 middleware
|
||||||
|
8511.08
|
||||||
|
|
||||||
|
15 middleware
|
||||||
|
8456.86
|
||||||
|
|
||||||
|
20 middleware
|
||||||
|
8211.93
|
||||||
|
|
||||||
|
30 middleware
|
||||||
|
8102.98
|
||||||
|
|
||||||
|
50 middleware
|
||||||
|
7617.67
|
||||||
|
|
||||||
|
100 middleware
|
||||||
|
6899.45
|
||||||
|
```
|
||||||
|
|
||||||
|
Here are the benchmarks for Express:
|
||||||
|
|
||||||
|
```
|
||||||
|
1 middleware
|
||||||
|
7805.19
|
||||||
|
|
||||||
|
5 middleware
|
||||||
|
7707.15
|
||||||
|
|
||||||
|
10 middleware
|
||||||
|
7475.08
|
||||||
|
|
||||||
|
15 middleware
|
||||||
|
7261.73
|
||||||
|
|
||||||
|
20 middleware
|
||||||
|
7012.07
|
||||||
|
|
||||||
|
30 middleware
|
||||||
|
6672.76
|
||||||
|
|
||||||
|
50 middleware
|
||||||
|
6255.92
|
||||||
|
|
||||||
|
100 middleware
|
||||||
|
5000.98
|
||||||
|
```
|
||||||
|
|
||||||
|
Also note that Express uses many more middleware than Koa, so these benchmarks are largely in Koa's favor.
|
||||||
|
|
||||||
|
## How is Koa different than Connect/Express?
|
||||||
|
|
||||||
|
### Generated-based control flow
|
||||||
|
|
||||||
|
Thanks to co.
|
||||||
|
|
||||||
|
No callback hell.
|
||||||
|
|
||||||
|
Better error handling through try/catch.
|
||||||
|
|
||||||
|
No need for domains.
|
||||||
|
|
||||||
|
### Koa is barebone
|
||||||
|
|
||||||
|
Unlike both Connect and Express, Koa does not include any middleware.
|
||||||
|
|
||||||
|
Unlike Express, routing is not provided.
|
||||||
|
|
||||||
|
Unlike Express, many convenience utilities are not provided. For example, sending files.
|
||||||
|
|
||||||
|
More modular.
|
||||||
|
|
||||||
|
### Koa relies less middleware
|
||||||
|
|
||||||
|
For example, instead of a "body parsing" middleware, you would instead use a body parsing function.
|
||||||
|
|
||||||
|
### Koa abstracts node's request/response
|
||||||
|
|
||||||
|
Less hackery.
|
||||||
|
|
||||||
|
Proper stream handling.
|
Loading…
Reference in a new issue