Использование HTML в Express вместо Jade

103

Как мне избавиться от Jade при использовании Express с Node.JS? Я хочу использовать простой HTML. В других статьях я видел, что люди рекомендовали app.register (), который теперь устарел в последней версии.

Санчит Гупта
источник

Ответы:

78

Сделать это можно так:

  1. Установите ejs:

    npm install ejs
  2. Установите свой шаблонизатор в app.js как ejs

    // app.js
    app.engine('html', require('ejs').renderFile);
    app.set('view engine', 'html');
  3. Теперь в вашем файле маршрута вы можете назначить переменные шаблона

    // ./routes/index.js
    exports.index = function(req, res){
    res.render('index', { title: 'ejs' });};
  4. Затем вы можете создать свое представление html в каталоге / views.

Бивек
источник
2
Я только начал использовать node.js. Решение мне непонятно. У меня есть небольшой html-сайт. Мне нужен node.js для отправки писем через мой сайт с помощью nodemailer. Все необходимое я установил. Однако нужно представить, что должно быть в файле app.js, чтобы мой веб-сайт работал с использованием express
user2457956
4
Как распечатать переменную titleв html файле?
Мастер Йода,
3
Если кто-то все еще задается вопросом, как распечатать переменную, как спросил @MasterYoda, вы можете распечатать ее вот так в html: <% = title%>
Лукас Майне
62

Jade также принимает html-ввод.
Просто добавьте точку в конец строки, чтобы начать отправку чистого html.
Если это помогает, попробуйте:

doctype html              
html. // THAT DOT
    <body>     
        <div>Hello, yes this is dog</div>
    </body>

PS - Не нужно закрывать HTML - Джейд делает это автоматически.

Мартин Сукаэль
источник
7
Doctype 5 устарел. Используйте «doctype html» в качестве первой строки.
snorkelzebra
Документы для точки: pugjs.org/language/plain-text.html#block-in-a-tag
Александр Таубенкорб,
18

Что касается экспресса 3, вы можете просто использовать response.sendFile

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});)

Из официальной справки по экспресс-API :

res.sendfile(path, [options], [fn]])

Передайте файл по указанному пути.

Автоматически устанавливает значение по умолчанию для поля заголовка ответа Content-Type на основе расширения имени файла. Обратный вызов fn(err)вызывается, когда передача завершена или при возникновении ошибки.

Предупреждение

res.sendFileпредоставляет кэш на стороне клиента через заголовки кеша http, но не кэширует содержимое файла на стороне сервера. Приведенный выше код будет попадать на диск при каждом запросе .

лаконичный бас
источник
2
Я считаю, что OP все еще хочет использовать какой-то шаблон, просто с обычным синтаксисом HTML. sendfileне позволяет вам создавать какие-либо шаблоны, так как он просто отправляет байты из файла. Кроме того, я бы не рекомендовал использовать sendfileэто, потому что это означает, что вы будете попадать на диск каждый раз, когда приходит запрос - огромное узкое место. Для страниц с высокой посещаемостью вам действительно следует выполнять кэширование в памяти.
josh3736
1
@ josh3736, если вы правы в отношении намерения OP, вопрос следует улучшить. Вы правы, попадая на диск при каждом запросе, я улучшу свой ответ, чтобы предупредить об этом факте. Пожалуйста, подумайте об улучшении вашего, чтобы предупредить о следующем: если вы реализуете индивидуальный движок, вы должны также реализовать функцию перехвата (при желании), это не обрабатывается экспрессом.
laconbass
17

На мой взгляд, использование чего-то такого большого, как ejs, только для чтения html-файлов - это немного тяжеловесно. Я просто написал свой собственный шаблонизатор для html-файлов, который удивительно прост. Файл выглядит так:

var fs = require('fs');
module.exports = function(path, options, fn){
    var cacheLocation = path + ':html';
    if(typeof module.exports.cache[cacheLocation] === "string"){
        return fn(null, module.exports.cache[cacheLocation]);
    }
    fs.readFile(path, 'utf8', function(err, data){
        if(err) { return fn(err); }
        return fn(null, module.exports.cache[cacheLocation] = data);
    });
}
module.exports.cache = {};

Я назвал свой htmlEngine, и вы его используете, просто говоря:

app.engine('html', require('./htmlEngine'));
app.set('view engine', 'html');
kevin.groat
источник
11

app.register()не был обесценен, его просто переименовали, app.engine()поскольку Express 3 меняет способ обработки шаблонов .

Для совместимости с шаблонизатором Express 2.x требовался экспорт следующих модулей:

exports.compile = function(templateString, options) {
    return a Function;
};

Механизмы шаблонов Express 3.x должны экспортировать следующее:

