Источник: автор

Шаблонные движки уже являются великим изобретением — это то, что я снова заметил, когда недавно работал над личным проектом с handlebars.js и Express.

Особенно большие веб-сайты с динамическими функциями и большим количеством контента могут быть очень сложными в обслуживании, если вы просто начнете писать HTML-код примитивным способом.

Чтобы решить эту проблему, вам не нужно использовать интерфейсные фреймворки, чтобы разбить все на повторно используемые компоненты.

Вот несколько практических функций handlebars.js, которые в сочетании с Express.js доставляют массу удовольствия и делают разработку веб-сайтов намного более удобной.

Давайте установим handlebars.js для Express.js.

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

Движки шаблонов в основном известны из внешнего интерфейса. Например, Handlebars, который часто ассоциируется с Mustache.js, также можно использовать во внешнем интерфейсе. С современными серверными платформами, такими как Express.js, вы также можете войти в мир Node.js.

Такой движок предоставляет шаблон для сервера, который необходимо заполнить конкретными данными для готового приложения. Когда пользователь запрашивает сервер, сервер обрабатывает шаблон и заполняет его. Пользователь ничего не замечает; он получает только готовую веб-страницу.

Таким образом, механизмы шаблонов идеально подходят для создания динамических веб-сайтов, которым не нужно отправлять тонны JS-кода пользователю, так что интерфейс можно использовать, например, для вызовов API.

Вычислительная нагрузка ложится на сервер. Кроме того, механизмы шаблонов делают разработку веб-приложений очень простой и эффективной. Вы можете разбить части на компоненты, как если бы вы использовали интерфейсную структуру, такую ​​​​как React или Angular.

Достаточно причин, чтобы посмотреть, как мы можем облегчить себе жизнь с помощью handlebars.js.

Сначала создайте новый каталог для нашего проекта. Затем установите то, что необходимо:

Передача данных и цикл через них

Затем создайте каталог /views.
Это папка, в которой express-handlebars будет искать шаблоны по умолчанию.

npm install -y npm install express express-handlebars

В папке views мы создаем папку layout, которая также используется экспресс-рулями по умолчанию. В этой папке мы создаем main.handlebars — он служит компонентом-оболочкой.

Все, что мы там напишем, будет отображаться под каждым маршрутом нашего окончательного веб-приложения — поэтому оно идеально подходит для встраивания тегов SEO и импорта файлов, таких как CSS и JS.

Оставьте main.handlebars так: {{{body}}}

Это означает, что мы хотим включить сюда весь код, который фактически предоставляет handlebars.

Окончательная файловая структура:

app.js:

├── app.js
├── package-lock.json
└── views
    ├── index.handlebars
    └── layouts
        └── main.handlebars

Напишите что-нибудь в index.handlebars, запустите сервер, и вы должны увидеть работающий проект.

const express = require(‘express’);const exphbs = require(‘express-handlebars’);const app = express();app.engine(‘handlebars’, exphbs());app.set(‘view engine’, ‘handlebars’);app.get(‘/’, function (req, res) {
  res.render(“index”);
});app.listen(8080);

Давайте взглянем на первую интересную функцию, облегчающую разработку.

Передать данные из Express в handlebars очень просто.
Функция рендеринга express-handlebars получает объект в качестве второго параметра, содержащего все данные, которые мы хотим предоставить.

Условия

index.handlebars:

let names = ["Max", "Tom", "Anna"]app.get(‘/’, function (req, res) {
  res.render(“index”, {
    students: names
  });
});

Результат:

