首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setup v2的Nunjucks设置

setup v2的Nunjucks设置
EN

Stack Overflow用户
提问于 2016-11-29 10:02:29
回答 1查看 981关注 0票数 1

我有一个Koa v2应用程序,koa-views@next作为渲染器和nunjucks模板引擎。下面是我的工作设置,它没有任何问题,我只是混淆了views文件夹的双重声明:

代码语言:javascript
复制
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);

但如果我不这么做,渲染就不能用了。如果取消对nunjucks.configure块的注释,将得到以下错误:

代码语言:javascript
复制
Template render error: (unknown path)
Error: template not found: layout.njk

我的装置有什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-04 16:19:39

我想出了一个解决方案来使用nunjucks,而不是在koa v2中使用任何其他渲染库。

代码语言:javascript
复制
/*
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;

要旨

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40862924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档