2016-11-29 6 views
1

レンダラーとして[email protected]のKoa v2アプリがあり、レンダラーとしてnunjucksテンプレートエンジンがあります。koa v2用のNunjucksセットアップ

const Koa = require('koa'); 
const nunjucks = require('nunjucks'); 
const path = require('path'); 
const router = require('koa-router')(); 
const views = require('koa-views'); 

const app = new Koa(); 

const index = require('./routes/index'); 

app.use(views(path.join(__dirname, 'views'), { 
    extension: 'njk', 
    map: { njk: 'nunjucks' }, 
})); 
nunjucks.configure(path.join(__dirname, 'views'), { 
    autoescape: true, 
}); 

router.use('/', index.routes(), index.allowedMethods()); 
app 
    .use(router.routes()) 
    .use(router.allowedMethods()); 

app.listen(3000); 

をしかし、私はこれを行わない場合、レンダリングが動作しない:ここでは問題ありません、私の作業セットアップは、ですが、私はちょうどviewsフォルダの二重の宣言と混同します。

Template render error: (unknown path) 
Error: template not found: layout.njk 

私のセットアップに問題がある:私はnunjucks.configureブロックのコメントを解除した場合、私は次のエラーを取得していますか?

+0

nunjucksにアプリのインスタンスを渡す試してみてください: 'nunjucks.configure(...、{表現: app、autoescape:true}) 'を実行します。 –

+0

'app.set( 'view'、NunjucksView);'ファイル 'node_modules \ nunjucks \ src \ environment.js:288'で' app.set is not a function'エラーを出しています。私はそれが 'Koa'のためではなく、' Express'アプリのためのラッパーであると思います。 – Lanti

+2

koa-views(およびそれが使用するexpress lib)には問題があります。彼らは完全に一般化していない。たとえば、最後にチェックして、ネストされたnunjucksテンプレートをキャッシュしません。これは、本番環境でfs-statコールがあることを意味します。 nunjucksを直接使用することをお勧めします。 https://github.com/ohomer/koa-nunjucks-render/blob/master/index.jsのソースを確認してください - あなたの質問にも答えてくれるかもしれません。 – danneu

答えて

1

私はkoa v2内の他のレンダラライブラリなしnunjucksを使用するための解決策を考え出す:

/* 
USAGE: 

import njk from './nunjucks'; 

// Templating - Must be used before any router 
app.use(njk(path.join(__dirname, 'views'), { 
    extname: '.njk', 
    noCache: process.env.NODE_ENV !== 'production', 
    throwOnUndefined: true, 
    filters: { 
    json: function (str) { 
     return JSON.stringify(str, null, 2); 
    }, 
    upperCase: str => str.toUpperCase(), 
    }, 
    globals: { 
    version: 'v3.0.0', 
    }, 
})); 

*/ 

// Inspired by: 
// https://github.com/ohomer/koa-nunjucks-render/blob/master/index.js 
// https://github.com/beliefgp/koa-nunjucks-next/blob/master/index.js 

const Promise = require('bluebird'); 
const nunjucks = require('nunjucks'); 

function njk(path, opts) { 
    const env = nunjucks.configure(path, opts); 

    const extname = opts.extname || ''; 

    const filters = opts.filters || {}; 
    //console.time('benchmark'); 
    const f = Object.keys(filters).length; 
    let i = 0; 
    while (i < f) { 
    env.addFilter(Object.keys(filters)[i], Object.values(filters)[i]); 
    i += 1; 
    } 
    //console.timeEnd('benchmark'); 

    const globals = opts.globals || {}; 
    const g = Object.keys(globals).length; 
    let j = 0; 
    while (j < g) { 
    env.addFilter(Object.keys(globals)[j], Object.values(globals)[j]); 
    j += 1; 
    } 

    return (ctx, next) => { 
    ctx.render = (view, context = {}) => { 
     context = Object.assign({}, ctx.state, context); 
     return new Promise((resolve, reject) => { 
     env.render(`${view}${extname}`, context, (err, res) => { 
      if (err) { 
      return reject(err); 
      } 
      ctx.body = res; 
      return resolve(); 
     }); 
     }); 
    }; 
    return next(); 
    }; 
} 

module.exports = njk; 

Gist

関連する問題