个人比较喜欢handlebars渲染,不喜欢ejs、jade之类,因此在试验koa2开发时,第一时间就想到集成koa-hbs模块! koa-hbs模块来自https://github.com/gilt/koa-hbs 问题是,该模块不支持koa2,就支持koa1 那么咱就出动koa-convert模块来进行转换……可是,仍然有问题。关键点在于ctx.render方法仍然是个generator函数。 这难不倒咱,翻一下koa-convert模块的源码,有样学样,用下面的办法解决之:
const hbs = require('koa-hbs');
const convert = require('koa-convert');
const co = require('co');
app.use(convert(hbs.middleware({
viewPath: __dirname + '/views',
partialsPath: __dirname + '/views/partials'
})));
app.use(async (ctx, next) => {
ctx.render_ = ctx.render;
ctx.render = function (tpl, locals) {
return co.call(ctx, ctx.render_(tpl, locals));
}
await next();
})
另外,如果不用koa-hbs模块,而是用支持koa2的koa-views模块,必须用最新的5.1.2版本(此文章发表时的最新版本),或更高的版本: npm i koa-views@5.1.2 我在一开始时使用npm i koa-views@next命令安装,结果不是最新版本,被坑了。