CNode

以express的方式学习koa(Koa' application generator for 1.x and 2.x)【已经支持了ejs等模板引擎】

分享
Ii5ting发布于11 年前最后回复9 年前42 回复14420 浏览0 收藏

以express的方式学习koa

假定你是一个熟悉express的nodejs工程师

  • 熟悉nodejs
  • 熟悉expressjs
  • 想快速学习koa

什么是koa?

koa 是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套,并极大地提升错误处理的效率。koa 不在内核方法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手。

http://koajs.com/

更多中间件,上下文,异常处理等,详见Koa or Express

express和koa比较

https://github.com/koajs/koa/blob/master/docs/koa-vs-express.md

FeatureKoaExpressConnect
Middleware Kernel
Routing
Templating
Sending Files
JSONP

这是一份很久以前的文档,目前来看也是对的,但是koa的生态已经很好了

FeatureKoaExpressConnect
Middleware Kernel
Routing✓ koa-router
Templating✓ koa-views
Sending Files✓ koa-send
JSONP✓ koa-safe-jsonp

该有的基本都有了,于是我仿着express-generator写了koa-generator

技术栈如下

生成器

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

1.png

➜  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的语法,整个世界就更简单了

另外项目骨架的好处是约定技术栈,你可以在上面基础上做更多更有意思的事儿

提前报个料moajs很快会放出一个基于koa的版本来

全文完

欢迎关注我的公众号【node全栈】

node全栈.png

查看回复

回复 (42)

I
i5ting#1·9 年前

更新了koa-generator的依赖版本,另外koa2 必须在node.js 7.6以上,废弃了runkoa这个偷懒过度方式。欢迎反馈

Y
yuu2lee4#2·11 年前

mark

来自炫酷的 CNodeMD

J
jaylinWang#3·11 年前

火钳刘明

来自酷炫的 CNodeMD

I
i5ting#4·11 年前

有朋友说没有上传,原因是express-generator也没有multipart的,为了保持1:1,故没有加

I
i5ting#5·11 年前
D
dlutwuwei#6·11 年前

了解一下co和thunkify,对koa学习很有帮助的

N
nekron#7·11 年前

为什么我的注意力一直停留在

一帮 性需求

koa和babel可以一块使用不。

Y
yuu2lee4#9·11 年前

一帮性需求

K
klausgao#10·11 年前
引用 i5ting@klausgao 用过?

@i5ting 项目用着co+express,杠杠的 自豪地采用 CNodeJS ionic

I
i5ting#12·11 年前

Koa' application generator for 1.x and 2.x https://github.com/base-n/koa-generator

目前已经支持1.x和2.x版本

Y
yuu2lee4#13·10 年前

用起来。。。

I
i5ting#14·10 年前
引用 yuu2lee4用起来。。。

@yuu2lee4 有问题随时反馈

C
ckken#15·10 年前

@i5ting 其实出了 babel 后 koa已经没有优势了 knode 完全es6/7 编写 而且已经跑了几个项目

来自酷炫的 CNodeMD

I
i5ting#16·10 年前
引用 ckken@i5ting 其实出了 babel 后 koa已经没有优势了 knode 完全es6/7 编写 而且已经跑了几个项目 来自酷炫的 CNodeMD

@ckken 哈哈 babel只是语法糖层面的工具而已,和koa不能相提并论的。

F
fghpdf#17·10 年前

mark

C
caihuabin#18·10 年前

mark,+1

I
i5ting#19·10 年前
引用 JasonBoyMark

@JasonBoy 欢迎使用、欢迎反馈

J
j60017268#20·11 年前

mark

W
wewea#21·11 年前

Mark

K
klausgao#22·11 年前

co+express 或 es7+express,有什么不好吗? 自豪地采用 CNodeJS ionic

B
BirdEggegg#24·11 年前

MarkI‘m webapp-cnodejs-vue

M
mzTeamMeatMan#26·11 年前

直接从koa学起......表示不会express

I
i5ting#27·11 年前

答疑:有朋友问,orm集成需不需要做?

答:不需要

  • orm和express里的用法一样
  • 把promise替换成co或async/await即可
  • 另外要注意的就死route和中间件写法,以ctx上下文为主
Z
zhangjx#28·11 年前

mark

C
cupyong#29·10 年前

mark

Z
zeroone001#30·10 年前

mark

H
Hanggi#31·10 年前

问一下,koa的2.0已经好几个月没更新了,反而1.x更新很频繁是什么节奏呢。

I
i5ting#33·10 年前

已支持koa2,无需了解babel

I
i5ting#35·10 年前

已经支持了ejs等模板引擎

I
i5ting#36·10 年前

koa-generator新版支持koa1和koa2所有写法,且koa2不需要了解babel即可使用async/wait,支持jade、ejs、hbs等模板引擎,功能已经足够用了

Y
yakczh#37·10 年前
引用 i5tinghttps://github.com/17koa/koa2 demo

@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;

这两种写法是一样,还是分版本?

I
i5ting#38·10 年前
引用 yakczh@i5ting 上面的链接 贴子的写的路由 这两种写法是一样,还是分版本?

@yakczh 帖子里的路由是老的基于generator的,这个会产生warning,在koa@v3里会被干掉,是我忘记更新了

Y
yakczh#39·10 年前

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
J
JasonBoy#42·10 年前

Mark

参与回复
登录后即可参与回复。登录