web-dev-qa-db-fra.com

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

Quand j'ai découvert que Node.js a été construit avec le moteur JavaScript V8 , j'ai pensé: 

Génial, le raclage Web sera plus facile avec la page sera rendu comme dans le navigateur, avec un DOM "natif" prenant en charge XPath et tous les appels AJAX sur la page exécutée.

  1. Pourquoi n'a-t-il pas de DOM natif lorsqu'il utilise le même moteur JavaScript que Chrome?
  2. Pourquoi le mode JavaScript n’existe-t-il pas dans les pages récupérées?
  3. Qu'est-ce que je ne comprends pas entre les moteurs JavaScript et le moteur d'un navigateur Web?

Merci beaucoup!

37
PeterB

Le DOM est le DOM, et l'implémentation JavaScript est simplement une entité séparée. Le DOM représente un ensemble d'installations qu'un navigateur Web expose à l'environnement JavaScript. Il n'y a pas de condition requise cependant, un moteur d'exécution JavaScript particulier aura les fonctionnalités toute exposées via l'objet global.

Node.js est un environnement JavaScript autonome totalement indépendant d'un navigateur Web. Il n'y a pas de lien intrinsèque entre les navigateurs Web et JavaScript. le DOM fait pas partie du langage ou de la spécification JavaScript ou de quoi que ce soit.

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

Notez qu'il existe des projets tels que jsdom si vous souhaitez 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 qui est tout à fait logique pour une grande variété d'applications serveur. Cela ne veut pas dire qu'un DOM peut ne pas être utile à certaines personnes, mais il ne fait tout simplement pas partie de la même catégorie de services que des éléments tels que le contrôle de processus, les E/S, la mise en réseau, l'interopérabilité des bases de données, etc.

Il peut y avoir une réponse "officielle" à la question "pourquoi?" là-bas, mais il s’agit essentiellement de ceux qui maintiennent Node (la fondation Node maintenant). Si un développeur intrépide décide que Node doit être livré par défaut avec un ensemble de modules pour prendre en charge un DOM virtuel, et qu'il fonctionne correctement et qu'il le fait et que cela se produit, alors Node sera aura un DOM.

51
Pointy

P.S: En lisant cette question, je me demandais également si V8 (node.js est construit sur ce dessus) avait un DOM

Pourquoi, quand il utilise le même moteur JS que Chrome, n’a-t-il pas un fichier natif DOM?

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

JavaScript est le plus souvent utilisé pour les scripts côté client dans un fichier navigateur, utilisé pour manipuler les objets DOM (Document Object Model) par exemple. Cependant, le DOM n’est généralement pas fourni par le fichier Moteur JavaScript mais à la place par un navigateur. La même chose est vraie de V8 - Google Chrome fournit le DOM. V8 fournit cependant tous les types de données, opérateurs, objets et fonctions spécifiés dans la norme ECMA la norme.

node.js utilise V8 et non Google Chrome

De même, pourquoi ne dispose-t-il pas d'un mode pour exécuter JS dans les 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 (programmeur unique). Peut-être que maintenant (son équipe) va développer cela, mais j'étais déjà extrêmement surpris par la quantité de code qu'il produisait (fou). Il voulait créer une bibliothèque simple et efficace, sans blocage, pour laquelle il a fait un excellent travail.

Mais là encore, un autre développeur a créé un module plutôt bon et activement développé (à l’heure actuelle) sur https://github.com/tmpvar/jsdom .

Qu'est-ce que je ne comprends pas sur les moteurs Javascript vs le moteur dans un navigateur web? :)

Ce sont des choses différentes, comme l'espère clairement la citation ci-dessus.

20
Alfred

node.js a choisi de ne pas l'inclure dans sa bibliothèque standard. Quelle que soit la fonctionnalité, il existe un compromis inévitable entre exhaustivité, évolutivité et 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 à NodeJS (parmi les autres implémentations de CommonJS).

6
Matthew Flaschen

Ceci est lié: Il existe un nouveau projet (2012) appelé node-webkit qui essaie d'ajouter DOM et bien plus encore de Webkit à Node. Soutiens le!

4
Ciantic

Vous semblez avoir une hypothèse erronée selon laquelle V8 et le DOM sont inextricablement liés, ce n'est pas le cas. Le DOM est en réalité géré par Webkit, la V8 ne gère pas le DOM, elle gère les appels Javascript au DOM. Ne vous laissez pas décourager, Node.js s'est taillé une place de choix sur le marché des serveurs temps réel, mais ne laissez personne vous dire que ce n'est que pour les serveurs. Node permet de construire 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 grattage qui exploitent ces avantages, comme apricot .

4
Omni5cience

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

J'ai moi-même utilisé cette approche à quelques reprises et cela fonctionne très bien.

2
Dave Ward

Node est un environnement d'exécution, il ne rend pas un DOM comme un navigateur.

1
wba0

Javascript! = Navigateur. Javascript en tant que langue n'est pas lié aux navigateurs; node.js est simplement une implémentation de Javascript destinée aux serveurs, pas aux navigateurs. Donc pas de DOM.

1
Paul Sonier

2018 réponse: principalement pour des raisons historiques, mais cela pourrait changer à l'avenir.

Historiquement, très peu de manipulations DOM ont été effectuées sur le serveur. De plus, comme le soulignent d’autres réponses, JS stdlib et le DOM sont des bibliothèques distinctes. Si vous utilisez node, par exemple pour les scripts Unix, les variables HTMLElement et NodeList etc. ne sont pas vraiment pertinentes.

Cependant: la manipulation DOM côté serveur est maintenant une partie très courante de la fourniture d'applications Web . Les serveurs Web doivent comprendre la structure des pages et, s'il leur est demandé de restituer une ressource au format HTML, fournir un contenu HTML qui reflète l'état initial d'une application Web. Cela signifie que les applications Web se chargent beaucoup plus rapidement que si le serveur fournit simplement une page de stub et que les navigateurs remplissent ensuite le contenu réel. Actuellement, cela est fait avec JSDom et similaire, mais de la même manière, le noeud a des objets Request et Response intégrés, le maintien de fonctions DOM dans le cadre de la bibliothèque stdlib faciliterait cette tâche. 

0
mikemaccana

Si vous lisez DOM comme "des objets liés immédiatement accessibles à partir de mon script", alors la réponse " c'est le cas , mais c'est très différent d'un ensemble d'objets disponibles à partir d'un script de document Web". La raison principale en est que le nœud est 'Evented I/O for V8', et non 'HTML tree objects for V8'

0
Andrey Sidorov

Parce qu'il n'y a pas de DOM. DOM signifie Document Object Model. Il n'y a pas de document dans Node, donc pas de DOM pour le manipuler. C'est définitivement une chose de navigateur.

Vous pouvez utiliser une bibliothèque telle que cheerio mais qui vous donne quelques manipulations DOM simples.

Le nœud est un JavaScript au niveau du serveur. C'est juste le langage appliqué à une API système de base, plus proche de C++ ou Java.

0
samanime

Node.js est pour côté serveur programmation. Il n'y a pas de DOM à restituer sur le serveur.

0
hugomg