Pourquoi node.js n'a-t-il pas de DOM natif?

Lorsque j'ai découvert que NodeJS a été construit sur le moteur V8 Javascript, je pensais que "le raclage web sera plus simple, car la page sera rendue comme dans le navigateur, avec un DOM 'natif' qui prend en charge XPath et tous les appels AJAX dans la page réalisé."

  1. Pourquoi quand il utilise le même moteur JS que Chrome n'a-t-il pas de DOM natif?
  2. De même, pourquoi n'a-t-il pas un mode pour exécuter JS dans des pages récupérées?
  3. Qu'est-ce que je ne comprends pas sur les moteurs JavaScript contre le moteur dans un navigateur? 🙂

Merci beaucoup!

Le DOM est le DOM, et l'implémentation JavaScript est simplement une entité distincte. Le DOM représente un ensemble d'installations qu'un navigateur Web expose à l'environnement JavaScript. Il n'y a aucune exigence cependant que tout runtime de JavaScript particulier aura toutes les installations exposées via l'objet global.

Qu'est-ce que Node.js est un environnement JavaScript autonome complètement indépendant d'un navigateur Web. Il n'y a pas de lien intrinsèque entre les navigateurs Web et JavaScript; Le DOM ne fait pas partie de la langue JavaScript ou de la spécification ni de quoi que ce soit.

J'utilise l'ancienne implémentation de JavaScript basée sur Java de Rhino dans mon serveur Web basé sur Java. Cet environnement n'a rien à voir avec aucun DOM. C'est ma propre application qui est responsable de peupler l'objet global avec des installations pour faire ce dont j'ai besoin pour pouvoir faire, et ce n'est pas un DOM.

Notez qu'il existe des projets comme jsdom si vous voulez un DOM virtuel dans votre projet Node. En raison de sa nature même en tant que plate-forme côté serveur, un DOM est une installation dont Node peut se passer et a toujours le sens idéal pour une grande variété d'applications serveur. Cela ne veut pas dire qu'un DOM pourrait ne pas être utile à certaines personnes, mais ce n'est tout simplement pas dans la même catégorie de services que le contrôle de processus, les E / S, le réseautage, l'interopérabilité de base de données, etc.

Il peut y avoir une réponse «officielle» à la question «pourquoi?» Là-bas, mais c'est essentiellement l'affaire de ceux qui maintiennent Node (la Fondation Node maintenant). Si un développeur intrépide décide que Node devrait expédier par défaut avec un ensemble de modules pour prendre en charge un DOM virtuel, et qu'il fonctionne avec succès et qu'il fonctionne et que cela se produit, alors Node aura un DOM.

PS: Lors de la lecture de cette question, je me demandais aussi si V8 (node.js est construit en haut de cela) avait un DOM

Pourquoi quand il utilise le même moteur JS que Chrome n'a-t-il pas de DOM natif?

Mais j'ai cherché Google et trouvé la page V8 de Google qui récite les éléments suivants:

Le JavaScript est le plus souvent utilisé pour les scripts côté client dans un navigateur, utilisé pour manipuler des objets Document Object Model (DOM) par exemple. Le DOM n'est cependant pas fourni par le moteur JavaScript mais plutôt par un navigateur. Il en va de même pour V8: Google Chrome fournit le DOM. Cependant, V8 fournit tous les types de données, les opérateurs, les objets et les fonctions spécifiés dans la norme ECMA.

Node.js utilise V8 et pas Google Chrome .

De même, pourquoi n'a-t-il pas un mode pour exécuter JS dans des pages récupérées?

Je pense aussi que nous n'en avons pas vraiment besoin. Ryan Dahl a créé node.js comme un seul homme (un programmeur unique). Peut-être que maintenant (son équipe) va développer cela, mais j'étais déjà extrêmement étonné par la quantité de code qu'il a produit (fou). Il voulait faire une bibliothèque facile à utiliser et non bloquante, ce qui, je pense, a fait un bon travail.

