Использование Nunjucks с Express 4

Я пытаюсь использовать Nunjucks в качестве механизма шаблонов из Экспресс. Я сделал это:

var express = require('express');
var nunjucks = require('nunjucks');
var path = require('path');
var bodyParser = require('body-parser');
var load = require('express-load');
var fs = require("fs");

var app = express();
app.set('views', path.join(__dirname, 'views'));

var env = nunjucks.configure(app.get('views'), {
    autoescape: true,
    express:    app 
});

app.set('view engine', 'html');

Но приведенный выше код дает эту ошибку:

Template render error: compileExtends: cannot extend multiple times
   at Error.exports.TemplateError (C:\my\nodejs\projects\\node_modules\nunjucks\src\lib.js:49:19)
   at Object.extend.fail (C:\my\nodejs\projects\\node_modules\nunjucks\src\compiler.js:49:15)
   at Object.extend.compileExtends (C:\my\nodejs\projects\\node_modules\nunjucks\src\compiler.js:983:18)
   at Object.extend.compile (C:\my\nodejs\projects\\node_modules\nunjucks\src\compiler.js:1083:22)
   at Object.extend._compileChildren (C:\my\nodejs\projects\\node_modules\nunjucks\src\compiler.js:139:18)
   at Object.extend.compileRoot (C:\my\nodejs\projects\\node_modules\nunjucks\src\compiler.js:1050:14)
   at Object.extend.compile (C:\my\nodejs\projects\\node_modules\nunjucks\src\compiler.js:1083:22)
   at Object.module.exports.compile (C:\my\nodejs\projects\\node_modules\nunjucks\src\compiler.js:1118:11)
   at Obj.extend._compile (C:\my\nodejs\projects\\node_modules\nunjucks\src\environment.js:414:35)
   at Obj.extend.compile (C:\my\nodejs\projects\\node_modules\nunjucks\src\environment.js:403:18) 

Подскажите, пожалуйста, как это исправить?


person user007    schedule 09.03.2015    source источник


Ответы (5)


Я использовал это так:

nunjucks.configure('views', {
    express: app,
    autoescape: true
});
app.set('view engine', 'html');

Сработало для меня. Получено с веб-сайта nunjucks: https://mozilla.github.io/nunjucks/getting-started.html

person thepanuto    schedule 28.03.2015

Я хотел бы добавить свое решение. Я столкнулся с этой же проблемой, поскольку экспресс-генератор не поддерживает механизм шаблонов nunjucks. Как уже упоминалось, вы должны импортировать зависимости express и nunjucks, а затем настроить nunjucks.

const app = express();
const nunjucks = require('nunjucks');
nunjucks.configure('views', {
  autoescape: true,
  express: app
});

Затем вам нужно решить, как вы хотите отображать свои шаблоны. У вас есть возможность отвечать на HTTP-запросы путем преобразования простой строки или файла. Однако, предполагая, что ваш проект может вырасти в какой-то момент, я считаю, что лучше воспользоваться маршрутизацией и промежуточным программным обеспечением, предоставляемым экспресс. Используя экспресс-генератор, экспресс предоставляет две папки: представления и маршруты. В файле app.js есть два метода ответа на входящие запросы.

app.use('/', indexRouter);
app.use('/users', usersRouter);

Где indexRouter и usersRouter определены следующим образом:

const indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');

Это говорит о том, что когда приходит запрос на «/», обрабатывайте его с помощью файла index.js в папке routes. Таким же образом, когда приходит запрос «/users», обрабатывайте его с помощью файла users.js в папке routes. Поскольку мы просто пытаемся внедрить механизм шаблонов nunjucks, мы можем оставить эти строки как есть. Важно понимать, что файл index.js в папке routes будет использовать экспресс-маршрутизатор, подготовит ответ и отобразит файл с тем же именем в папке views. Это означает, что нам нужно создать файл в папке представлений с именем index — чтобы имена совпадали.

В сообществе Nunjucks принято использовать расширение njk. Итак, мы будем использовать index.njk в качестве имени нашей корневой страницы. Наконец, нам нужно сообщить Express, что он должен ожидать расширение njk. Это потому, что расширение njk — это просто соглашение. Мы могли бы так же легко использовать .html и, пока у нас настроены нунджаки, и указать экспрессу ожидать html. В app.js:

app.set('view engine', 'njk');

Теперь мы можем использовать шаблонизатор nunjucks, и он будет скомпилирован в HTML. Я рекомендую создать файл макета и использовать nunjucks {% block content %} code-goes-here {% endblock %} для создания повторно используемых компонентов, которые могут быть унаследованы через наследование шаблона Nunjuck, т. е. {% extends "layout.njk" %}

Nunjucks — невероятно мощный движок шаблонов с надежным набором функций. На мой взгляд, это самый недооцененный шаблонизатор. Он прост в использовании, чрезвычайно мощен и расширяем.

Для получения дополнительной информации о наследовании шаблонов, это полезная ссылка от jinja2, откуда был портирован nunjucks, нажмите на меня!

Если вы хотите увидеть пример приложения, которое я настроил с помощью Express 4, Nunjucks и Winston для ведения журнала, вы можете найти его на моем GitHub.

person Frederick John    schedule 14.09.2018

Это похоже на базовую конфигурацию с использованием express js, вы можете сделать что-то вроде этого:

const express = require('express');
const nunjucks = require('nunjucks');
const app = express();

nunjucks.configure('views',{
    autoescape:true,
    express:app
});

app.set('views','./views'); // <--Path to your views folder

app.get('/',(request,response)=>{
    response.render('some-view.html');
});

дополнительные ссылки см. в официальной документации.

person pedrommuller    schedule 20.04.2018

если вы хотите разместить папку с шаблонами в ${pwd}/teampltes

делай как ниже.

//import
const path = require('path')

const express = require('express')
const nunjucks = require('nunjucks')


//init
const app = express()

nunjucks.configure(path.join(__dirname, 'templates'), {
    autoescape: true,
    express: app
})
person JaeIL Ryu    schedule 13.11.2019

Я просто устанавливаю nunjucks по умолчанию:

const express = require('express');
const nunjucks = require('nunjucks');

const app = express();
app.engine('html', nunjucks.render);
app.set('view engine','html');
app.set('views', globals.viewsDirectory);

экспресс: 4.16.4, нунджак: ^ 3.2.3,

person Alex Egli    schedule 15.07.2021