Что такое предварительная компиляция шаблона javascript?

Я работаю над простым механизмом шаблонов для своей работы в javascript. Он должен быть очень простым, поэтому я не использую рули, усы или любой другой доступный надежный механизм шаблонов.

Я продолжаю читать слова «ПРЕДВАРИТЕЛЬНО» или «КОМПИЛЬНО», чтобы повысить производительность. Но я не уверен, что именно тогда подразумеваю под этим. В своей работе я кэширую html-шаблон в своем объекте, чтобы каждый раз не нажимать на html-шаблон.

Это очень простая функция, которая в основном делает следующее

_template = _template.replace(/\{(.+?)\}/g, function(token, match, number, txt) {
                    return item[match];
                });

item – это объект, содержащий заменяемое значение.

Может кто-нибудь, пожалуйста, скажите мне, что именно это означает, когда они (рули и т. д.) говорят скомпилировать шаблон. ?


person Kamal    schedule 23.11.2012    source источник
comment
я нашел этот пост ejohn.org/blog/javascript-micro-templating после прочтения ответ от @nrabinowitz..   -  person Kamal    schedule 24.11.2012


Ответы (3)


Обычно шаблоны анализируются с помощью regex, а затем преобразуются в function с помощью eval. Это называется шаблон предварительной компиляции.

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

person Inferpse    schedule 23.11.2012

Underscore, Handlebars и большинство других шаблонов JS создают функцию из строки шаблона. Затем вы можете вызвать функцию несколько раз с разными аргументами и получить соответствующую строку HTML. (Я считаю, что и Underscore, и Handlebars делают это, анализируя строку шаблона в коде JS, а затем вызывая конструктор Function, чтобы сделать скомпилированную функцию шаблона.)

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

person nrabinowitz    schedule 23.11.2012

Обновление: здесь я ошибаюсь, см. комментарий ниже.

Допустим, мой шаблон представляет собой предложение с заполненными пробелами:

Однажды ____ решил, что собирается взять с собой _____ на _____.

Компиляция шаблона заполнит пробелы.

В тот день ДЖОН решил, что возьмет с собой САЛЛИ на ПРЕМЬЕРУ БЭТМЕНА.

Метафора надежды полезна в этом случае :)

person Costa Michailidis    schedule 23.11.2012
comment
Нет, это не то, что означают эти библиотеки. То, что вы описываете, представляет собой рендеринг шаблона, а не его компиляцию. - person nrabinowitz; 24.11.2012