Рендерер шаблонов Javascript - PullRequest
       4

Рендерер шаблонов Javascript

0 голосов
/ 07 декабря 2011

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

<ul>
<js>for (var i = 0, l = this.somearray.length; i < l; i++) {</js>
    <li>
        <span><js>print(this.somearray[i].key)</js></span>
        <span><js>print(this.somearray[i].value.toLowerCase())</js></span>
    </li>
<js>}</js>
</ul>

Я думал о разборе этого шаблона с помощью функции ниже.

function parse() {

        var split = template.split(/<js>(.*?)<\/js>/g),
            i, l;

       for (i = 0, l = split.length; i < l; i += 2) {

            var before = split[i],
                content = split[i + 1] || null;

            parsed += before ? 'print(' + JSON.stringify(before) + ');\n' : '';
            parsed += content ? (content + '\n') : '';
        }
    }

это дало бы мне такой результат

print("<ul>\n");
for (var i = 0, l = this.somearray.length; i < l; i++) {
print("\n    <li>\n        <span>");
print(this.somearray[i].key);
print("</span>\n        <span>");
print(this.somearray[i].value.toLowerCase());
print("</span>\n    </li>\n");
}
print("\n</ul>");

функция печати будет выглядеть так

function print(s) {
    output += s;
}

и если я затем отредактирую проанализированный код с помощью eval, результат будет выглядеть следующим образом ...

<ul>
    <li>
        <span>key1</span>
        <span>value1</span>
    </li>
    <li>
        <span>key2</span>
        <span>value2</span>
    </li>
    <li>
        <span>key3</span>
        <span>value3</span>
    </li>
</ul>

Я что-то здесь упускаю? Несколько строк кода, и это быстро, он может кэшировать разобранный JavaScript, поэтому в следующий раз он будет отображаться еще быстрее. Единственное, что я использую eval, который считается злом, но пока я не анализирую ввод пользователя, я думаю, что все должно быть в порядке ... Есть мысли по поводу кода выше ??

Ответы [ 3 ]

3 голосов
/ 07 декабря 2011

Я думаю, что статья Джона Резига о микротемблировании JavaScript поможет вам, так как вы хотите написать свой собственный материал: http://ejohn.org/blog/javascript-micro-templating/

2 голосов
/ 07 декабря 2011

Существует множество шаблонных рамок для JavaScript даже для node.js

Я рекомендую вам использовать doT , он очень оптимизирован и работает на node.js и браузерах.

Чтобы узнать больше о параметрах движка шаблона, посмотрите здесь: http://jsperf.com/dom-vs-innerhtml-based-templating/275

Сравните в себе лучшие преимущества для вашей работы.

2 голосов
/ 07 декабря 2011

Вы пробовали EmbeddedJS ?Это действительно тот шаблонный движок, который вы в настоящее время пытаетесь создать самостоятельно:)

Он чрезвычайно эффективен, в основном компилирует ваши шаблоны в JavaScript (аналогично тому, как вы описали выше), чтобы вы могли отлаживать отрендеренныеHTML, в котором есть все, что нужно, например, удаленная загрузка шаблонов и т. Д. И, самое главное, вы пишете простой JavaScript, а не используете специальные теги для зацикливания, условных предложений и тому подобного ...

Пример "визуализированного" HTML

this.process = (function(_CONTEXT,_VIEW){try { with(_VIEW) { with (_CONTEXT) {var ___v1ew = [];___v1ew.push("<h1>\n");
___v1ew.push("    Account Filtering</h1>\n");
___v1ew.push("<form id=\"accountFilter\">\n");
___v1ew.push("<div class=\"filter\">\n");
___v1ew.push("    <fieldset>\n");
___v1ew.push("        <h1>\n");
___v1ew.push("            Suchkriterien</h1>\n");
___v1ew.push("        <div class=\"full\">\n");
___v1ew.push("            <label class=\"description_left\">\n");
___v1ew.push("                Benutzername:</label>\n");
___v1ew.push("            <input name=\"username\" type=\"text\" class=\"m\">\n");
___v1ew.push("        </div>\n");
___v1ew.push("        <div class=\"full\">\n");
___v1ew.push("            <label class=\"description_left\">\n");
___v1ew.push("                Vorname:</label>\n");
___v1ew.push("            <input name=\"firstname\" type=\"text\" class=\"m\">\n");
___v1ew.push("        </div>\n");
___v1ew.push("        <div class=\"full\">\n");
___v1ew.push("            <label class=\"description_left\">\n");
___v1ew.push("                E-Mail-Adresse:</label>\n");
___v1ew.push("            <input name=\"email\" type=\"text\" class=\"m\">\n");
___v1ew.push("        </div>\n");
___v1ew.push("        <div class=\"buttons\">\n");
___v1ew.push("            <input type=\"submit\" name=\"applyFilter\" value=\"Suche\">\n");
___v1ew.push("            <input type=\"submit\" name=\"btnRemoveFilter\" value=\"Filter löschen\">\n");
___v1ew.push("        </div>\n");
___v1ew.push("    </fieldset>\n");
___v1ew.push("</div>\n");
___v1ew.push("</form>\n");
; return ___v1ew.join('');}}}catch(e){e.lineNumber=null;throw e;}});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...