为什么Node.js没有原生DOM?

Pet*_*erB 40 javascript dom v8 node.js headless-browser

当我发现Node.js是使用V8 JavaScript引擎构建的时候,我想:

很棒,网页抓取会更容易,因为页面将像在浏览器中一样呈现,其中"本机"DOM支持XPath并且页面上的任何AJAX调用都已执行.

  1. 当它使用与Chrome相同的JavaScript引擎时,为什么它没有原生DOM?
  2. 为什么它没有在检索到的页面中运行JavaScript的模式?
  3. 我不了解JavaScript引擎与Web浏览器中的引擎有什么关系?

非常感谢!

Poi*_*nty 53

DOM是DOM,JavaScript实现只是一个单独的实体.DOM表示Web浏览器向JavaScript环境公开的一组工具.但是,并不要求任何特定的JavaScript运行时都有通过全局对象公开的任何工具.

Node.js是一个完全独立于Web浏览器的独立 JavaScript环境.Web浏览器和JavaScript之间没有内在联系; DOM 不是 JavaScript语言或规范或任何东西的一部分.

我在基于Java的Web服务器中使用旧的基于Rhino Java的JavaScript实现.该环境与任何DOM都没有任何关系.这是我自己的应用程序负责用设施填充全局对象来做我需要它能做的事情,而且它不是DOM.

请注意,如果您想在Node项目中使用虚拟DOM ,那么有像jsdom这样的项目.由于DOM本身就是服务器端平台,因此DOM是Node无法使用的工具,并且对于各种服务器应用程序仍然具有完美的意义.这并不是说DOM可能对某些人没用,但它与流程控制,I/O,网络,数据库互操作等等不在同一类服务中.

对于"为什么?"这个问题,可能会有一些"官方"答案.在那里,但它基本上只是维护Node(现在的Node Foundation)的人的业务.如果有一些勇敢的开发人员在那里决定Node应默认发布一组模块以支持虚拟DOM,并且成功地工作和工作并实现这一点,那么Node 拥有一个DOM.

  • 这并没有解决为什么"它没有在检索到的页面中运行JS的模式?".[C#](http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.aspx)和[Java](http://docs.oracle.com/javase/7/docs/api /org/w3c/dom/package-summary.html)可以独立于Web浏览器运行,但它们在标准库中都具有DOM功能.它通常用于此目的. (7认同)
  • 形式的问题,"为什么不做x?" 通常很难回答. (6认同)
  • 来自 PHP 背景,我很震惊地了解到 NodeJs 没有原生 DOM 支持。当然,服务器环境不像浏览器那样需要 DOM,但这并不意味着原生 DOM 支持在任何服务器环境中都不是有价值的工具。它可用于 (1) 模板、(2)、站点抓取、(3) 解析来自第三方 Web 服务的数据等。尤其是后一个功能对我来说对于现代 HTTP 服务器来说似乎是必不可少的。 (3认同)
  • 也没有“窗口”对象,fwiw。 (2认同)

Alf*_*red 20

PS:在阅读这个问题时,我也想知道V8(node.js是否构建于此之上)是否有DOM

为什么当它使用与Chrome相同的JS引擎时它没有原生DOM?

但我搜索谷歌并找到谷歌的V8页面,其中列举了以下内容:

JavaScript最常用于浏览器中的客户端脚本,例如用于操作文档对象模型(DOM)对象.但是,DOM通常不是由JavaScript引擎提供,而是由浏览器提供.V8-谷歌Chrome提供的DOM也是如此.但是,V8提供了ECMA标准中规定的所有数据类型,运算符,对象和函数.

node.js使用V8而不是Google Chrome.

同样,为什么它没有在检索到的页面中运行JS的模式?

我也认为我们真的不需要那么糟糕.Ryan Dahl创建了node.js作为一个人(单个程序员).也许现在他(他的团队)会发展这个,但我已经对他制作的代码量(疯狂)感到非常惊讶.他想创建一个非阻塞的简单/高效的库,我认为他做得非常好.

但话又说回来,另一位开发人员在https://github.com/tmpvar/jsdom创建了一个非常好并且积极开发的模块(今天).

我不了解Javascript引擎与Web浏览器中的引擎有什么关系?:)

从上面的引文中可以清楚地看出这些是不同的东西.

  • 在这种情况下,Google Chrome使用哪种"网络浏览器中的引擎"? (3认同)
  • @AndersonGreen,截至目前,[Blink](https://en.wikipedia.org/wiki/Blink_%28layout_engine%29). (2认同)

use*_*745 7

文档对象模型 (DOM简称)是一个编程接口HTML和XML文件以及它所代表的页面,这样的程序可以改变文档结构,风格和内容.更多关于这个主题.


客户端(浏览器)和服务器端(Node.js)之间的必要区别及其主要目标:

  • 客户端:访问和显示Web信息
  • 服务器端:提供稳定可靠的方式来传递Web信息

为什么Node.js中没有DOM是默认的?

默认情况下,Node.js无权访问,也无法了解您自己的浏览器中的实际DOM.Node.js只提供数据,这些数据将由您自己的浏览器用于处理和呈现整个网站,包括DOM.服务器将数据提供给浏览器以供使用和处理.这是预期的方式.

你为什么不想访问Node.js中的DOM?

使用Node.js访问浏览器的实际DOM只是简单地超出了服务器的目标.您自己的浏览器的作用是显示来自服务器的数据.然而,它肯定是可能的,并且有不同深度和多样性的多种解决方案,以使用AJAX调用预渲染,操作或更改DOM.我们将看到未来的趋势会带来什么.

为什么要访问Node.js中的DOM?

默认情况下,您不应使用Node.js 访问自己的实际DOM (至少是其中的一些数据).基于多年的经验和知识,客户端和服务器端在角色,功能和责任方面是分开的.虽然有几种情况,但有充分理由这样做:

  • 收集使用数据(A/B测试,UI/UX效率和反馈)
  • 无头测试(开发,自动化,网络抓取)

如何在Node.js中访问DOM?

  • jsdom:纯JavaScript实现,适用于测试您自己的DOM /浏览器相关项目
  • cheerio:很棒的解决方案,如果你喜欢/经常使用jQuery
  • puppeteer:Google自己使用Google Chrome提供无头测试的方式
  • 自己的解决方案 (这里可能的未来项目链接)

虽然这些解决方案默认情况下不提供访问浏览器自己的实际DOM的方法,但您可以创建项目以将有关DOM的某种形式的数据发送到服务器,然后根据您的需要使用/呈现/操作该数据.

......是的,在工具和实用程序方面,网络抓取和Web开发变得更加复杂,并且在几个领域中变得更加容易.


Mat*_*hen 6

node.js选择不将它包含在标准库中.对于任何功能,在全面性,可伸缩性和可维护性之间存在不可避免的权衡.

这并不意味着它没有潜在的用处.至少有一个用于NodeJS的JavaScript DOM实现(以及其他CommonJS实现).