56

Node.jsがV8JavaScriptエンジンを使用して構築されていることを発見したとき、私は次のように考えました。

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

  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サーバーで古いRhinoJavaベースのJavaScript実装を使用しています。その環境も、DOMとはまったく関係がありません。グローバルオブジェクトに、必要なことを実行するための機能を追加するのは私自身のアプリケーションであり、DOMではありません。

Nodeプロジェクトに仮想DOMが必要な場合は、jsdomのようなプロジェクトがあることに注意してください。サーバーサイドプラットフォームとしての性質上、DOMは、Nodeがなくても実行できる機能であり、さまざまなサーバーアプリケーションに最適です。DOMが一部の人にとって役に立たないかもしれないと言っているわけではありませんが、プロセス制御、I / O、ネットワーキング、データベース相互運用などと同じカテゴリのサービスではありません。

「なぜ」という質問に対する「公式の」答えがあるかもしれません。そこにありますが、それは基本的にノード(現在はノード財団)を維持している人々の仕事です。勇敢な開発者が、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にも当てはまります—GoogleChromeはDOMを提供します。ただし、V8は、ECMA標準で指定されているすべてのデータ型、演算子、オブジェクト、および関数を提供します。

node.jsはを使用しますが、は使用V8しませんGoogle Chrome

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

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

しかし、再び、別の開発者がhttps://github.com/tmpvar/jsdomで非常に優れており、(今日)積極的に開発されているモジュールを作成しました。

JavascriptエンジンとWebブラウザのエンジンについて何がわかりませんか?:)

上記の引用から明らかなように、これらは異なるものです。

于 2011-07-11T22:48:55.940 に答える
11

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


クライアント側(ブラウザ)とサーバー側(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:純粋なJavaScript実装、独自のDOM/ブラウザー関連プロジェクトのテストに適しています
  • cheerio:jQueryが好き/頻繁に使用する場合の優れたソリューション
  • puppeteer:GoogleChromeを使用してヘッドレステストを提供するGoogle独自の方法
  • 独自のソリューション (ここにあなたの可能な将来のプロジェクトリンク)

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

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

于 2018-06-12T19:54:09.417 に答える
7

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

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

于 2012-03-15T02:15:40.380 に答える
4

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

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

于 2011-07-11T22:33:17.070 に答える
2

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

歴史的に、サーバー上で行われたDOM操作はほとんどありませんでした。さらに、他の回答がほのめかしているように、JS stdlibとDOMは別々のライブラリです。たとえば、Unixスクリプトなどのノードを使用している場合は、HTMLElement実際NodeListには関係ありません。

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

于 2018-01-10T12:39:29.857 に答える
0

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

于 2011-07-11T22:05:25.567 に答える
0

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

于 2011-07-12T02:27:57.357 に答える
0

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

于 2018-06-12T19:34:31.900 に答える
0

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

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

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

于 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オブジェクトを呼び出すだけでnode.jsでDOMを使用できると思いますIHTMLDocument3。もちろん、Mac OS XやLinuxのような他のプラットフォームでは、おそらくOSAPIから何かを使用する必要があります。これにより、DOMを使用してWebページサーバー側を簡単に構築したり、受信したWebページをスクレイプしたりできるようになります。

于 2016-03-16T20:07:22.987 に答える
-5

1)ドキュメントオブジェクトモデルがあるとはどういう意味ですか表すドキュメントはありません。

2)ほとんどの場合、ページを取得していません。できますが、ほとんどのNodeアプリはおそらくそうではありません。

3)ドキュメントとブラウザがなければ、Javascriptは単なる別のプログラミング言語です。したがって、C#またはJavaにDOMがない理由を尋ねる場合があります

于 2011-07-11T22:09:10.550 に答える