В чем разница между D3 и jQuery?

103

Ссылаясь на этот пример:

http://vallandingham.me/stepper_steps.html

Кажется, что библиотеки D3 и jQuery очень похожи в том смысле, что обе они выполняют манипуляции с DOM с помощью цепочки объектов.

Мне любопытно узнать, какие функции D3 делает проще, чем jQuery, и наоборот. Существует множество библиотек для построения графиков и визуализации, которые используют jQuery в качестве основы (например,, , ).

Приведите конкретные примеры того, чем они отличаются.

zcaudate
источник

Ответы:

92
  • D3 управляется данными, а jQuery - нет: с jQuery вы напрямую управляете элементами, но с D3 вы предоставляете данные и обратные вызовы через уникальные D3 data(), enter()а exit()методы и D3 манипулируют элементами.

  • D3 обычно используется для визуализации данных, но jQuery используется для создания веб-приложений. D3 имеет множество расширений для визуализации данных, а jQuery имеет множество плагинов для веб-приложений.

  • Оба являются библиотеками для манипуляций с DOM JavaScript, имеют селекторы CSS и свободный API и основаны на веб-стандартах, что делает их похожими.

Следующий код - это пример использования D3, что невозможно с jQuery (попробуйте в jsfiddle ):

  // create selection
  var selection = d3.select('body').selectAll('div');

  // create binding between selection and data
  var binding = selection.data([50, 100, 150]);

  // update existing nodes
  binding
    .style('width', function(d) { return d + 'px'; });

  // create nodes for new data
  binding.enter()
    .append('div')
    .style('width', function(d) { return d + 'px'; });

  // remove nodes for discarded data
  binding.exit()
    .remove();
Али Шакиба
источник
9
хорошо, один пример стоит больше, чем 1000 слов
TMG
59

d3 имеет глупое описание. jQuery и d3 совсем не похожи, вы просто не используете их для одного и того же.

Цель jQuery - выполнять общие манипуляции с dom. Это универсальный набор инструментов javascript для всего, что вы можете захотеть сделать.

d3 был в первую очередь разработан, чтобы упростить построение блестящих графиков с данными. Вам обязательно следует использовать его (или что-то подобное, или что-то на его основе), если вы хотите делать графические визуализации данных.

Если вам нужна библиотека JS общего назначения для всех ваших потребностей в интерактивных формах, рассмотрите jQuery, proto или mootools. Если вам нужно что-то крошечное, подумайте о underscore.js. Если вам нужно что-то с внедрением зависимостей и возможностью тестирования, рассмотрите AngularJS.

Общее сравнение гид из википедии.

Я понимаю, почему кто-то может подумать, что они похожи. Они используют аналогичный синтаксис селектора - $ ('SELECTOR'), а d3 - чрезвычайно мощный инструмент для выбора, фильтрации и работы с элементами html, особенно при объединении этих операций вместе. d3 пытается объяснить вам это на своей домашней странице, называя себя библиотекой общего назначения, но факт в том, что большинство людей используют ее, когда хотят строить графики . Довольно необычно использовать его для обычных манипуляций с dom, потому что кривая обучения d3 очень крутая. Однако это гораздо более общий инструмент, чем jQuery, и обычно люди создают другие более конкретные библиотеки (например, nvd3) поверх d3, а не используют его напрямую.

Ответ @ JohnS тоже очень хорош. Fluent API = объединение методов. Я также согласен с тем, как плагины и расширения приведут вас к библиотекам.

случай
источник
1
@zcaudate, d3 не указан по ссылке, потому что он настолько специализирован. Эта ссылка сравнивает только общие рамки.
Дело
1
Еще я бы добавил, что D3 создает SVG (масштабируемая векторная графика). Это здорово, потому что вещи могут легко менять размер и легко оставаться пропорциональными другим элементам. Хотя вы можете сделать то же самое в JQuery (как показано в ссылке на пример OP), они не предназначены для замены друг друга.
EnigmaRM
2
Они похожи в том, что оба работают на Sizzle и используют одни и те же селекторы (огромная часть каждой структуры). Однако после выбора они создают очень разные объекты манипуляции с DOM.
cchamberlain 03
5
+1 за глупое описание. Я исследую множество клиентских библиотек и компонентов, но не успел прочесть первое предложение на их веб-сайте, пока не почувствовал себя полностью потерянным. Я нажал на причудливую эзотерическую шестиугольную мозаику «вещей», и она привела меня в какое-то таинственное и не связанное с этим место. Поскольку я не понимаю, что здесь происходит, я предполагаю, что недостоин клуба d3. Таким образом, я уменьшусь и уйду на Запад, и останусь без d3.
Джонатан Нойфельд
13

В последнее время я немного использовал и то, и другое. Поскольку d3 использует селекторы Sizzle, вы можете в значительной степени путать селекторы.

Просто имейте в виду, что d3.select ('# mydiv') не возвращает то же самое, что jQuery ('# mydiv'). Это тот же элемент DOM, но он создается с помощью разных конструкторов. Например, допустим, у вас есть следующий элемент:

<div id="mydiv" rel="awesome div" data-hash="654687867asaj"/>

И давайте возьмем несколько общих методов:

> d3.select('#mydiv').attr('rel') ;
 "awesome div"

> jQuery('#mydiv').attr('rel');
 "awesome div"

Выглядит вполне законно. Но если пойти немного дальше:

> d3.select('#mydiv').data();
 [undefined]

> jQuery('#mydiv').data();
 Object {hash: "654687867asaj"}
