当我发现Node.js 是使用 V8 JavaScript 引擎构建时,我想:
太好了,网页抓取会更容易,因为页面将像在浏览器中一样呈现,“原生”DOM 支持 XPath 和页面上执行的任何 AJAX 调用。
- 当它使用与 Chrome 相同的 JavaScript 引擎时,为什么它没有原生 DOM?
- 为什么它没有在检索到的页面中运行 JavaScript 的模式?
- 我对 JavaScript 引擎与 Web 浏览器中的引擎有何不了解?
非常感谢!
当我发现Node.js 是使用 V8 JavaScript 引擎构建时,我想:
太好了,网页抓取会更容易,因为页面将像在浏览器中一样呈现,“原生”DOM 支持 XPath 和页面上执行的任何 AJAX 调用。
非常感谢!
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 应该默认提供一组module来支持虚拟 DOM,并且成功运行并实现了这一点,那么 Node将拥有一个 DOM。
PS:在阅读这个问题时,我还想知道V8(node.js 是在此基础上构建的)是否有一个 DOM
为什么当它使用与 Chrome 相同的 JS 引擎时,它没有原生 DOM?
但是我搜索了谷歌并找到了谷歌的 V8 页面,其中背诵了以下内容:
JavaScript 最常用于浏览器中的客户端脚本,例如用于操作文档对象模型 (DOM) 对象。然而,DOM 通常不是由 JavaScript 引擎提供,而是由浏览器提供。V8 也是如此——谷歌浏览器提供了 DOM。然而,V8 确实提供了 ECMA 标准中指定的所有数据类型、运算符、对象和函数。
node.js 使用V8
而不是Google Chrome
.
同样,为什么它没有在检索到的页面中运行 JS 的模式?
我也认为我们真的不需要那么糟糕。Ryan Dahl 作为一个人(单身程序员)创建了 node.js。也许现在他(他的团队)会开发这个,但我已经对他产生的代码数量感到非常惊讶(疯狂)。他想制作一个非阻塞的简单/高效的库,我认为他在这方面做得非常好。
但话又说回来,另一位开发人员在https://github.com/tmpvar/jsdom 上创建了一个非常好并且积极开发的module(今天)。
我对 Javascript 引擎与 Web 浏览器中的引擎有何不了解?:)
这些是不同的事情,希望从上面的引文中可以清楚地看出。
该文档对象模型 (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 (至少是其中的一些数据)。基于多年的经验和知识,客户端和服务器端在角色、功能和职责方面是分开的。虽然有几种情况,但有充分的理由这样做:
如何访问 Node.js 中的 DOM?
虽然这些解决方案默认情况下没有提供访问浏览器自己的实际 DOM 的方法,但是您可以创建一个项目将有关 DOM 的某种形式的数据发送到服务器,然后根据您的需要使用/渲染/操作该数据.
...是的,网络抓取和网络开发在工具和实用程序方面变得更加复杂,并且在多个领域肯定更容易。
node.js 选择不将其包含在他们的标准库中。对于任何功能,在全面性、可扩展性和可维护性之间都存在不可避免的权衡。
这并不意味着它没有潜在的用处。至少有一个用于 NodeJS 的JavaScript DOM实现(以及其他 CommonJS 实现)。
您似乎有一个错误的假设,即 V8 和 DOM 密不可分,事实并非如此。DOM 实际上由 Webkit 处理,V8 不处理 DOM,它处理对 DOM 的 Javascript 调用。不要让这让您气馁,Node.js 已经在实时服务器市场上开辟了一个重要的利基市场,但不要让任何人告诉您它只是用于服务器。Node 使使用 JavaScript 构建几乎任何东西成为可能。
可以做你所说的。例如,如果您确实需要访问 DOM,则有非常好的jsdom库和node-htmlparser,还有一些非常好的抓取库,它们利用了这些,例如apricot。