2013-03-13 1 views
0

Я смешиваю нефрит с рулями, так что мне не нужно писать HTML и иметь хороший синтаксис для связанных с данными материалов.Стоит ли предварительно компилировать jade + handlebars для использования на стороне сервера?

Например, это может быть шаблоном для заголовка, header.handlebars.jade

html 
    {{#with user}} 
    {{if user.username}} 
    header Welcome back, {{username}} 
    {{/if}} 
    {{/with}} 

мне интересно, если я должен перекомпилировать этот шаблон с нефритом, а затем руль, когда я использую его на стороне сервера на Node.js ? Если я этого не сделаю, я в основном собираю этот шаблон 2 раза (первый нефрит, затем руль) по каждому запросу.

Я не совсем уверен, что это играет какую-то роль, но кажется, что оба jade.compile и Handlebars.compile являются синхронными функциями, что означает, что они блокируют другие запросы до тех пор, пока компиляция имеет место.

+0

Jade считается замедленным для некоторых, однако на этот вопрос трудно ответить на любой вопрос. Я предлагаю вам построить тест для конкретного случая и проверить результаты. (Например, количество одновременных подключений на загрузку сервера). Как правило, всегда стоит составлять ваши шаблоны, если вы в состоянии. –

ответ

0

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

  1. Синтаксического
  2. Генерации строки из данных и проанализированного шаблона

Parsing является дорогостоящей операцией. Он состоит в основном из идентификационных токенов (специальных слов) и построения древовидной структуры. Например:

{{#with author}} 
    <h2>By {{firstName}} {{lastName}}</h2> 
{{/with}} 

Этот блок можно рассматривать в виде дерева с заявлением родителя with и нескольких детей "<h2>By ", firstname, lastName и "</h2>".

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

Логика аналогична тому, как вы должны читать некоторые файлы синхронно при запуске своего сервера или читать их каждый раз. Если вы сначала читаете файлы шаблонов, вы делаете меньше операций ввода-вывода, но вы используете больше памяти для хранения содержимого этих шаблонов. То же самое касается разбора.

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

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

+0

Спасибо за ваш тщательный ответ.Собственно, я понимаю обоснование и общую идею прекомпиляции шаблонов (я делаю это для клиентской стороны). Я просто думал, должен ли я предварительно скомпоновать серверную сторону (это не похоже на то, что express + jade предварительно скомпилирован по умолчанию). Что касается смешивания нефрита и рулей - мой выход шаблона Jade на самом деле не зависит от Handlebars. Я всегда разбираю Джейд сначала, а затем Ручки. Я использую Jade только потому, что не хочу писать простой HTML. Однако ваша идея по загрузке шаблонов один раз при запуске приложения и кэшировании их интересна. – ragulka

+0

Да, я должен был объяснить разницу между предварительной компиляцией и компиляцией. Предварительная компиляция в Handlebars на самом деле такая же, как компиляция, но возвращающая исходный код JavaScript как строку вместо исполняемого кода. То есть 'eval (precompile (tpl)) <=> compile (tpl)'. Я уточню свой ответ позже. – juandopazo

 Смежные вопросы

  • Нет связанных вопросов^_^