ffflabs
источник
Ага, интересно, почему .data () в d3 не работает как в jquery. В D3 надо установить.attr('data-hash', '654687867asaj')
прототип
6
это плохое сравнение. .data()в jQuery - это, по сути, ярлык для доступа к атрибуту html data-<custom-name>. Но в D3 он не имеет ничего общего с атрибутами данных html, и то, что он делает в D3, возвращает новый выбор в виде соединения данных, переданных в args с уже выбранными элементами.
nazikus
3
сейчас это плохое сравнение, но по состоянию на 2013 год было не так уж плохо. С тех пор jQuery отказался от полифиллинга для старых браузеров (атрибуты данных были одним из них), в то время как D3 перестала быть монолитной библиотекой и вместо этого стала точкой входа для коллекции более мелких конкретных библиотек
ffflabs
11

D3 - это не только визуальные графики. Документы на основе данных. Когда вы используете d3, вы привязываете данные к узлам dom. Благодаря SVG мы можем строить графики, но D3 - это гораздо больше. Вы можете заменить такие фреймворки, как Backbone, Angular и Ember, на использование D3.

Не уверен, кто проголосовал против, но позвольте мне внести ясность.

Многие веб-сайты запрашивают данные с сервера, которые обычно поступают из базы данных. Когда веб-сайт получает эти данные, мы должны выполнить обновление страницы с новым содержанием. Многие фреймворки делают то же самое, и d3 тоже. Поэтому вместо использования элемента svg вы можете использовать вместо него элемент html. Когда вы вызываете перерисовку, она быстро обновляет страницу новым содержимым. Приятно не иметь лишних накладных расходов, таких как jquery, backbone + его плагины, angular и т. Д. Вам нужно знать только d3. Теперь d3 не имеет встроенной системы маршрутизации. Но вы всегда можете его найти.

С другой стороны, Jquery имеет единственную цель - писать меньше кода. Это всего лишь сокращенная версия javascript, протестированная во многих браузерах. Если на вашей веб-странице не так много jquery. Это отличная библиотека для использования. Это просто и требует больших усилий при разработке javascript для нескольких браузеров.

Если вы попытались реализовать jquery в стиле d3, он будет довольно медленным, поскольку он не предназначен для этой задачи, аналогично, d3 не предназначен для отправки данных на серверы, он предназначен только для потребления и отображения данных. .

джемило
источник
1
«... заменить такие фреймворки, как Backbone, Angular и Ember, на использование D3». можешь уточнить?
Билли Мун
По своему опыту я видел, как многие люди используют эти фреймворки для визуализации диаграмм и графиков, когда вы можете заменить их на d3. При желании можно было бы также использовать d3 для рендеринга данных на странице, поскольку он связывает данные с элементами. D3 может работать с большими наборами данных быстрее, чем jQuery.
jemiloii
не уверен, кто проголосовал против меня, но я бы хотел, чтобы они могли оставить комментарий. D3 предназначен для документов, управляемых данными. Не только графики.
jemiloii
Вы можете легко создать многоразовый компонент с помощью d3. bost.ocks.org/mike/chart
jemiloii
2
Не наивно, я использовал только d3 и веб-сокеты для внутреннего инструмента, в котором я работаю. D3 занимался привязкой данных из данных, полученных из веб-сокетов. Я также использовал d3 для управления несколькими различными представлениями. Это был собственный СПА. D3 может обрабатывать элементы html, а также элементы svg. Не стоит недооценивать программиста. Вот почему для меня Интернет прекрасен, много способов сделать то же самое. Просто выберите тот способ, который вам нравится больше всего, это останется весело.
jemiloii
10

d3 предназначен для визуализации данных, он делает это путем фильтрации объектов DOM и применения преобразований.

jQuery создан для манипуляции с DOM и упрощает выполнение многих основных задач JS.

Если вы хотите превратить данные в красивые интерактивные картинки, D3 - это здорово.

Если вы хотите переместить, манипулировать или иным образом изменить свою веб-страницу, jQuery - ваш инструмент.

восьмиглазый
источник
7

Отличный вопрос!

Хотя обе библиотеки имеют много одинаковых функций, мне кажется, что самая большая разница между jQuery и D3 - это фокус.

jQuery - это библиотека общего назначения, ориентированная на кроссбраузерность и простоту использования.

D3 ориентирован на данные (манипулирование и визуализация) и поддерживает только современные браузеры. И хотя он похож на jQuery, его намного сложнее использовать.

Джон Слегерс
источник
3
jquery следует методологии «меньше пиши, делай больше», d3 ориентирован на рендеринг данных в элементы документа. Есть несколько причин, по которым d3 сложнее: во-первых, он использует необработанный javascript, а во-вторых, некоторые необработанные javascript изменены. Например: Javascript forEach (значение, индекс, массив), в d3 forEach (индекс, значение, массив). Я не уверен, почему они меняют аргументы функции, просто то, что я видел в источнике. Я думаю, что мы могли бы сделать d3 быстрее, если бы отбросили бессмысленные функции.
jemiloii
0

Оба могут решать одну и ту же цель создания и управления DOM (будь то HTML или SVG). D3 представляет собой API, который упрощает общие задачи, которые вы выполняете при создании / управлении DOM на основе данных. Это достигается благодаря встроенной поддержке привязки данных с помощью функции data (). В jQuery вам придется вручную обрабатывать данные и определять способ привязки к данным, чтобы сгенерировать DOM. Из-за этого ваш код становится более процедурным, и его становится труднее рассуждать и следовать. С D3 меньше шагов / кода и более декларативно. D3 также предоставляет некоторые функции более высокого уровня, которые помогают в создании визуализации данных в SVG. Такие функции, как range (), domain () и scale (), упрощают получение данных и их отображение на графике. Такие функции, как axis (), также упрощают рисование общих элементов пользовательского интерфейса, которые вы ожидаете от диаграммы / графика.

Стивен Пена
источник