Шаблоны на стороне клиента + на стороне сервера, мне кажется, что это неправильно, как оптимизировать?

В веб-приложении, которое я делаю, я использую классический Express + Jade для отображения клиентских страниц, а также предоставляю некоторые REST API (скажем: «API списка пользователей»).

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

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

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

ОБНОВЛЕНИЕ: использование jade как на стороне сервера, так и на стороне клиента — хорошая идея, но как разделить/указать? Какая часть отображаемого шаблона должна выполняться при обслуживании страницы, а какая часть будет использоваться клиентом?


person Arnaud Rinquin    schedule 17.04.2012    source источник
comment
Вы можете использовать шаблоны Jade в браузере. Есть много других шаблонизаторов, которые работают как в Node, так и в браузере.   -  person Linus Thiel    schedule 17.04.2012
comment
Я знаю, что jade можно использовать как на стороне клиента, так и на стороне сервера, но как разделить шаблон на стороне клиента и сервера в файле? Как вы говорите процессору Jade на стороне сервера не вычислять клиентскую часть шаблона?   -  person Arnaud Rinquin    schedule 17.04.2012
comment
Я не могу сказать вам, как организовать ваши шаблоны, я решаю это, чтобы шаблоны были простыми, когда я могу, и использовать один и тот же шаблон на сервере и клиенте. Макет всегда отображается только на сервере, в то время как частичные (шаблоны ресурсов) могут отображаться там, где это имеет смысл.   -  person Linus Thiel    schedule 17.04.2012
comment
Частицы могут быть хорошим решением проблемы. Я посмотрю на это.   -  person Arnaud Rinquin    schedule 24.05.2012


Ответы (3)


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

Вопрос в том, как отобразить их на стороне клиента?

Теперь нам просто нужен jade.js на стороне клиента.

Следуйте этому документу: https://github.com/visionmedia/jade#readme

Первый

git clone https://github.com/visionmedia/jade.git

Второй

$ make jade.js ( in fact the project has already compile the file for us )

so we just need to copy this file to the path that we use.

Третий

read my demo below :

<script type='text/javascript' language='javascript' src="lib/jquery-1.8.2.min.js"></script>
<script type='text/javascript' language='javascript' src="lib/jade/jade.js"></script>
<script type='template' id='test'>
ul
  li hello world 
  li #{item}
  li #{item}
  li #{item}
</script>
<script>
  var compileText = $("#test").text();
  console.log( typeof( compileText ) );
  var fn = jade.compile( compileText , { layout : false } );
  var out = fn( {item : "this is item " } );
  console.log( out );
  $("body").append( out );
</script>

Теперь вы можете увидеть результат вывода в теле

hello world
this is item
this is item
this is item

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

Возможно, теперь у вас возникнет другой вопрос. Как написать некоторые коды нефритовых шаблонов в *.jade? Этот документ также предоставляет нам способ сделать это. Это руководство может вам помочь.

index.jade

!!!5
html
  head
   title hello world
  body
    ul#list

    script#list-template(type='template')
      |- for( var i in data )
      |    li(class='list') \#{ data[i].name }
      |- }

index.js

/* you javascript code */
var compileText = $('#list-template').text();
var compile = jade.compile( compileText , { layout : false } );

var data = [{ "name" : "Ben" } , {"name" : "Jack" } , {"name" : "Rose" }];
var outputText = compile( data );

$("#list").append( outputText );
person CashLee李秉骏    schedule 19.12.2012
comment
Я должен был иметь хотя бы тег script с типом «текст/шаблон». Этот ответ на самом деле немного лучше, чем мой автоматический ответ. - person Arnaud Rinquin; 20.12.2012

Используйте механизм шаблонов http://github.com/flatiron/plates, который будет работать как на стороне клиента, так и серверная сторона.

person Pavan Kumar Sunkara    schedule 17.04.2012
comment
Пластины кажутся непростыми в сочетании с экспрессом, и я не хочу переписывать свое приложение на Flatrion (проблема заключается в переписывании, а не в Flatiron). - person Arnaud Rinquin; 17.04.2012
comment
Вы можете написать плагин для тарелок в экспрессе, чтобы имитировать нефрит. Тогда не будет большой проблемой совместить с экспрессом - person Pavan Kumar Sunkara; 17.04.2012
comment
Да, но это все равно не решило бы мой вопрос, у меня была бы та же проблема, что и с нефритом как для клиентской, так и для серверной части: как четко разделить клиентские и серверные шаблоны? - person Arnaud Rinquin; 17.04.2012
comment
Я попробую сделать либу или что-то в этом роде, я уже нашел, как это сделать. - person Arnaud Rinquin; 17.04.2012
comment
Хорошо, я сделал это. Это было тихо просто, но мне не нравится отсутствие логики. Вот github, а вот ссылка на регистрацию npm - person Arnaud Rinquin; 18.04.2012
comment
это работает, но отсутствие логики в тарелках несовместимо с моим приложением без серьезной переделки. Не лучшее решение. Вы заслуживаете моего плюса, хотя ;) - person Arnaud Rinquin; 19.04.2012

Несколько недель назад я написал пакет npm для шаблонов Handlebars, чтобы делиться ими между клиентом и сервером. Это довольно просто, но до сих пор это работало очень хорошо для меня:

https://github.com/jwietelmann/node-handlebars-precompiler

Изменить: я отдельно использую "hbs" в качестве пакета для рендеринга на стороне сервера. Прекомпилятор просто доставляет предварительно скомпилированные шаблоны в мой общедоступный каталог javascripts всякий раз, когда я обновляю свои представления hbs.

person Joel Wietelmann    schedule 23.04.2012
comment
Не заметил вашего ответа раньше, очень интересно! - person Arnaud Rinquin; 12.12.2012