这是我的意见文件夹结构:
- views
- layouts
layout.hbs
- partials
part.hbs
home.hbs
我正在渲染模板宽度:
app.use(views(__dirname + '/views', {
extension: 'hbs',
map: { hbs: 'handlebars' }
}));
router.get('/', async (ctx) => {
await ctx.render('home', {
Name: 'Iris',
Type: 'Web',
Path: '/'
});
});
我想要的是定义主布局文件和部分文件夹,就像它在
express-handlebars
中一样.真的没有办法用 koa-views
来实现这一点纯净的handlebars
?我必须使用
koa-hbs
或 koa-handlebars
?但是他们使用了很快被弃用的功能(和 Handlebars v2.0.0、v3.0.0):koa deprecated Support for generators will been removed in v3.
See the documentation for examples of how to convert old middleware
https://github.com/koajs/koa/tree/v2.x#old-signature-middleware-v1x app.js:45:5
编辑:
好像是
koa-hbs
和 koa-handlebars
与 koa v2
不兼容的插件.所以没办法使用koa v2
, partials
和 layouts
用 handlebars
渲染眼下? :( 没有那些 (define layouts
, partials
) handlebars
是没用的。所以仍然坚持 express
...
最佳答案
koa-hbs 真的只是用 Handlebars .registerPartial
在引擎盖下。
尽可能基本:
var handlebars = require('handlebars'),
fs = require('fs')
handlebars.registerPartial(
'defaultLayout',
fs.readFileSync(__dirname + '/views/layouts/default.html', 'utf8')
)
// then continue with loading the application...
但是您可能希望它只是在启动时加载整个部分文件夹的便利。
handlebars.registerPartial
注册每个部分.它应该在它们都注册后解决 Promise。 这是我使用的一个例子:
var fs = require('fs'),
handlebars = require('handlebars'),
glob = require('glob'), // for convenience, npm install glob
path = require('path')
function readAsPromise (path) {
return new Promise(function (resolve, reject) {
fs.readFile(path, 'utf8', function (err, data) {
resolve({path: path, data: data})
})
})
}
function registerPartial (partial) {
var partialName = path.basename(partial.path, '.hbs')
handlebars.registerPartial(partialName, partial.data)
}
var loadPartials = new Promise(function (resolve, reject) {
glob('./views/partials/*.hbs', function (err, files) {
Promise.all(files.map(readAsPromise)).then(function (partials) {
partials.forEach(registerPartial)
resolve()
})
})
})
现在的问题是您使用的是哪个版本的 Koa
// koa 1
app.use(function* (next) {
yield loadPartials
yield next
})
// latest koa
app.use(async (ctx, next) => {
await loadPartials
})
现在只需像往常一样在 Handlebars 中使用部分。这适用于需要相同 Handlebars 实例的 koa-views
关于javascript - 如何使用 koa-views + Handlebars 渲染主要布局和局部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38731487/