Почему у Node.js нет встроенного DOM? - PullRequest
38 голосов
/ 12 июля 2011

Когда я обнаружил, что Node.js был создан с использованием движка JavaScript V8 , я подумал:

Отлично, очистка веб-страниц будет проще, поскольку страница будет отображаться какв браузере с «родным» DOM, поддерживающим XPath, и любыми вызовами AJAX на выполняемой странице.

  1. Почему у него нет собственного DOM, когда он использует тот же движок JavaScript, что иChrome?
  2. Почему у него нет режима запуска JavaScript на найденных страницах?
  3. Что я не понимаю в механизмах JavaScript по сравнению с движком в веб-браузере?

Большое спасибо!

Ответы [ 15 ]

51 голосов
/ 12 июля 2011

DOM - это DOM, а реализация JavaScript - это просто отдельная сущность. DOM представляет собой набор средств, которые веб-браузер предоставляет среде JavaScript. Нет требования , однако, что любая конкретная среда выполнения JavaScript будет иметь любые средства, предоставляемые через глобальный объект.

Что такое Node.js - это автономная среда JavaScript полностью независимая веб-браузер. Нет внутренней связи между веб-браузерами и JavaScript; DOM не является частью языка JavaScript или спецификации или чего-либо еще.

Я использую старую реализацию JavaScript на Rhino на моем веб-сервере на Java. Эта среда также не имеет ничего общего с DOM. Это мое собственное приложение, которое отвечает за заполнение глобального объекта средствами, позволяющими делать то, что мне нужно, и это не DOM.

Обратите внимание, что существуют проекты, такие как jsdom , если вы хотите использовать виртуальный DOM в своем проекте Node. Из-за своей природы серверной платформы DOM - это средство, без которого Node может обойтись и при этом имеет смысл для широкого спектра серверных приложений. Это не значит, что DOM может быть бесполезен для некоторых людей, но он не относится к той же категории услуг, что и такие, как управление процессами, ввод-вывод, работа в сети, взаимодействие с базой данных и т. Д.

Может быть какой-то "официальный" ответ на вопрос "почему?" там, но в основном это дело тех, кто поддерживает Node (Node Foundation сейчас). Если какой-то бесстрашный разработчик решит, что Node должен поставляться по умолчанию с набором модулей для поддержки виртуального DOM, и успешно работает, работает и делает это, то Node будет иметь DOM.

20 голосов
/ 12 июля 2011

PS: Когда я читал этот вопрос, мне также было интересно, имел ли V8 (node.js построен поверх этого) DOM

Почему, когда он использует тот же движок JS, что и Chrome, у него нет нативного DOM?

Но я искал в Google и нашел страницу Google V8 , в которой говорится следующее:

Чаще всего JavaScript используется для сценариев на стороне клиента в браузере, например, для манипулирования объектами объектной модели документов (DOM).Однако DOM, как правило, предоставляется не механизмом JavaScript, а браузером.То же самое относится и к V8 - Google Chrome предоставляет DOM.V8, однако, предоставляет все типы данных, операторы, объекты и функции, указанные в стандарте ECMA.

node.js использует V8, а не Google Chrome.

Точно так же, почему у него нет режима запуска JS на найденных страницах?

Я также думаю, что нам это не так уж и нужно.Райан Даль создал node.js как один человек (один программист).Возможно, теперь он (его команда) разработает это, но я уже был чрезвычайно поражен количеством кода, который он произвел (сумасшедший).Он хотел сделать неблокирующую легкую / эффективную библиотеку, в которой, я думаю, он проделал огромную работу.

Но опять же, другой разработчик создал довольно хороший модуль, который активно разрабатывается (сегодня) вhttps://github.com/tmpvar/jsdom.

Что я не понимаю в движках Javascript против движка в веб-браузере?:)

Это разные вещи, как мы надеемся, ясно из цитаты выше.

6 голосов
/ 12 июня 2018

Объектная модель документа (DOM вкратце) - это интерфейс программирования для документов HTML и XML , представляющий страницу, позволяющую программам изменятьструктура документа, стиль и содержание. Подробнее по этому вопросу.


Необходимое различие между клиентской ( браузер ) и серверной ()Node.js ) и их основные цели:

  • На стороне клиента: Доступ и отображение информации в Интернете
  • На стороне сервера: обеспечение стабильных и надежных способов доставки веб-информации

Почему в Node.js по умолчанию нет DOM?

