Сейчас я вижу всего два варианта шаблонов в js приложениях шаблонизаторы которые встроены в фреймворк и jquery лапшу (последнее самое распространённое) Я полагаю что это из-за того что многие не понимают как работают шаблонизаторы вообще (я о их внутренностях, а не о функции ).
В этой статья я покажу как сделать простой но мощный шаблонизатор на основе регулярных выражений.
Но для тех кто не в теме немного о том что же это такое и что оно нам даст.
Шаблонизатор (в web) — программное обеспечение, позволяющее использовать html-шаблоны для генерации конечных html-страниц. Основная цель использования шаблонизаторов — это отделение представления данных от исполняемого кода. Часто это необходимо для обеспечения возможности параллельной работы программиста и дизайнера-верстальщика. Использование шаблонизаторов часто улучшает читаемость кода и внесение изменений во внешний вид, когда проект целиком выполняет один человек.
И так мы хотим рендить шаблоны в 1 проход и иметь представление отдельно от логики. Обычно шаблонизаторы имеют подобный интерфейс.
template.Run("template url", {
VarName:"VarValue"
} );
Ниже код с подробными комментариями (что и почему)
<div id="page"></div>
<script>
window.template = {
//заружает представление
TemplateGet: function (TemplateUrl) {
// 1. Создаём новый объект XMLHttpRequest
var xhr = new XMLHttpRequest();
// 2. Конфигурируем его: GET-запрос на URL "TemplateUrl"
xhr.open('GET', TemplateUrl, false);
// 3. Отсылаем запрос
xhr.send();
if (xhr.status >= 200 && xhr.status < 400) {
// вернуть результат
return xhr.responseText;
} else {
// обработать ошибку
alert( xhr.status + ': ' + xhr.statusText ); // пример вывода: 404: Not Found
return "";
}
},
//класс функций для рендинга
Render:{
//а в этом классе мы напишем все функции рендера
func:{
//рендит переменные
vars : function(html, vars){
//ищем все переменные в шаблоне
var $ = html.match(/{{var.(.*?)}}/g);
//проверяем нашли ли что то
if (Array.isArray($)) {
//мы нашли переменные в шаблоне. Необходимо их все распарсить.
$.forEach(function (item) {
//item содержит найденую строку {{var.VarName}}
//по этому мы должны распарсить ету строку дабы получить только VarName
item = item.replace("{{var.", "");
item = item.replace("}}", "");
//у нас есть имя переменной. Пора проверить передали ли мы такую
//и обработать ошибки
if (vars[item] === undefined){
//перенную не передали.
//пишем об ошибке в консоль и заменяем её значение в шаблоне на null
console.warn("Переменная "+item+" не найдена");
html = html.replace("{{var." + item + "}}", "null");
} else {
//переменную мы нашли. Вставим ка её в шаблон
html = html.replace("{{var." + item + "}}", vars[item]);
}
});
}
//удалим обьект с переменными
delete vars;
//вернём html
return html;
}
},
//точка входа в рендер.
Run:function(html, vars){
html = this.func.vars(html, vars);
return html;
}
},
//точка входа
Run: function (TemplateUrl, vars) {
//загружаем шаблон
var html = this.TemplateGet(TemplateUrl);
//отправляем шаблон рендеру
html = this.Render.Run(html, vars);
//удаляем обьект с переменными. Он нам больше не нужен, а может занимать много места
delete vars;
//результат шаблонизатор вставит в <div id="page"></div>
document.getElementById("page").innerHTML = html;
}
};
//вызовем представление
template.Run("test.tpl", {
VarName : "test"
});
</script>
А в test.tpl просто напишем
{{var.VarName}}
Я надеюсь теперь меньше станет jquery лапши )
Поделиться с друзьями