Каковы варианты использования jsdom
после прочтения этой микро-шаблоны умершей статьи. Мне стало любопытно:--3-->
- ли использование DOM на сервере приводит к более чистому поддерживаемому коду, а затем шаблону.
- более ли эффективно использовать jsdom вместо механизма шаблонов.
- как учесть jsdom в представлении стандартной настройки MVC.
и вообще, в каких ситуациях было бы лучше использовать серверный DOM абстракция, как jsdom а не шаблонный движок, как EJS или Джейд.
вопрос специфичен для узел.js и другие SSJS
4 ответов
его хорошая абстракция, которая соответствует инженерам на стороне клиента, берет на себя, как построен и изменен dom. В этом отношении она "чище", потому что существует одна ментальная модель. Его также приятно, потому что нам не нужно смешивать kluge разрозненных синтаксисов из языка шаблонов поверх в противном случае чистой декларативной разметки, как в случае даже с "самой глупой" системой шаблонов, такой как усы.
Я бы не сказал, что его более эффективно использовать jsdom для шаблонов. Пойдите, взгляните на Google wrt на "утечки памяти с jsdom", например. jsdom-это rad, и он очень полезен для таких задач, как проекты выходных для обхода сайтов, выполнение задач, не связанных с сервером, но я думаю, что это медленно, как дерьмо, с точки зрения высокопроизводительного веб-сервера.
существует миллиард способов учесть это. Ни один метод не стал "стандартным". Один из способов, который я видел, - отправить пустой "шаблон", т. е. блок html, который представляет модель каким-то образом, а затем использует ее для начальной загрузки построения конечного вида из модели. Из этой статьи, например:
<li class="contact" id="contact-template">
<span class="name"></span>
<p class="title"></p>
</li>
Это "вид" в классическом отношении. В типичном веб-приложении это может выглядеть примерно так:
<li class="contact">
<span class="name"><?= $name ?></span>
<p class="title"><?= $title ?></p>
</li>
чтобы использовать mvc, настраивается контроллер, который смутно осведомлен о семантике вышеуказанного представления и модели, которую он представляет. Этот вид анализируется в / A DOM и доступен через ваш любимый селектор двигателя. Каждый раз, когда модель представляет изменения, можно использовать события изменения или обратные вызовы для обновления представления. Например:
давайте представим, что "модель" запускает событие "изменение" каждый раз, когда изменяется свойство.
controller = new Controller({
view: $('#contact-template').clone(), // Assume jquery or whatever
model: aContact
});
// Assume some initialization that sets the view up for the first time
// and appends it to the appropriate place. A la:
// this.view.find('.name').text(model.name);
// this.view.find('.title').text(model.title);
// this.view.appendTo('#contacts')
controller.on('model.name.change', function(name){
this.view.find('.name').text(name);
});
эти какие системы любят сварка и костяк.js для вас. Все они имеют разную степень предположений о том, где происходит эта работа (на стороне сервера, на стороне клиента), какую структуру вы используете (jquery, mootools, и т. д.), И как изменения распространяются (остальные, гнездо.Ио и т. д.).
редактировать
некоторые действительно полезные вещи вы можете сделать с jsdom вращаются вокруг интеграционное тестирование и пауков:
- https://github.com/mikeal/spider - универсальный веб-паук, который использует обработку событий узла и дает вам jsdom/jquery, чтобы помочь вам легко получить доступ к DOM в programatic путь
- https://github.com/assaf/zombie - тестирование браузера без головы с помощью jsdom / jquery для интеграционных тестов
- https://github.com/LearnBoost/tobi - аналогичное тестирование безголового браузера
лично я хотел бы увидеть проект, который принял подход Тоби, но отображал его поверх чего-то вроде https://github.com/LearnBoost/soda такие, что мы можем сделать облако на основе селена тестирования без selenese (поскольку ИМО, это отстой).
Ну, мне действительно нужен JSDom для небольшого проекта, который я построил в выходные в узле.js. Итак, на моем сервере я должен был принять URL-адрес для извлечения, захватить весь HTML из данного URL-адреса, проанализировать его и отобразить изображения пользователю, чтобы пользователь мог выбрать миниатюру из этого URL-адреса. (Вроде как, когда вы бросаете ссылку в поле ввода Facebook) Итак, я использовал модуль под названием Request, который позволяет мне получать HTML на стороне сервера. Однако, когда этот HTML достиг моей программы, у меня не было возможности пройдите его, как вы делаете с клиентским javascript. Поскольку настоящего дома не было, я не могла сказать document.getElementById('someId')
. Поэтому JSDom пригодился, предоставив мне "импровизированный" DOM, который позволил мне пройти возвращенный HTML. Теперь, хотя я все еще был на стороне сервера, JSDOM создал window
объект очень похож на объект window В браузере и создал DOM из возвращенного HTML. Теперь, даже на сервере, я смог получить все изображения, позвонив window.$('img')
. Я мог бы прицелиться и разобрать элементы, как обычно. Итак, это всего лишь одна проблема, где JSDom оказался решением, но он работал удивительно хорошо. Надеюсь, это поможет!
несколько приходят на ум:
- обмен представлениями / контроллерами между сервером и браузером
- интеллектуальный анализ данных / сканирование / обработка
- преобразование для фрагментов HTML, используемых в AJAX / realtime stuff
- абсолютное разделение логики и контента, избегая тегов шаблонов
и ответить на ваши вопросы:
- - возможно. Много чего влияет на качество кода, но это шаг в правильном направление
- нет, шаблонные движки всегда будут быстрее, так как они могут предварительно компилировать шаблоны
- Это, вероятно, заслуживает нового вопроса?
на пункт 2 Вашего вопроса можно ответить с помощью этого шаблона testcase:
go http://jsperf.com/dom-vs-innerhtml-based-templating/300
нажмите кнопку "выполнить тесты".
будьте терпеливы, он сравнивает сварки и большое других движков шаблонов и дает вам текущие ориентиры ...