Статьи

Обзор шаблонизаторов JavaScript

Эта статья была рецензирована Крисом Перри и Ритешем Кумаром . Спасибо всем рецензентам SitePoint за то, что сделали контент SitePoint как можно лучше!

В этой статье мы собираемся дать обзор шаблонов в JavaScript. Сначала мы обсудим, что такое шаблоны JavaScript, когда мы должны их использовать и как мы их реализуем, прежде чем углубляться в некоторые подробности, касающиеся некоторых популярных шаблонизаторов. Мы собираемся сосредоточиться на усах , руле и шаблоне jQuery .

Что такое шаблоны JavaScript?

Шаблоны JavaScript — это метод отделения структуры HTML от содержимого, содержащегося в нем. Системы шаблонов обычно вводят некоторый новый синтаксис, но с ними обычно очень просто работать, особенно если мы ранее использовали системы шаблонов где-то еще (например, Twig в PHP). Интересно отметить, что замена токенов обычно обозначается двойными фигурными скобками ( {{ ... }}

Когда мы должны использовать шаблоны JavaScript?

Как только мы обнаружим, что HTML включен в строки JavaScript, мы должны начать думать о том, какие преимущества могут дать нам шаблоны JavaScript. Разделение проблем имеет первостепенное значение при создании поддерживаемой кодовой базы, поэтому следует изучить все, что может помочь нам достичь этого. В интерфейсной веб-разработке это проявляется при отделении HTML от JavaScript (это работает в обоих направлениях, так как мы не должны включать встроенный JavaScript в HTML).

Некоторыми распространенными сценариями, которые могут извлечь выгоду из шаблонов JavaScript, являются веб-приложения в реальном времени (например, приложение для потоковой передачи в реальном времени для комментариев к событиям) или интернационализация (i18n), которые довольно часто требуют, чтобы различный контент отображался с использованием одного и того же форматирования.

Как мы реализуем шаблоны JavaScript?

Мы углубимся в это с конкретными примерами библиотеки, но по сути это так же просто, как включение выбранной библиотеки, выборка нашего шаблона и его рендеринг вместе с некоторыми данными.

Большинство библиотек поддерживают как встроенные, так и внешние шаблоны. Встроенные шаблоны отлично подходят для случаев, когда у нас очень мало шаблонов или мы знаем, что будем использовать включенные шаблоны при каждой загрузке страницы, но в целом наши шаблоны должны быть внешними. Внешние шаблоны приносят много преимуществ, в основном то, что шаблоны никогда не будут загружаться на клиент, если они не нужны странице.

mustache.js

Усы — это многоязычная, не требующая логики система шаблонов. Реализация mustache.js — только одна из многих. Таким образом, как только мы привыкли к (очень простому) синтаксису, мы можем использовать его на разных языках программирования.

Ключевые моменты

  • 9kb размер файла (маленький)
  • просто
  • Нет зависимостей
  • Нет логики
  • Нет предварительно скомпилированных шаблонов
  • Язык программирования не зависит

пример

 <script id="template" type="x-tmpl-mustache">
  <p>Use the <strong>{{power}}</strong>, {{name}}!</p>
</script>
 
//Grab the inline template
var template = document.getElementById('template').innerHTML;

//Parse it (optional, only necessary if template is to be used again)
Mustache.parse(template);

//Render the data into the template
var rendered = Mustache.render(template, {name: "Luke", power: "force"});

//Overwrite the contents of #target with the rendered HTML
document.getElementById('target').innerHTML = rendered;

Как вы можете видеть в этом примере, функция Mustache.render В этом случае мы заменяем переменные namepower Например, переберите массив или используйте специальную функцию рендеринга, которая использует текущее представление в качестве аргумента представления.

mustache.js идеально подходит для небольших проектов и быстрых прототипов, где сложность шаблонов минимальна. Ключевым моментом, который стоит отметить, является то, что мы можем начать проект с mustache.js, а затем легко обновить его до Handlebars.js, поскольку шаблоны (в основном) одинаковы.

Если вы хотите узнать больше о Mustache, ознакомьтесь: Создание HTML-шаблонов с помощью Mustache.js .

Handlebars.js

Handlebars.js построен на основе усов и в основном совместим с шаблонами усов. В двух словах, он предоставляет все, что обеспечивает mustache.js, плюс поддерживает блочные выражения и предварительно скомпилированные шаблоны. Предварительно скомпилированные шаблоны имеют большое значение, так как они увеличивают производительность с большим отрывом (в грубом тесте производительности предварительно скомпилированные шаблоны Handlebars.js визуализируются примерно в два раза быстрее, чем шаблоны Mustache). Блочные выражения позволяют вам включать больше логики в ваши шаблоны; Одним из наиболее распространенных примеров этого являются продвинутые итераторы — например. создайте итератор списка <ul><li> Вы можете прочитать больше о блочных выражениях здесь .

Ключевые моменты

  • Размер файла 86 КБ (большой) или 18 КБ при использовании предварительно скомпилированных шаблонов
  • Блочные выражения (помощники)
  • Предварительно скомпилированные шаблоны
  • Нет зависимостей

пример

 <script id="template" type="text/x-handlebars-template">
  <p>Use the <strong>{{power}}</strong>, {{name}}!</p>
</script>
 
//Grab the inline template
var template = document.getElementById('template').innerHTML;

//Compile the template
var compiled_template = Handlebars.compile(template);

//Render the data into the template
var rendered = compiled_template({name: "Luke", power: "force"});

//Overwrite the contents of #target with the renderer HTML
document.getElementById('target').innerHTML = rendered;

Handlebars.js идеально подходит для проектов, где важна производительность, и мы не очень беспокоимся о добавлении 18 КБ к весу страницы. Это также путь, если мы хотим использовать блочные выражения.

Обратите внимание: чтобы увидеть преимущества производительности Handlebars.js (и значительно уменьшенный размер файла), мы должны использовать предварительно скомпилированные шаблоны . Чтобы сделать это эффективно, мы должны добавить компиляцию шаблона Handlebars.js в наш процесс сборки (для этого у Grunt есть отличный плагин ).

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

Шаблон JQuery

Шаблон jQuery не так популярен, как mustache.js или Handlebars.js, но мы не должны упускать это из виду. Шаблоны отличаются от шаблонов усов, поскольку они представляют собой простой HTML без нового синтаксиса. Вместо методов замены токена он использует атрибуты данных, чтобы указать, где данные должны быть вставлены во фрагмент HTML.

Ключевые моменты

  • Размер файла 7 КБ (маленький)
  • Требуется JQuery (+ 82 КБ)
  • Просто, но отличается от того, как работают Mustache и Handlebars.js
  • Нет предварительно скомпилированных шаблонов

пример

 <script id="template" type="text/html">
  <p>
    Use the <strong data-content="power"></strong>, 
    <span data-content="name"></span>!
  </p>
</script>
 
//Call .loadTemplate() on the target container
$('#target').loadTemplate(
  //Specify the template container (or file name of external template)
  $('#template'),

  //Specify the data to render
  {
    name: "Luke",
    power: "force"
  }
);

Шаблон jQuery идеально подходит для проектов, которые уже включают jQuery, так как размер файла очень мал. Однако, если ваш проект не будет использовать jQuery, тогда трудно рекомендовать учитывать общий размер файла.

Другие опции

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

Underscore.js

Underscore — это популярная библиотека JavaScript, которая предоставляет функции шаблонов среди множества других функций. По умолчанию он не использует синтаксис двойных фигурных скобок, используемый Mustache, вместо этого он выбирает разделители в стиле ERB ( <% ... %>

Встроенные JS-шаблоны (EJS)

Как и Underscore.js, встроенные JS-шаблоны используют синтаксис в стиле ERB для шаблонов. В EJS нужно отметить одну вещь: шаблоны должны быть внешними файлами — они не могут быть встроенными.

Заключительные замечания

Так какой же самый лучший? Как и большинство проблем развития, там нет серебряной пули. Это зависит от многих вещей;

  • Вы уже используете jQuery в своем проекте?
  • С какими системами шаблонов у вас есть предыдущий опыт?
  • Вы хотите сохранить логику в шаблонах?
  • Насколько вас беспокоит общий размер файла подкачки?
  • Насколько вы обеспокоены производительностью / ваш веб-сайт должен поддерживать устройства с низким энергопотреблением?

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

Хотите присоединиться? Пожалуйста, оставьте комментарий ниже!