web-dev-qa-db-ja.com

Node.jsにネイティブDOMがないのはなぜですか?

Node.jsはV8 JavaScriptエンジンを使用して構築されたであることに気付いたとき、私は次のように考えました。

XPathをサポートする「ネイティブ」DOMと、実行されたページでのすべてのAJAX呼び出し)を使用して、ブラウザーのようにページがレンダリングされるため、すばらしいWebスクレイピングが容易になります。

  1. Chromeと同じJavaScriptエンジンを使用しているのに、ネイティブDOMがないのはなぜですか?
  2. 取得したページでJavaScriptを実行するモードがないのはなぜですか?
  3. JavaScriptエンジンとWebブラウザーのエンジンについて何を理解していないのですか?

どうもありがとう!

41
PeterB

DOMはDOMであり、JavaScript実装は単に別のエンティティです。 DOMは、WebブラウザーがJavaScript環境に公開する一連の機能を表します。 要件はありませんが、特定のJavaScriptランタイムには、グローバルオブジェクトを介して公開されるany機能があります。

Node.jsとは、スタンドアロンのJavaScript環境であり、Webブラウザーから完全に独立しています。 WebブラウザーとJavaScriptの間に固有のリンクはありません。 DOMは、JavaScript言語または仕様などの一部ではありません

JavaベースのWebサーバーで古いRhino JavaベースのJavaScript実装を使用しています。その環境も、DOMとは何の関係もありません。グローバルオブジェクトに必要なことを実行するための機能をグローバルオブジェクトに設定するのは自分のアプリケーションであり、DOMではありません。

Nodeプロジェクトに仮想DOMが必要な場合は jsdom のようなプロジェクトがあります。サーバー側プラットフォームとしての性質から、DOMはNodeで実行できる機能であり、多種多様なサーバーアプリケーションにとって完璧な意味を持ちます。つまり、DOMが一部の人にとっては役に立たないかもしれませんが、同じことではありません。プロセス制御、I/O、ネットワーク、データベース相互運用などのサービスのカテゴリ。

「なぜ?」という質問に対する「公式」の回答があるかもしれません。 Node(Node Foundation now)を維持している人たちの基本的なビジネスです。もしそこにいる勇敢な開発者がそれを決定したら、Nodeは、デフォルトで仮想DOMをサポートする一連のモジュールとともに出荷され、正常に機能し、機能し、それを実現します。Node willはDOMを持ちます。

54
Pointy

PS:この質問を読んでいるとき、私は V8 (node.jsがこの上に構築されている)にDOM

Chromeと同じJSエンジンを使用する場合、ネイティブDOMがないのはなぜですか?

しかし、私はgoogleを検索し、 GoogleのV8ページ を見つけました。

JavaScriptは、ブラウザのクライアント側スクリプトで最も一般的に使用され、たとえば、ドキュメントオブジェクトモデル(DOM)オブジェクトの操作に使用されます。ただし、DOMは通常JavaScriptエンジンではなくブラウザによって提供されます。 V8についても同様です。GoogleChromeはDOMを提供します。ただし、V8はECMA標準で指定されているすべてのデータ型、演算子、オブジェクト、関数を提供します。

node.jsはV8ではなくGoogle Chromeを使用します。

同様に、取得したページでJSを実行するモードがないのはなぜですか?

また、それほど悪いことは必要ないと思います。 Ryan Dahlはnode.jsを一人の男(シングルプログラマ)として作成しました。たぶん今、彼(彼のチーム)がこれを開発するでしょうが、私は彼が(クレイジーに)作成したコードの量にすでに非常に驚いていました。彼はノンブロッキングの簡単で効率的なライブラリを作りたかったのです。

しかし、もう一度、別の開発者が https://github.com/tmpvar/jsdom で(今日)非常に優れ、積極的に開発したモジュールを作成しました。

JavaScriptエンジンとWebブラウザーのエンジンについて何を理解していないのですか? :)

上記の引用からうまくいけば、これらは異なるものです。

21
Alfred

Document Object Model(略してDOM)はプログラミングインターフェースですHTMLおよびXMLドキュメントの場合、ページを表し、プログラムがドキュメントの構造、スタイル、およびコンテンツを変更できるようにします。 この件の詳細


クライアント側(browser)とサーバー側(Node.js)とその主な目標:

  • クライアント側:Webの情報にアクセスして表示
  • サーバー側:Web情報を配信するための安定した信頼できる方法を提供します

Node.jsにDOMがないのはなぜですか?

デフォルトでは、Node.jsにはアクセス権がなく、ブラウザの実際のDOMに関する知識もありません。 Node.jsはデータを配信するだけで、DOMを含め、Webサイト全体を処理およびレンダリングするために独自のブラウザーで使用されます。サーバーは、使用および処理するためにデータをブラウザーに提供します。それが意図された方法です。

Node.jsでDOMにアクセスしたくないのはなぜですか?

Node.jsを使用してブラウザの実際のDOMにアクセスすることは、単にサーバーの目標から外れるだけです。独自のブラウザの役割は、サーバーからのデータを表示することです。ただし、それは確かに可能であり、AJAX呼び出しを使用してDOMを事前にレンダリング、操作、または変更するさまざまなレベルの深度と種類で複数のソリューションがあります。将来のトレンドがもたらすことを見ていきます。