По умолчанию Node.js не имеет доступа и не имеет никаких знаний о фактической DOM в вашем собственном браузере.Node.js просто предоставляет данные, которые будут использоваться вашим собственным браузером для обработки и визуализации всего сайта, включая DOM.Сервер предоставляет данные вашему браузеру для использования и обработки.Это - предполагаемый способ.

Почему вы не хотите получать доступ к DOM в Node.js?

Доступ к фактической DOM вашего браузера с помощью Node.js будетпросто вне цели сервера.Роль вашего собственного браузера заключается в отображении данных, поступающих с сервера.Однако это, безусловно, возможно, и существует несколько решений на разных уровнях глубины и разновидностей для предварительного рендеринга, манипулирования или изменения DOM с помощью вызовов AJAX.Посмотрим, что принесут будущие тренды.

Почему вы хотите получить доступ к DOM в Node.js?

По умолчанию вам не нужно обращаться ксобственный, фактический DOM (хотя бы некоторые его данные) с использованием Node.js.На стороне клиента и на стороне сервера разделены с точки зрения роли, функциональности и ответственности на основе многолетнего опыта и знаний.Хотя есть несколько ситуаций, когда для этого есть веские причины:

  • Сбор данных об использовании (A / B-тестирование, эффективность UI / UX и обратная связь)
  • Безголовое тестирование (Разработка, автоматизация, веб-очистка)

Как получить доступ к DOM в Node.js?

  • jsdom : реализация чистого JavaScript, подходит для тестирования вашего собственного проекта, связанного с DOM / браузером
  • cheerio : отличное решение, если вам нравится / часто вы используете jQuery
  • puppeteer : собственный способ Google обеспечить тестирование без головы с помощью Google Chrome
  • собственное решение (ваша возможная будущая ссылка на проект здесь)

Хотя эти решения не предоставляют способ доступа к вашему браузеру,фактический DOM по умолчанию , но вы можете создать проект для отправки некоторой формы данных о вашем DOM на сервер, а затем использовать / renдер / манипулировать этими данными в зависимости от ваших потребностей.

... и да, веб-анализ и веб-разработка с точки зрения инструментов и утилит стали более сложными и, безусловно, более простыми в нескольких областях.

6 голосов
/ 15 марта 2012

node.js решил не включать его в свою стандартную библиотеку. Для любой функциональности существует неизбежный компромисс между полнотой, масштабируемостью и ремонтопригодностью.

Это не значит, что это потенциально не полезно. Существует по крайней мере одна реализация JavaScript DOM , предназначенная для NodeJS (среди других реализаций CommonJS).

4 голосов
/ 06 декабря 2012

Это связано: есть новый проект (2012) под названием node-webkit , который пытается добавить DOM и многое другое из Webkit в Node. Поддержите это!

4 голосов
/ 12 июля 2011

У вас, похоже, ошибочное предположение, что V8 и DOM неразрывно связаны, но это не так. DOM фактически обрабатывается Webkit, V8 не обрабатывает DOM, он обрабатывает вызовы Javascript для DOM. Не позволяйте этому обескураживать вас, Node.js занял значительную нишу на рынке серверов реального времени, но не позволяйте никому говорить вам, что это только для серверов. Node позволяет создавать практически все с помощью JavaScript.

Можно делать то, о чем ты говоришь. Например, есть очень хорошая библиотека jsdom , если вам действительно нужен доступ к DOM, и node-htmlparser , есть также несколько действительно хороших библиотек, которые используют такие преимущества, как абрикос .

2 голосов
/ 12 июля 2011

Чтобы ответить на основной вопрос, вы можете использовать JSDom и jQuery для очистки страниц в node.js: http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs

Я сам несколько раз использовал этот подход, и он прекрасно работает.

1 голос
/ 12 июня 2018

Узел является средой выполнения, он не отображает DOM, как браузер.

1 голос
/ 12 июля 2011

Javascript! = Браузер.Javascript как язык не привязан к браузерам;node.js - это просто реализация Javascript, предназначенная для серверов, а не для браузеров.Следовательно, нет DOM.

0 голосов
/ 12 июня 2018

Потому что нет DOM. DOM обозначает Document Object Model. В Node нет документа, поэтому DOM не может им манипулировать. Это определенно вещь браузера.

Вы можете использовать библиотеку наподобие cheerio, которая дает вам несколько простых манипуляций с DOM.

Узел JavaScript на уровне сервера. Это просто язык, применяемый к базовому системному API, больше похожему на C ++ или Java.

...