Как мне избежать кода шаблона EJS в файле node.js для оценки на стороне клиента? - PullRequest
2 голосов
/ 26 января 2012

Я использую node.js / ejs на стороне сервера и backbone.js на стороне клиента. Как на стороне сервера, так и на стороне клиента используется один и тот же шаблонный стиль. Таким образом, проблема заключается в том, что если я помещаю код шаблона, предназначенный для клиента, в шаблон, он все равно анализируется на стороне сервера.

Если выяснилось, что что-то подобное работает:

<%- "<%= done ? 'done' : '' %\>" %>

Тем не менее, ИМХО, это ухудшает код таким образом, что делает весь смысл использования шаблонов бесполезным.

Как бы вы подошли к этому?

Есть ли способ определить блоки кода внутри EJS-шаблонов, которые не анализируются как тег {literal}, используемый в других языках шаблонов?

Обновление: На данный момент я использую _.templateSettings магистрали, чтобы использовать различные разделители на стороне клиента.

Обновление: Вот аналогичное решение в контексте JSP: Шаблоны Underscore.js в JSP

Ответы [ 4 ]

3 голосов
/ 24 февраля 2012

Я справился с этим, переопределив открывающие и закрывающие теги на узле, чтобы 2 экземпляра ejs выглядели разными тегами.

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

{open:'<%',close:'%>'}

В моем случае я использую <% и <@ для двух моих версий. Затем в шаблоне узла ejs у меня есть что-то вроде этого (где имя взято из магистрали и каждый, очевидно, из узла): </p>

<% if(everyauth.loggedIn) %><h1><@= name @></h1><% } %>
0 голосов
/ 04 ноября 2016

С новыми ejs вы можете добавить пользовательский разделитель на стороне клиента:

https://github.com/mde/ejs#custom-delimiters

например:

Пользовательские разделители могут применяться для каждого шаблонаили глобально:

var ejs = require('ejs'),
    users = ['geddy', 'neil', 'alex'];

// Just one template
ejs.render('<?= users.join(" | "); ?>', {users: users}, {delimiter: '?'});
// => 'geddy | neil | alex'

// Or globally
ejs.delimiter = '$';
ejs.render('<$= users.join(" | "); $>', {users: users});
// => 'geddy | neil | alex'
0 голосов
/ 16 августа 2012

Я использую backbone.layout.manager на стороне клиента и сервера, потому что я хочу, чтобы мои шаблоны были одинаковыми.

Способ, которым я решил проблему с разделителем шаблонов, состоял в том, чтобы отобразить страницу на стороне сервера, а затем внедрить необработанные базовые шаблоны.

0 голосов
/ 27 января 2012

Что ж, я сейчас подхожу к этому, используя require.js с текстовым плагином;это позволяет мне включать шаблоны с использованием AJAX во время разработки и собирать их все в оптимизированный / минимизированный пакет файлов во время развертывания.

Конечно, если вы не используете require.js для управления зависимостямиостальной части вашего JS-кода это работает не так хорошо, но я больше не могу делать javascript dev без require.js теперь, когда я все равно к этому привык.

Альтернативно, тамЭто могут быть другие похожие технологии, которые вы могли бы использовать для решения той же проблемы.

...