Node.jsでDOMにアクセスする理由は何ですか?

デフォルトでは、Node.jsを使用して、独自の実際のDOM(少なくともその一部のデータ)にアクセスしないでください。クライアント側とサーバー側は、長年の経験と知識に基づいて、役割、機能、および責任の面で分離されています。いくつかの状況がありますが、そうするための確かな理由があります:

  • 使用状況データの収集(A/Bテスト、UI/UXの効率とフィードバック)
  • ヘッドレステスト(開発、自動化、Webスクレイピング)

Node.jsでDOMにアクセスするにはどうすればよいですか?

  • jsdom:独自のDOM /ブラウザ関連プロジェクトのテストに適した、純粋なJavaScript実装
  • cheerio:jQueryを使用する/頻繁に使用する場合の優れたソリューション
  • 操り人形師:Google Chromeを使用してヘッドレステストを提供するGoogle独自の方法
  • 独自のソリューション(あなたの将来のプロジェクトリンクはこちら)

これらのソリューションは、ブラウザ自体にアクセスする方法を提供していませんが、デフォルトでは実際のDOMですが、送信するプロジェクトを作成できますDOMに関する何らかの形式のデータをサーバーに送信し、必要に応じてそのデータを使用/レンダリング/操作します。

...そしてはい、ツールとユーティリティの観点から見たWebスクレイピングとWeb開発は、いくつかの分野でより洗練され、確かに簡単になりました。

7
user7637745

node.jsは、標準ライブラリに含めないことを選択しました。どの機能についても、包括性、スケーラビリティ、および保守性の間で避けられないトレードオフがあります。

それはそれが潜在的に有用ではないという意味ではありません。少なくとも1つの JavaScript DOM 実装が(他のCommonJS実装の中で)NodeJSを対象としています。

6

V8とDOMは密接に関連しているという誤った仮定があるようですが、そうではありません。 DOMは実際にはWebkitによって処理され、V8はDOMを処理せず、DOMへのJavaScript呼び出しを処理します。これで落胆しないでください。Node.jsは、リアルタイムサーバー市場で重要なニッチを切り開いていますが、それがサーバー専用であることを誰にも言わせないでください。 Nodeを使用すると、JavaScriptでほとんどすべてのものを構築できます。

あなたが話していることをすることは可能です。たとえば、本当にDOMへのアクセスが必要な場合は、非常に優れた jsdom ライブラリがあり、 node-htmlparser があります。これらを利用する非常に優れたスクレイピングライブラリもあります。 アプリコット のように。

5
Omni5cience

これは関連しています:WebkitからNodeにDOMなどを追加しようとする node-webkit という新しいプロジェクト(2012)があります。応援してね!

4
Ciantic

根本的な質問に答えるために、JSDomとjQueryを使用して、node.jsのページをこすることができます: http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs

私は自分でこのアプローチを数回使用しましたが、うまくいきました。

2
Dave Ward

ノードはランタイム環境であり、ブラウザのようにDOMをレンダリングしません。

1
wba0

JavaScript!=ブラウザ。言語としてのJavaScriptはブラウザに関連付けられていません。 node.jsは、ブラウザではなくサーバーを対象とした単なるJavaScriptの実装です。したがって、DOMはありません。

1
Paul Sonier

2018年の回答:主に歴史的な理由からですが、これは将来変更される可能性があります。

これまで、サーバー上で行われたDOM操作はほとんどありませんでした。偶然にも、他の回答が示唆しているように、JS stdlibとDOMは別々のライブラリです-たとえば、Unixスクリプトなどのノードを使用している場合、HTMLElementNodeListなどは実際にはありませんそれに関連しています。

ただし、サーバー側のDOM操作は、Webアプリケーションの配信において非常に一般的な部分です。 Webサーバーはページの構造を理解する必要があり、リソースをHTMLとしてレンダリングするように要求された場合は、Webアプリケーションの初期状態を反映するHTMLコンテンツを配信します。これは、サーバーが単にスタブページを配信し、ブラウザーに実際のコンテンツを入力する作業を行わせる場合よりも、Webアプリの読み込みがはるかに速くなることを意味します。現在、これはJSDomなどで行われていますが、同じようにnodeにはRequestおよびResponseオブジェクトが組み込まれており、stdlibの一部としてDOM関数を維持すると、このタスクに役立ちます。

0
mikemaccana

DOMを「自分のスクリプトからすぐにアクセスできるリンクされたオブジェクト」と読んだ場合、答えは「 そうです ですが、Webドキュメントスクリプトから利用できるオブジェクトのセットとは大きく異なります」。主な理由は、ノードが「V8のHTMLツリーオブジェクト」ではなく「V8のイベントI/O」であることです。

0
Andrey Sidorov

DOMがないからです。 DOMはDocument Object Modelの略です。 Nodeにはドキュメントがないため、操作するDOMはありません。それは間違いなくブラウザのことです。

cheerioのようなライブラリを使用できますが、簡単なDOM操作が可能です。

ノードはサーバーレベルのJavaScriptです。これは、C++やJavaなど、基本的なシステムAPIに適用される言語にすぎません。

0
samanime