<h1>Students:</h1>
<ul>
  {{#each students}}
    <li>{{this}}</li>
  {{/each}}
</ul>

Основные вещи. А как насчет более сложных объектов?

Расскажем еще немного о наших студентах:

Измененный index.handlebars:

let people = [
  {name: “Max”, age: 21},
  {name: “Tom”, age: 19},
  {name: “Anna”, age: 25}
]

Результат:

<ul>
  {{#each students}}
    <li>{{this.name}}, {{this.age}}</li>
  {{/each}}
</ul>

В моем текущем побочном проекте для развлечения у меня возникла проблема, заключающаяся в том, что я не только хотел отобразить что-то в истинном условии — также, если это условие ложно, что-то еще должно отображаться в другом месте.

Проверить условие на истинность — если

Да, звучит сложно, но на самом деле это не так — вот реальный пример:

Источник: «codingcheats.io»

Слева, а также справа, под кодом JavaScript, вы видите одно и то же информационное окно — разумеется, оба окна имеют одинаковые CSS-стили.

Но с левой стороны коробка по-прежнему закруглена в верхних углах. Благодаря условным выражениям в handlebars мне не нужно создавать один компонент для обоих, но я могу решить это следующим образом:

Так что я могу везде использовать один и тот же компонент инфобокса и, в особых случаях, рули автоматически, с проверкой.
Конечно, нужно использовать условные операторы; вот как это сделать с рулем:

  • Если исходный код не передается, то информационное окно отображается отдельно.
  • Как решить проблему с закругленными углами? Также в самом компоненте инфобокса проверяется, предоставлен ли исходный код для отображения.
  • В случае, если исходный код не передается, информационному окну передается другой класс CSS, который закругляет верхние углы.
  • Предоставление содержимого, которое затем отображается между нашими тегами HTML.

Поэтому немного изменим app.js:

Разница между ‘{{ }}’ и ‘{{{ }}}’

index.handlebars:

let person = {
  name: “Max”,
  adult: false
}app.get(‘/’, function (req, res) {
  res.render(“index”, {
    person: person
  });
});

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

{{#if person.adult}}
  <p>person is an adult</p>
{{/if}}

Теперь вы должны увидеть «не взрослый». на вебсайте.

{{#unless person.adult}}
  <p>not an adult.</p>
{{/unless}}

Это распространенная ошибка, которую совершают многие новички на руле. Если мы хотим передать что-то с рулем в наш шаблон, мы можем сделать это двумя способами:

Спасибо за чтение!

Вот пример, чтобы показать это:

  • Структуры HTML, которые также отображаются правильно.
  • «https://www.5kat.com/bat/a1/suba-Netherlands-Bosnia-cbn-00.html»
    «https://www.5kat.com/bat/a1/suba-Netherlands- Босния-cbn-01.html»
    «https://www.5kat.com/bat/a1/suba-Netherlands-Bosnia-cbn-02.html»
    «https://www. 5kat.com/bat/a1/suba-Нидерланды-Босния-cbn-03.html»
    «https://www.5kat.com/bat/a1/suba-Suomi-Bulgaria-cbn-00.html »
    «https://www.5kat.com/bat/a1/suba-Suomi-Bulgaria-cbn-01.html»
    «https://www.5kat.com/bat/a1 /suba-Suomi-Bulgaria-cbn-02.html»
    «https://www.5kat.com/bat/a1/suba-Suomi-Bulgaria-cbn-03.html»
    «https ://www.5kat.com/bat/a1/suba-Wales-v-Ireland-cbn-00.html»
    «https://www.5kat.com/bat/a1/suba-Wales- v-Ireland-cbn-01.html»
    «https://www.5kat.com/bat/a1/suba-Wales-v-Ireland-cbn-02.html»
    «https: //www.5kat.com/bat/a1/suba-Wales-v-Ireland-cbn-03.html»
    «https://sv.tie.org/sv/go/suba-The-Masters -Golf-2020-cbn-00.html»
    «https://sv.tie.org/sv/go/suba-The-Masters-Golf-2020-cbn-01.html»
    «https://sv.tie.org/ sv/go/suba-The-Masters-Golf-2020-cbn-02.html»
    «https://sv.tie.org/sv/go/suba-The-Masters-Golf-2020-cbn -03.html»
    «http://landrover.gi/land/go/suba-The-Masters-Golf-2020-cbn-00.html»
    «http://landrover.gi /land/go/suba-The-Masters-Golf-2020-cbn-01.html»
    «http://landrover.gi/land/go/suba-The-Masters-Golf-2020-cbn- 02.html»
    «http://landrover.gi/land/go/suba-The-Masters-Golf-2020-cbn-03.html»
    «http://landrover.gi/ land/lu/srs-qv-d00.html»
    «http://landrover.gi/land/lu/srs-qv-d01.html»
    «http://landrover.gi/ land/lu/srs-qv-d02.html»
    «http://landrover.gi/land/lu/srs-qv-d03.html»
    «https://ayf.com/ ayf/bk/srs-qv-d00.html»
    «https://ayf.com/ayf/bk/srs-qv-d01.html»
    «https://ayf.com/ ayf/bk/srs-qv-d02.html»
    «https://ayf.com/ayf/bk/srs-qv-d03.html»
    «https://ayf.com/ ayf/agu/suba-Нидерланды-Босния-cbn-00.html»
    «https://ayf.com/ayf/agu/suba-Нидерланды-Босния-cbn-01.html»
    « https://ayf.com/ayf/agu/suba-Nether lands-Bosnia-cbn-02.html»
    «https://ayf.com/ayf/agu/suba-Netherlands-Bosnia-cbn-03.html»
    «https://ayf. com/ayf/agu/suba-Suomi-Bulgaria-cbn-00.html»
    «https://ayf.com/ayf/agu/suba-Suomi-Bulgaria-cbn-01.html»
    > «https://ayf.com/ayf/agu/suba-Suomi-Bulgaria-cbn-02.html»
    «https://ayf.com/ayf/agu/suba-Suomi-Bulgaria-cbn -03.html»
    «https://ayf.com/ayf/agu/suba-Wales-v-Ireland-cbn-00.html»
    «https://ayf.com/ayf /agu/suba-Wales-v-Ireland-cbn-01.html»
    «https://ayf.com/ayf/agu/suba-Wales-v-Ireland-cbn-02.html»
    «https://ayf.com/ayf/agu/suba-Wales-v-Ireland-cbn-03.html»
    «https://www. 5kat.com/bat/a1/Neder-Bosnie-liv-Gua00.html»
    «https://www.5kat.com/bat/a1/Neder-Bosnie-liv-Gua01.html»
    > «https://www.5kat.com/bat/a1/Neder-Bosnie-liv-Gua02.html»
    «https://www.5kat.com/bat/a1/Neder-Bosnie-liv -Gua03.html»
    «https://www.5kat.com/bat/a1/Neder-Bosnie-liv-Gua04.html»
    «https://www.5kat.com/bat /a1/Neder-Bosnie-liv-Gua05.html»
    «https://www.5kat.com/bat/a1/Wales-v-Ire-liv-Jeniva-Smn00.html»
    «https://www.5kat.com/bat/a1/Wales-v-Ire-liv-Jeniva-Smn01.html»
    «https://www.5kat.com/bat/a1/Wales- v-Ire-liv-Jeniva-Smn02.html»
    «https://www.5kat.com/bat/a1/Wales-v-Ire-liv-Jeniva-Smn03.html»
    « https://www.5kat.com/bat/a1/Wales-v-Ire-liv-Jeniva-Smn04.html»
    «https://www.5kat.com/bat/a1/Wales-v -Ire-liv-Jeniva-Smn05.html»
    «https://www.5kat.com/bat/a1/Wales-v-Ire-liv-Jeniva-Smn06.html»
    «https ://ayf.com/ayf/agu/Suomi-Bulgaria-xxx0.html»
    «https://ayf.com/ayf/agu/Suomi-Bulgaria-xxx1.html»
    «https ://ayf.com/ayf/agu/ Suomi-Bulgaria-xxx2.html»
    «https://ayf.com/ayf/agu/Suomi-Bulgaria-xxx3.html»
    «https://ayf.com/ayf/agu/ Suomi-Bulgaria-xxx4.html»
    «https://ayf.com/ayf/agu/Suomi-Bulgaria-xxx5.html»
    «https://ayf.com/ayf/bk/ Тим-в-Циципас-лив-Мара-де000.html»
    «https://ayf.com/ayf/bk/Тием-в-Циципас-лив-Мара-де001.html»
    « https://ayf.com/ayf/bk/Тием-в-Циципас-лив-Мара-де002.html»
    «https://ayf.com/ayf/bk/Тием-в-Циципас-лив -Mara-de003.html»
    «https://ayf.com/ayf/bk/Thiem-v-Tsitsipas-liv-Mara-de004.html»
    «https://ayf.com /ayf/bk/Thiem-v-Tsitsipas-liv-Mara-de005.html»
    «https://ayf.com/ayf/bk/Thiem-v-Tsitsipas-liv-Mara-de006.html»
    «https://www.5kat.com/bat/a1/Wales-v-Ireland-liv-hd-tvc-uk-001.html»
    «https://www.5kat. com/bat/a1/Wales-v-Ireland-liv-hd-tvc-uk-002.html»
    «https://www.5kat.com/bat/a1/Wales-v-Ireland-liv -hd-tvc-uk-003.html»
    «https://www.5kat.com/bat/a1/Wales-v-Ireland-liv-hd-tvc-uk-004.html»
    «https://www.5 kat.com/bat/a1/Уэльс-v-Ирландия-liv-hd-tvc-uk-005.html»
    «https://www.5kat.com/bat/a1/Уэльс-v-Ирландия -liv-hd-tvc-uk-006.html»
    «https://www.5kat.com/bat/a1/Wales-v-Ireland-liv-hd-tvc-uk-007.html»
    «https://www.5kat.com/bat/a1/Wales-v-Ireland-liv-hd-tvc-uk-008.html»
    «https://www.5kat. com/bat/a1/Wales-v-Ireland-liv-hd-tvc-uk-009.html»
    «https://www.5kat.com/bat/a1/Wales-v-Ireland-liv -hd-tvc-uk-010.html»
    «https://ayf.com/ayf/agu/Wales-v-Ireland-liv-hd-tvc-uk-001.html»
    «https://ayf.com/ayf/agu/Wales-v-Ireland-liv-hd-tvc-uk-002.html»
    «https://ayf.com/ayf/agu/Wales- v-Ireland-liv-hd-tvc-uk-003.html»
    «https://ayf.com/ayf/agu/Wales-v-Ireland-liv-hd-tvc-uk-004.html »
    «https://ayf.com/ayf/agu/Wales-v-Ireland-liv-hd-tvc-uk-005.html»
    «https://ayf.com/ayf /agu/Wales-v-Ireland-liv-hd-tvc-uk-006.html»
    «https://ayf.com/ayf/agu/Wales-v-Ireland-liv-hd-tvc- uk-007.html»
    «https://ayf.com/ayf/agu/Wales-v-Ireland-liv-hd-tvc-uk-008.html»
    «https://ayf.com/ayf/agu/Wales-v-Ireland-liv-hd-tvc-uk-009.html»
    «https://ayf.com/ayf/agu/ Уэльс-v-Ирландия-liv-hd-tvc-uk-010.html»
    «https://ayf.com/ayf/bk/tt-Thiem-v-Tsitsipas-liv-tv-11.html »
    «https://ayf.com/ayf/bk/tt-Thiem-v-Tsitsipas-liv-tv-12.html»
    «https://ayf.com/ayf/bk /tt-Thiem-v-Tsitsipas-liv-tv-13.html»
    «https://ayf.com/ayf/bk/tt-Thiem-v-Tsitsipas-liv-tv-14.html»
    «http://landrover.gi/land/lu/tt-Thiem-v-Tsitsipas-liv-tv-11.html»
    «http://landrover.gi/land/lu/ tt-Thiem-v-Tsitsipas-liv-tv-12.html»
    «http://landrover.gi/land/lu/tt-Thiem-v-Tsitsipas-liv-tv-13.html»< br /> «http://landrover.gi/land/lu/tt-Thiem-v-Tsitsipas-liv-tv-14.html»
    «https://ayf.com/ayf/agu/Wales -v-Ire-liv-Jeniva-Smn00.html»
    «https://ayf.com/ayf/agu/Wales-v-Ire-liv-Jeniva-Smn01.html»
    «https ://ayf.com/ayf/agu/Wales-v-Ire-liv-Jeniva-Smn02.html»
    «https://ayf.com/ayf/agu/Wales-v-Ire-liv- Jeniva-Smn03.html»
    «https://ayf.com/ayf/agu/Wales-vI re-liv-Jeniva-Smn04.html»
    «https://ayf.com/ayf/agu/Wales-v-Ire-liv-Jeniva-Smn05.html»
    «https:// ayf.com/ayf/agu/Wales-v-Ire-liv-Jeniva-Smn06.html»
    «https://ayf.com/ayf/agu/Neder-Bosnie-liv-Gua00.html»< br /> «https://ayf.com/ayf/agu/Neder-Bosnie-liv-Gua01.html»
    «https://ayf.com/ayf/agu/Neder-Bosnie-liv-Gua02 .html»
    «https://ayf.com/ayf/agu/Neder-Bosnie-liv-Gua03.html»
    «https://ayf.com/ayf/agu/Neder-Bosnie -liv-Gua04.html»
    «https://ayf.com/ayf/agu/Neder-Bosnie-liv-Gua05.html»
    «http://landrover.gi/land/lu /Thiem-v-Tsitsipas-liv-Mara-de000.html»
    «http://landrover.gi/land/lu/Thiem-v-Tsitsipas-liv-Mara-de001.html»
    «http://landrover.gi/land/lu/Thiem-v-Tsitsipas-liv-Mara-de002.html»
    «http://landrover.gi/land/lu/Thiem-v-Tsitsipas- liv-Mara-de003.html»
    «http://landrover.gi/land/lu/Thiem-v-Tsitsipas-liv-Mara-de004.html»
    «http://landrover. gi/land/lu/Thiem-v-Tsitsipas-liv-Mara-de005.html»
    «http://land

index.handlebars: {{content}}

let content = “<b>I am bold text</b>”app.get(‘/’, function (req, res) {
  res.render(“index”, {
    content: content
  });
});

Это приведет к отображению в виде текста:

3 фигурные скобки вместо 2 заставят руль рассматривать содержимое как действительный HTML-код:

В своем стороннем проекте я использовал это, когда хотел выделить курсивом или жирным шрифтом слова для заголовков шпаргалок по коду.

{{{content}}} :

«Присоединяйтесь к моему списку рассылки, чтобы оставаться на связи со мной»

JavaScript на простом английском

Понравилась эта статья? Если да, то получите больше похожего контента, подписавшись на Decoded, наш канал на YouTube!

Если для отображения передается какой-либо исходный код, он автоматически отображается над информационным полем.

Источник: автор