以express的方式学习koa
假定你是一个熟悉express的nodejs工程师
- 熟悉nodejs
- 熟悉expressjs
- 想快速学习koa
什么是koa?
koa 是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套,并极大地提升错误处理的效率。koa 不在内核方法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手。
更多中间件,上下文,异常处理等,详见Koa or Express
express和koa比较
https://github.com/koajs/koa/blob/master/docs/koa-vs-express.md
Feature | Koa | Express | Connect |
---|---|---|---|
Middleware Kernel | ✓ | ✓ | ✓ |
Routing | ✓ | ||
Templating | ✓ | ||
Sending Files | ✓ | ||
JSONP | ✓ |
这是一份很久以前的文档,目前来看也是对的,但是koa的生态已经很好了
Feature | Koa | Express | Connect |
---|---|---|---|
Middleware Kernel | ✓ | ✓ | ✓ |
Routing | ✓ koa-router | ✓ | |
Templating | ✓ koa-views | ✓ | |
Sending Files | ✓ koa-send | ✓ | |
JSONP | ✓ koa-safe-jsonp | ✓ |
该有的基本都有了,于是我仿着express-generator写了koa-generator
技术栈如下
- https://github.com/alexmingoia/koa-router
- https://github.com/queckezz/koa-views
- https://github.com/koajs/static
- https://github.com/koajs/logger
- https://github.com/koajs/json
- https://github.com/koajs/body-parsers
- cookies已经koa内置了,无需处理
生成器
generator是生成器的意思,用于生成项目骨架,express-generator就是一个比较好的例子,虽然比较精简,但结构清晰,足矣满足一帮性需求
鉴于很多人非常熟悉expressjs,我就假定大家也熟悉express-generator
express-generator提供的功能
- 生成项目骨架
- 约定目录结构(经典,精简,结构清晰)
- 支持css预处理器
express-generator提供的功能
- 生成项目骨架
- 约定目录结构(和express-generator的结构一模一样)
- 支持css预处理器(暂未实行)
2个生成器共同的项目骨架结构
- app.js为入口
- bin/www为启动入口
- 支持static server,即public目录
- 支持routes路由目录
- 支持views视图目录
- 模式jade模板引擎
用法
目前已经支持1.x和2.x版本
npm install -g koa-generator
然后使用koa命令创建koa 1.x项目 然后使用koa2命令创建koa 2.x项目
当前目录创建,如果非空需要加force选项
koa
创建项目目录
koa helloworld
实例
➜ koatest koa helloworld
create : helloworld
create : helloworld/package.json
create : helloworld/app.js
create : helloworld/public
create : helloworld/public/javascripts
create : helloworld/public/images
create : helloworld/public/stylesheets
create : helloworld/public/stylesheets/style.css
create : helloworld/routes
create : helloworld/routes/index.js
create : helloworld/routes/users.js
create : helloworld/views
create : helloworld/views/index.jade
create : helloworld/views/layout.jade
create : helloworld/views/error.jade
create : helloworld/bin
create : helloworld/bin/www
install dependencies:
$ cd helloworld && npm install
run the app:
$ DEBUG=helloworld:* npm start
➜ koatest cd helloworld
➜ helloworld npm install
➜ helloworld npm start
此时访问
路由写法说明
只要是koa-router写的路由都可以加载的,加载方式和express里一样
var router = require('koa-router')();
router.get('/', function *(next) {
this.body = 'this /1!';
});
router.get('2', function *(next) {
this.body = 'this /2!';
});
module.exports = router;
一定要区分
url = /2
router.get('2', function *(next) {
this.body = 'this /2!';
});
url = //2
router.get('/2', function *(next) {
this.body = 'this /2!';
});
这个是koa-router的一个问题,和express里的路由稍有不一样,注意一些即可
koa-generator
项目地址 https://github.com/17koa/koa-generator/
分支
- master是生成器,里面的templates目录放模板
- tpl是项目模板
欢迎fork、star或issue,O(∩_∩)O谢谢
总结
打通了express-generator和koa-generator玄关后,剩下的就是习惯koa的语法,整个世界就更简单了
另外项目骨架的好处是约定技术栈,你可以在上面基础上做更多更有意思的事儿
- 自动挂载路由目录
- koa.res.api返回jsonapi
- Mount other Koa applications or middleware to a given pathname
- Middleware composition utility
- The ultimate generator based flow-control goodness for nodejs (supports thunks, promises, etc)
- rest api
提前报个料moajs很快会放出一个基于koa的版本来
全文完
欢迎关注我的公众号【node全栈】
火钳刘明
来自酷炫的 CNodeMD
有朋友说没有上传,原因是express-generator也没有multipart的,为了保持1:1,故没有加
上传可以考虑https://github.com/koa-modules/multer
mark
Mark
co+express 或 es7+express,有什么不好吗? 自豪地采用 CNodeJS ionic
@klausgao 用过?
Mark<br/><br/><a class=“form” href=“https://github.com/shinygang/Vue-cnodejs”>I‘m webapp-cnodejs-vue</a>
mark
来自炫酷的 CNodeMD
了解一下co和thunkify,对koa学习很有帮助的
@dlutwuwei en
为什么我的注意力一直停留在
一帮 性需求
koa和babel可以一块使用不。
一帮性需求
@i5ting 项目用着co+express,杠杠的 自豪地采用 CNodeJS ionic
@klausgao 求给大家分享一下
直接从koa学起…表示不会express
答疑:有朋友问,orm集成需不需要做?
答:不需要
- orm和express里的用法一样
- 把promise替换成co或async/await即可
- 另外要注意的就死route和中间件写法,以ctx上下文为主
Koa’ application generator for 1.x and 2.x https://github.com/base-n/koa-generator
目前已经支持1.x和2.x版本
mark
mark
mark
问一下,koa的2.0已经好几个月没更新了,反而1.x更新很频繁是什么节奏呢。
@Hanggi 试水遇到障碍。。。哈哈
用起来。。。
@yuu2lee4 有问题随时反馈
@ckken 哈哈 babel只是语法糖层面的工具而已,和koa不能相提并论的。
mark
mark,+1
已支持koa2,无需了解babel
已经支持了ejs等模板引擎
koa-generator新版支持koa1和koa2所有写法,且koa2不需要了解babel即可使用async/wait,支持jade、ejs、hbs等模板引擎,功能已经足够用了
@i5ting 上面的链接
var router = require('koa-router')();
router.get('/', function (ctx, next) {
ctx.body = 'this a users response!';
});
module.exports = router;
贴子的写的路由
var router = require('koa-router')();
router.get('/', function *(next) {
this.body = 'this /1!';
});
router.get('2', function *(next) {
this.body = 'this /2!';
});
module.exports = router;
这两种写法是一样,还是分版本?
koa2生成的代码有人能运行吗? koa2 helloworld cd helloworld npm install vi .babelrc { “presets”: [“es2015”], “plugins”: [ “transform-async-to-generator”, “syntax-async-functions” ] } babel -d app/ src nodemon app/bin/www 怎么提示这个,是哪一步错了
app.use(co.wrap(regeneratorRuntime.mark(function _callee(ctx, next) {
^
ReferenceError: regeneratorRuntime is not defined
@yakczh 你这个是老版本的吧,新版生成的,应该类似于
Mark
@JasonBoy 欢迎使用、欢迎反馈
更新了koa-generator的依赖版本,另外koa2 必须在node.js 7.6以上,废弃了runkoa这个偷懒过度方式。欢迎反馈