56

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

太好了,网页抓取将更容易,因为页面将像在浏览器中一样呈现,“本机”DOM 支持 XPath 和执行页面上的任何 AJAX 调用。

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

非常感谢!

4

13 回答 13

66

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 是 Node 可以不用的工具,并且对于各种服务器应用程序仍然非常有意义。这并不是说 DOM 可能对某些人没有用处,只是它与进程控制、I/O、网络、数据库互操作等不在同一类服务中。

对于“为什么”这个问题,可能会有一些“官方”的回答。在那里,但它基本上只是维护 Node 的人(现在的 Node 基金会)的业务。如果某个勇敢的开发人员决定 Node 应该默认附带一组模块来支持虚拟 DOM,并且成功地工作和工作并实现了这一点,那么 Node拥有一个 DOM。

于 2011-07-11T22:04:57.507 回答
25

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

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

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

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

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

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

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

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

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

这些是不同的事情,希望从上面的引用中可以清楚地看出。

于 2011-07-11T22:48:55.940 回答
11

文档对象模型 (简称 DOM)是HTML 和 XML 文档的编程接口,它表示页面,以便程序可以更改文档结构、样式和内容。更多关于这个主题。


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

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

为什么 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 : 谷歌自己的使用谷歌浏览器提供无头测试的方式
  • 自己的解决方案 (您可能的未来项目链接在这里)

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

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

于 2018-06-12T19:54:09.417 回答
7

node.js 选择不将其包含在他们的标准库中。对于任何功能,在全面性、可扩展性和可维护性之间都存在不可避免的权衡。

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

于 2012-03-15T02:15:40.380 回答
4

您似乎有一个错误的假设,即 V8 和 DOM 密不可分,事实并非如此。DOM 实际上由 Webkit 处理,V8 不处理 DOM,它处理对 DOM 的 Javascript 调用。不要让这让您气馁,Node.js 在实时服务器市场中开辟了一个重要的利基市场,但不要让任何人告诉您它仅适用于服务器。Node 使得使用 JavaScript 构建几乎任何东西成为可能。

有可能做你所说的。例如,如果你真的需要访问 DOM,有非常好的jsdom库,还有node-htmlparser,还有一些非常好的抓取库可以利用这些,比如apricot

于 2011-07-11T22:33:17.070 回答
2

2018回答:主要是历史原因,但未来可能会改变。

从历史上看,很少在服务器上进行 DOM 操作。此外,正如其他答案所暗示的那样,JS stdlib 和 DOM 是单独的库 - 如果您使用的是节点,例如 Unix 脚本,那么HTMLElement等等NodeList与此无关。

但是:服务器端 DOM 操作现在是交付 Web 应用程序的一个非常常见的部分。Web 服务器需要了解页面的结构,并且如果被要求将资源呈现为 HTML,则需要提供反映 Web 应用程序初始状态的 HTML 内容。这意味着 Web 应用程序的加载速度比服务器简单地提供存根页面并让浏览器完成填充真实内容的工作要快得多。目前这是通过 JSDom 和类似方法完成的,但与节点RequestResponse内置对象的方式相同,将 DOM 函数作为标准库的一部分进行维护将有助于完成这项任务。

于 2018-01-10T12:39:29.857 回答
0

Javascript!=浏览器。Javascript 作为一种语言不依赖于浏览器;node.js 只是用于服务器而非浏览器的 Javascript 实现。因此没有 DOM。

于 2011-07-11T22:05:25.567 回答
0

如果您将 DOM 理解为“可从我的脚本立即访问的链接对象”,那么答案是“确实如此,但它与 Web 文档脚本中可用的对象集非常不同”。主要原因是节点是“V8 的事件 I/O”,而不是“V8 的 HTML 树对象”

于 2011-07-12T02:27:57.357 回答
0

Node 是一个运行时环境,它不像浏览器那样渲染 DOM。

于 2018-06-12T19:34:31.900 回答
0

因为没有 DOM。DOM 代表Document Object Model. Node 中没有文档,所以没有 DOM 来操作它。这绝对是浏览器的事情。

您可以使用类似的库cheerio,它可以为您提供一些简单的 DOM 操作。

Node 是服务器级的 JavaScript。它只是应用于基本系统 API 的语言,更像 C++ 或 Java。

于 2018-06-12T19:34:49.627 回答
-1

Node.js 用于服务器端编程。服务器中没有要呈现的 DOM。

于 2011-07-11T22:05:05.853 回答
-1

似乎人们已经回答了“为什么”,但没有回答“如何”。一个快速的答案是如何在 Web 浏览器中公开一个文档对象(因此是 DOM ,文档对象模型)。在 Windows 上,此对象称为文档对象。您可以参考此页面并查看它公开的用于处理 HTML 文档的方法,例如createElement. 我不使用 node.js 或者有一段时间没有进行 COM 编程,但我想你可以通过简单地调用 COM object 在 node.js 中使用 DOM IHTMLDocument3。当然,对于 Mac OS X 或 Linux 等其他平台,您可能必须使用他们的 OS api 中的某些内容。这应该允许您使用 DOM 轻松构建网页服务器端,或抓取传入的网页。

于 2016-03-16T20:07:22.987 回答
-5

1) 拥有一个文档对象模型意味着什么?没有文件可以代表。

2)您大部分时间都没有检索页面。你可以,但大多数 Node 应用程序可能不会。

3) 没有文档和浏览器,Javascript 只是另一种编程语言。所以你可能会问为什么 C# 或 Java 中没有 DOM

于 2011-07-11T22:09:10.550 回答