Pull to refresh

NodeSmarty новый шаблонизатор для node.js (3.beta)

Reading time3 min
Views6K
image Наверно каждый веб-разработчик слышал о шаблонизаторе Smarty (php). Но так как я частенько увлекаюсь JavaScript'ом, то решено было найти подобный шаблонизатор для этого языка, но серверного (node.js, ага). Первые ссылки в поисковике выдают такие шаблонизаторы, как: ECT, JUST, Mu. Все они, естественно, не подходили для меня, т.к. слишком далеко были от синтаксиса Smarty.

Чтож, раз хочется, а решений нет — то сделай. Выискивая время на работе и иногда получая по «шапке», родился проект NodeSmarty, который, в будущем, будет частично копировать синтаксис Smarty.



Итак, свои корни проект пустил примерно 4 месяца назад, в сентябре 2012 года и постепенно обретал рабочий вид. По началу весь алгоритм компиляции шаблонов брался из Smarty (файл Smarty_Compiler.class.php), некоторые функции не были перенесены. В процессе написания кода я делал всевозможные сокращения кода в плане простоты, так как это «мой стиль». Поэтому были заменены все огромные регулярные выражения (да и в них, кстати, всё равно было полно ненужного мусора), часть логики в функциях.

Так как проект необкатанный, то совершенно понятно, что в процессе будет найдено достаточное количество багов. Также уверен, что будут жалобы в сторону обработок ошибок в шаблонах (на данном этапе эта «функция» реализована плохо). Я буду только рад получать сообщения об улучшении кода, и по мере своих возможностей вносить как исправления, так и новые функции.

Примеры работы шаблонизатора:

compiler.js:
var NodeSmarty = require('./NodeSmarty/'); 

var Template = new NodeSmarty(); 

Template
   .setTemplateDir('./templates/')
   .setCompileDir('./compile/')
   .setCacheDir('./cache/');


var Array = ['val1', 'two'];

Template.assign({
   'Value':'first',
   'number':10,
   'array':Array 
});

var Final = Template.fetch('template.tpl', function(data) {
   console.log(data);
}); 


template.tpl:
{include file="header.tpl.html"}

{$Value}

{$number*10/20}

{if !$Value}
   //...
{elseif $number = $Value}
   //...
{else}
   //...
{/if}

{* comment *}

{literal}
for(var di=0; di < 10; di++) {
   console.log(di);
} 
{/literal}

{foreach from=$array item=Foo key=Key}
   Item: {$Foo} key: {$Key}
{/foreach}


Скорость выполнения кода выше, чем у EJS и JUST. Происходит это из-за того, что при повторном запросе файла, вызывается не шаблон, а уже скомпилированный код. Но есть и еще один плюс (хотя его и нет, но будет в будущем) — повышение скорости выполнения также зависит от файловой системы (дада, сначала нужно проверить, не изменились ли шаблоны, перекомпилировать их). Если же компилировать файлы при первом запросе, а при последующих просто выгружать из памяти, то скорость соответственно увеличится, и время выполнения кода станет еще меньше!

Сравнение скорости выполнения кода при 1000 итераций:

сравнение скорости

Немножко о принципе работы.

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

Первым делом парсится документ на наличие открывающего тега: { и закрывающего тега: } (хотя можно и изменить по желанию, см документацию).
Потом каждый тег парсится на главный параметр и атрибуты. Главный параметр также проходит обработку и разбивается на 2 типа: команда или переменная. Переменная отличается от команды впередистоящим знаком доллара ($). И переменная и команда проходят обработку для преобразования себя в рабочий JavaScript код. Скомпилированный код записывается в файл и происходит eval текста (хотя там не eval, а new Function()).

nodesmarty.com Ссылка на проект: NodeSmarty.com

github.com Ссылка на GitHub.com: github.com/lampaa/NodeSmarty

nodejs Ссылка на node.js: node.js
Tags:
Hubs:
Total votes 22: ↑11 and ↓110
Comments33

Articles