bem-xjst
Version:
Declarative Template Engine for the browser and server
183 lines (137 loc) • 7.85 kB
Markdown
# bem-xjst
Декларативный шаблонизатор
[](http://www.npmjs.org/package/bem-xjst)
[](https://travis-ci.org/bem/bem-xjst)
[](https://david-dm.org/bem/bem-xjst)
[](https://david-dm.org/bem/bem-xjst#info=devDependencies)
[](https://coveralls.io/github/bem/bem-xjst?branch=coverage-badge)
## Отличительные черты
### Шаблоны расширяемы: их можно переопределить или доопределить
Вы можете переопределить или расширить шаблоны отвечающие за генерацию отдельных
частей вывода: HTML-тега, HTML-атрибутов или содержимого узла. Например:
```js
block('link')({ tag: 'span' });
// Этот шаблон определяет тег для всех блоков `link`.
// Режим `tag` может быть переопределен по произвольному условию.
block('link').match((node, ctx) => ctx.url)({ tag: 'a' });
// Этот шаблон определяет тег `a` только в случае если в блоке `link` есть поле `url`.
// Иначе тег будет `span`, как определено в предыдущем шаблоне.
```
### Соответствие шаблону (pattern matching)
Для каждого узла входного дерева данных шаблонизатор проверяет условие на
соответствие шаблону.
```js
block('list')({ tag: 'ul' });
block('item')({ tag: 'li' });
```
Для каждого блока `list` выполнится шаблон про тег `ul`. Для каждого блока
`item` — шаблон про тег `li`.
Например для входных данных:
```js
{
block: 'list',
content: [
{
block: 'item',
content: {
block: 'list',
content: [
{ block: 'item', content: 'CSS' },
{ block: 'item', content: 'HTML' }
]
}
},
{
block: 'item',
content: {
block: 'list',
content: [
{ block: 'item', content: 'JS' }
]
}
}
]
}
```
*Результат шаблонизации:*
```html
<ul class="list">
<li class="item">
<ul class="list">
<li class="item">CSS</li>
<li class="item">HTML</li>
</ul>
</li>
<li class="item">
<ul class="list">
<li class="item">JS</li>
</ul>
</li>
</ul>
```
Использовать декларативные шаблоны так же просто как и CSS для HTML.
### Автоматический обход входных данных
По предыдущему примеру вы могли заметить, что bem-xjst автоматически обходит
входные данные заглядывая в поле `content`.
### Рендеринг по умолчанию
Встроенное поведение позволяет вам рендерить данные без шаблонов. Для данных из
примера выше вы получите вот такой результат по умолчанию:
```html
<div class="list">
<div class="item">
<div class="list">
<div class="item">CSS</div>
<div class="item">HTML</div>
</div>
</div>
<div class="item">
<div class="list">
<div class="item">JS</div>
</div>
</div>
</div>
```
Как видите, большую часть работы шаблонизатор сделал за вас. Осталось только
добавить несколько шаблонов для тегов и ваш HTML будет выглядеть вполне
прилично.
### Чистый JS
Шаблонизатор и сами шаблоны используют чистый JavaScript, что позволяет вам
использовать всю мощь JS-инфраструктуры: автоматические
валидаторы кода и инструменты вроде JSHint/ESLint.
### Работает на клиенте и сервере
Вы можете использовать bem-xjst в любом браузере или на любой виртуальной машине
JavaScript. Мы поддерживаем Node.js v0.10 и выше.
## Подробности
Читайте документацию:
1. [О bem-xjst](/docs/ru/1-about.md)
2. [Быстрый старт](/docs/ru/2-quick-start.md)
3. [API: использование, сигнатура и описание методов](/docs/ru/3-api.md)
4. [Формат входных данных](/docs/ru/4-data.md): BEMJSON
5. [Шаблоны: синтаксис](/docs/ru/5-templates-syntax.md)
6. [Шаблоны: контекст](/docs/ru/6-templates-context.md)
7. [Runtime](/docs/ru/7-runtime.md): как выбираются и применяются шаблоны
## Попробуйте
### Online-песочница
[Online demo](https://bem.github.io/bem-xjst/) позволяет вам делится ссылкой на
примеры шаблонов и входных данных.
### Установка npm пакета
Вам потребуется [Node.js](https://nodejs.org/) v0.10 или старше и [npm](https://www.npmjs.com/).
```bash
npm install bem-xjst
```
Скопируйте [пример из документации](https://github.com/bem/bem-xjst/blob/master/docs/ru/2-quick-start.md#Простой-пример) или смотрите [простой пример](https://github.com/bem/bem-xjst/tree/master/examples/simple-page) в репозитории. Затем прочитайте [документацию](https://github.com/bem/bem-xjst/blob/master/docs/ru/) и начинайте экспериментировать с шаблонизатором.
## bem-xjst используется в продакшене?
Да. Проекты компаний [Яндекс](https://company.yandex.ru/) и Альфа-Банк, а так же оперсорс проекты основанные на [bem-core](https://github.com/bem/bem-core) и [bem-components](https://github.com/bem/bem-components), которые тоже используют bem-xjst.
## Тест на производительность
См. [readme](https://github.com/bem/bem-xjst/tree/master/bench).
## Runtime линтер
См. [readme](https://github.com/bem/bem-xjst/tree/master/runtime-lint).
## Статический линтер и автоматическая миграция шаблонов
См. [readme](https://github.com/bem/bem-xjst/tree/master/migration).
## Ссылки
* [Документация на bem.info](https://ru.bem.info/platform/bem-xjst/)
* [Changelog](CHANGELOG.md) и [описание релизов](https://github.com/bem/bem-xjst/releases)
* [Гайд для контрибьюторов](https://github.com/bem/bem-xjst/blob/master/CONTRIBUTING.md)
* [Онлайн демо](https://bem.github.io/bem-xjst/) (you can share code snippets)
* Twitter аккаунт: [@bemxjst](https://twitter.com/bemxjst)
* [Гайд по миграции](https://github.com/bem/bem-xjst/wiki/Migration-guides) для всех мажорных версий