exports.__express = function(filename, options, callback) {
  callback(err, string);
};

Если механизм шаблонов не предоставляет этот метод, вам не повезло, app.engine()метод позволяет вам сопоставить любую функцию с расширением. Предположим, у вас есть библиотека уценки и вы хотите визуализировать файлы .md, но эта библиотека не поддерживает Express, ваш app.engine()вызов может выглядеть примерно так:

var markdown = require('some-markdown-library');
var fs = require('fs');

app.engine('md', function(path, options, fn){
  fs.readFile(path, 'utf8', function(err, str){
    if (err) return fn(err);
    str = markdown.parse(str).toString();
    fn(null, str);
  });
});

Если вы ищете механизм шаблонов, который позволяет использовать «простой» HTML, я рекомендую doT, потому что он очень быстрый .

Конечно, имейте в виду, что модель представления Express 3 оставляет кеширование представлений на ваше усмотрение (или на ваш механизм шаблонов). В производственной среде вы, вероятно, захотите кэшировать свои представления в памяти, чтобы не выполнять дисковый ввод-вывод при каждом запросе.

josh3736
источник
Пожалуйста, взгляните на мой ответ, ваш отлично объясняет, как регистрировать движки шаблонов, но есть гораздо более простой способ передачи простых файлов html.
laconbass
@ josh3736: Ваша «очень быстрая» гиперссылка работает в Firefox 41, но не позволяет запускать тесты в Chromium версии 45.0.2454.101 Ubuntu 14.04 (64-разрядная версия). Интересно, почему.
Лонни Бест
4

Чтобы заставить движок рендеринга принимать html вместо jade, вы можете выполнить следующие шаги;

  1. Установите Consolidate и перейдите в свой каталог.

     npm install consolidate
     npm install swig
  2. добавьте следующие строки в файл app.js

    var cons = require('consolidate');
    
    // view engine setup
    app.engine('html', cons.swig)
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', html');
  3. добавьте свои шаблоны представлений в виде .html в папку «views». Перезагрузите сервер узла и запустите приложение в браузере.

Хотя это будет отображать HTML без каких-либо проблем, я бы порекомендовал вам использовать JADE, изучив его. Jade - потрясающий шаблонизатор, изучение которого поможет вам улучшить дизайн и масштабируемость.

АнандШанбхаг
источник
1
Единственная действительно большая проблема с Jade - это углубление. Если вы ошибетесь, код не скомпилируется. Кроме того, мне интересно, почему Джейд, кроме того факта, что единственное, что он делает, это сжимает код ...
zapper
4

сначала проверьте совместимость версии механизма шаблонов, используя строку ниже

express -h

тогда вам не нужно использовать представление из списка. выберите no view

express --no-view myapp

теперь вы можете использовать все свои HTML, CSS, JS и изображения в общей папке.

Субхагья Кумар Барик
источник
3

Что ж, похоже, вы хотите обслуживать статические файлы. И для этого есть страница http://expressjs.com/en/starter/static-files.html

Странно, что никто не ссылается на документацию.

S Meaden
источник
«Странно, что никто не ссылается на документацию» Я согласен, что использовать другой язык представления в Express - нетрудно.
пиксель 67
1

Учитывая, что у вас уже есть маршруты или вы знаете, как это сделать.

app.get('*', function(req, res){
    res.sendfile('path/to/your/html/file.html');
});

ПРИМЕЧАНИЕ: этот маршрут должен быть размещен после всех остальных, поскольку * принимает все.

Жоао Родригеш
источник
1

поскольку Jade поддерживает HTML, если вы просто хотите иметь .html ext, вы можете сделать это

// app.js
app.engine('html', require('jade').renderFile);
app.set('view engine', 'html');

тогда вы просто меняете файл в представлениях с jade на html.

Вейцзин Джей Лин
источник
Разве перед разметкой html не нужно ставить точку или точку?
Гас Кроуфорд
-10

Если вы хотите использовать простой html в nodeJS, без использования jade .. или чего-то еще:

var html = '<div>'
    + 'hello'
  + '</div>';

Лично меня это устраивает.

Преимущество - простота при управлении. Вы можете использовать некоторые приемы, например '<p>' + (name || '') + '</p>', троичные и т. Д.

Если вам нужен код с отступом в браузере, вы можете сделать:

+ 'ok \
  my friend \
  sldkfjlsdkjf';

и используйте \ t или \ n по желанию. Но я предпочитаю без него, плюс он быстрее.


источник
Я хотел бы иметь возможность использовать HTML-файлы в Express (вместо простого Node.JS)
Санчит Гупта
ooooohh извините (я француз: p), так что вы можете использовать fsмодуль. fs.readFile(htmlfile, 'utf8', function (err, file) {