# Шаблонизатор LoDash В этой главе мы рассмотрим *шаблонизацию* -- удобный способ генерации HTML-структуры для виджета и её реализацию при помощи библиотеки [LoDash](http://lodash.com). [cut] Все виджеты можно условно разделить на три группы по генерации DOM-структуры:
  1. **Получают готовый HTML/DOM и "оживляют" его.** Это типичный случай в сайтах, где JavaScript -- на ролях "второго помощника". Разметка, CSS уже есть, от JavaScript, условно говоря, требуются лишь обработчики, чтобы менюшки заработали.
  2. **Создают DOM для компоненты самостоятельно.** В ряде случаев даже на простых страницах нужно генерировать DOM динамически. Например, виджет "подсказка" при наведении на элемент создаёт красивую подсказку и показывает её. Элемент генерируется в JavaScript-коде. В более сложных интерфейсах компоненты генерируют свой DOM на основе данных, полученных с сервера или из других источников.
  3. **=1+2: должны уметь как "оживить" уже готовый DOM, так и создать свой.** Бывает и так, что виджет должен уметь и то и другое. Например, так работает Twitter, который при загрузке сразу показывает текущие сообщения (HTML генерируется на сервере), но может динамически добавлять новые. Браузер быстро скачивает HTML и отображает его, посетитель видит текущие сообщения и рад этому. А затем уже подгружается объёмный JavaScript, который умеет загружать сообщения с сервера, создавать их и т.д.
С первым типом виджетов -- вопросов нет. Добавляем обработчики, и дело сделано. Интересно начинается со второго типа, и совсем интересно -- с третьим типом. ## Зачем нужны шаблоны? Ранее мы уже видели код `Menu`, который сам создаёт свой элемент: ```js function Menu(options) { // ... приведены только методы для генерации DOM ... function render() { elem = $(''); elem.append( $('', { class: "title", text: options.title })) elem.on('mousedown selectstart', false); elem.on('click', '.title', onTitleClick); } function renderItems() { var items = options.items || []; var list = $('