Mais encore une fois, un autre développeur a créé un module très bon et développé activement (aujourd'hui) à l' adresse https://github.com/tmpvar/jsdom .

Qu'est-ce que je ne comprends pas sur les moteurs JavaScript contre le moteur dans un navigateur? 🙂

Ce sont des choses différentes, comme nous l'espérons clairement, de la citation ci-dessus.

Vous semblez avoir une hypothèse erronée selon laquelle V8 et les DOM sont inextricablement liés, ce n'est pas le cas. Le DOM est actuellement géré par Webkit, V8 ne gère pas le DOM, il gère les appels Javascript vers le DOM. Ne laissez pas cela vous décourager, Node.js a créé un créneau important sur le marché des serveurs en temps réel, mais ne laissez personne vous dire que c'est juste pour les serveurs. Node permet de créer presque n'importe quoi avec JavaScript.

Il est possible de faire ce dont vous parlez. Par exemple, il y a la très bonne bibliothèque jsdom si vous avez vraiment besoin d'accéder au DOM et node-htmlparser , il existe également de très bonnes bibliothèques de raclage qui profitent de ces comme l' abricot .

Node.js a choisi de ne pas l'inclure dans sa bibliothèque standard. Pour toute fonctionnalité, il existe un compromis inévitable entre l'exhaustivité, l'évolutivité et la facilité de maintenance.

Cela ne signifie pas que ce n'est pas potentiellement utile. Il existe au moins une implémentation JavaScript DOM destinée au NodeJS (entre autres implémentations CommonJS).

Ceci est lié: il existe un nouveau projet (2012) appelé node-webkit qui tente d'ajouter des DOM et beaucoup plus de Webkit à Node. Soutiens le!

Pour répondre à votre question sous-jacente, vous pouvez utiliser JSDom et jQuery pour racler des pages dans node.js: http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs

J'ai utilisé cette approche quelques fois moi-même, et ça marche très bien.

Node.js est destiné à la programmation sur serveur . Il n'y a aucun DOM à rendre dans le serveur.

Javascript! = Navigateur. Le Javascript en tant que langue n'est pas lié aux navigateurs; Node.js est simplement une implémentation de Javascript destinée aux serveurs, et non aux navigateurs. D'où pas de DOM.

Si vous lisez le DOM comme «objets liés immédiatement accessibles à partir de mon script», puis la réponse « il le fait , mais c'est très différent de l'ensemble des objets disponibles à partir du script du document Web». La raison principale est que le nœud est «E / S évidemment pour V8», et non «objets d'arbre HTML pour V8»

Il semble que les gens aient répondu «pourquoi» mais pas comment. Une réponse rapide de la façon dont cela se trouve dans un navigateur Web, un objet de document est exposé (donc DOM, modèle d'objet de document). Sur Windows, cet objet est appelé objet de document . Vous pouvez vous référer à cette page et examiner les méthodes qu'elle expose qui sont pour la gestion des documents HTML comme createElement . Je n'utilise pas node.js ou n'ai pas fait de programmation COM depuis un moment mais j'imaginerais que tu pourrais utiliser DOM dans node.js en appelant simplement l'objet COM IHTMLDocument3 . Bien sûr, pour d'autres plates-formes comme Mac OS X ou Linux, vous devriez probablement utiliser quelque chose à partir de leur api OS. Cela devrait vous permettre de construire facilement un côté du serveur de la page Web en utilisant DOM ou de rayer les pages Web entrantes.

1) Qu'est-ce que cela signifie pour avoir un document O Bject M odel? Il n'y a pas de document à représenter.

2) Vous êtes la plupart du temps que vous ne récupérez pas les pages. Vous pouvez, mais la plupart des applications Node ne le seront probablement pas.

3) Sans un document et un navigateur, Javascript n'est qu'un autre langage de programmation. Vous pouvez donc demander pourquoi il n'existe pas de DOM en C # ou Java