javascript - 如何使用 koa-views + Handlebars 渲染主要布局和局部?

标签 javascript handlebars.js koa

这是我的意见文件夹结构:

- 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-hbskoa-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-hbskoa-handlebarskoa v2 不兼容的插件.所以没办法使用koa v2 , partialslayoutshandlebars 渲染眼下? :( 没有那些 (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...

但是您可能希望它只是在启动时加载整个部分文件夹的便利。
  • 创建一个 Promise,并执行一个读取您的部分文件夹的函数,并通过 handlebars.registerPartial 注册每个部分.它应该在它们都注册后解决 Promise。
  • 创建一个等待 Promise 解决的中间件异步,因此您的应用在注册这些部分之前不会呈现任何 View

  • 这是我使用的一个例子:
    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/

    相关文章:

    JavaScript 继承 : Object. create vs new

    javascript - jquery 检查数组中是否有值

    javascript - 将多个预编译模板与 Handlebars .js(多个 HTTP 请求)一起使用?

    javascript - 无法创建 Handlebars 模板

    node.js - 如何在 Koa 中间件中使用上下文传递参数?

    javascript - 如何在javascript中输入框为空时设置var something = 0

    javascript - Node.js 中的多个依赖 SQL 查询

    javascript - Handlebars 包裹 <!DOCTYPE html>

    javascript - JavaScript生成器捕获错误

    javascript - 使用 koa2 和 koa-router 进行 REST api 获取 204 - 响应正文未传递