Каковы варианты использования jsdom

после прочтения этой микро-шаблоны умершей статьи. Мне стало любопытно:--3-->

  1. ли использование DOM на сервере приводит к более чистому поддерживаемому коду, а затем шаблону.
  2. более ли эффективно использовать jsdom вместо механизма шаблонов.
  3. как учесть jsdom в представлении стандартной настройки MVC.

и вообще, в каких ситуациях было бы лучше использовать серверный DOM абстракция, как jsdom а не шаблонный движок, как EJS или Джейд.

вопрос специфичен для узел.js и другие SSJS

4 ответов


  1. его хорошая абстракция, которая соответствует инженерам на стороне клиента, берет на себя, как построен и изменен dom. В этом отношении она "чище", потому что существует одна ментальная модель. Его также приятно, потому что нам не нужно смешивать kluge разрозненных синтаксисов из языка шаблонов поверх в противном случае чистой декларативной разметки, как в случае даже с "самой глупой" системой шаблонов, такой как усы.

  2. Я бы не сказал, что его более эффективно использовать jsdom для шаблонов. Пойдите, взгляните на Google wrt на "утечки памяти с jsdom", например. jsdom-это rad, и он очень полезен для таких задач, как проекты выходных для обхода сайтов, выполнение задач, не связанных с сервером, но я думаю, что это медленно, как дерьмо, с точки зрения высокопроизводительного веб-сервера.

  3. существует миллиард способов учесть это. Ни один метод не стал "стандартным". Один из способов, который я видел, - отправить пустой "шаблон", т. е. блок 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 оказался решением, но он работал удивительно хорошо. Надеюсь, это поможет!


несколько приходят на ум:

  1. обмен представлениями / контроллерами между сервером и браузером
  2. интеллектуальный анализ данных / сканирование / обработка
  3. преобразование для фрагментов HTML, используемых в AJAX / realtime stuff
  4. абсолютное разделение логики и контента, избегая тегов шаблонов

и ответить на ваши вопросы:

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

на пункт 2 Вашего вопроса можно ответить с помощью этого шаблона testcase:

go http://jsperf.com/dom-vs-innerhtml-based-templating/300

  • нажмите кнопку "выполнить тесты".

  • будьте терпеливы, он сравнивает сварки и большое других движков шаблонов и дает вам текущие ориентиры ...