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

от автора

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

ссылка на оригинал статьи http://habrahabr.ru/post/169161/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *