Why doesn't Node.js have a native DOM?

The DOM is the DOM, and the JavaScript implementation is simply a separate entity. The DOM represents a set of facilities that a web browser exposes to the JavaScript environment. There's no requirement however that any particular JavaScript runtime will have any facilities exposed via the global object.

What Node.js is is a stand-alone JavaScript environment completely independent of a web browser. There's no intrinsic link between web browsers and JavaScript; the DOM is not part of the JavaScript language or specification or anything.

I use the old Rhino Java-based JavaScript implementation in my Java-based web server. That environment also has nothing at all to do with any DOM. It's my own application that's responsible for populating the global object with facilities to do what I need it to be able to do, and it's not a DOM.

Note that there are projects like jsdom if you want a virtual DOM in your Node project. Because of its very nature as a server-side platform, a DOM is a facility that Node can do without and still make perfect sense for a wide variety of server applications. That's not to say that a DOM might not be useful to some people, but it's just not in the same category of services as things like process control, I/O, networking, database interop, and so on.

There may be some "official" answer to the question "why?" out there, but it's basically just the business of those who maintain Node (the Node Foundation now). If some intrepid developer out there decides that Node should ship by default with a set of modules to support a virtual DOM, and successfully works and works and makes that happen, then Node will have a DOM.


P.S: When reading this question I was also wondering if V8 (node.js is built on top of this) had a DOM

Why when it uses the same JS engine as Chrome doesn't it have a native DOM?

But I searched google and found Google's V8 page which recites the following:

JavaScript is most commonly used for client-side scripting in a browser, being used to manipulate Document Object Model (DOM) objects for example. The DOM is not, however, typically provided by the JavaScript engine but instead by a browser. The same is true of V8—Google Chrome provides the DOM. V8 does however provide all the data types, operators, objects and functions specified in the ECMA standard.

node.js uses V8 and not Google Chrome.

Likewise, why doesn't it have a mode to run JS in retrieved pages?

I also think we don't really need it that bad. Ryan Dahl created node.js as one man (single programmer). Maybe now he (his team) will develop this, but I was already extremely amazed by the amount of code he produced (crazy). He wanted to make a non-blocking easy/efficient library, which I think he did a mighty good job at.

But then again, another developer created a module which is pretty good and actively developed (today) at https://github.com/tmpvar/jsdom.

What am I not understanding about Javascript engines vs the engine in a web browser? :)

Those are different things as is hopefully clear from the quote above.


The Document Object Model (DOM in short) is a programming interface for HTML and XML documents and it represents the page so that programs can change the document structure, style, and content. More on this subject.


The necessary distinction between client-side (browser) and server-side (Node.js) and their main goals:

  • Client-side: accessing and displaying information of the web
  • Server-side: providing stable and reliable ways to deliver web information

Why is there no DOM in Node.js be default?

By default, Node.js doesn't have access, nor have any knowledge about the actual DOM in your own browser. Node.js just delivers the data, that will be used by your own browser to process and render the whole website, the DOM included. The server provides the data to your browser to use and process. That is the intended way.

Why wouldn't you want to access the DOM in Node.js?

Accessing your browser's actual DOM using Node.js would be just simply out of the goal of the server. Your own browser's role is to display the data coming from the server. However it is certainly possible and there are multiple solutions in different level of depths and varieties to pre-render, manipulate or change the DOM using AJAX calls. We'll see what future trends will bring.

Why would you want to access the DOM in Node.js?

By default, you shouldn't access your own, actual DOM (at least some data of it) using Node.js. Client-side and server-side are separated in terms of role, functionality, and responsibility based on years of experience and knowledge. Although there are several situations, where there are solid reasons to do so:

  • Gathering usage data (A/B testing, UI/UX efficiency and feedback)
  • Headless testing (Development, automation, web-scraping)

How can you access the DOM in Node.js?

  • jsdom: pure-JavaScript implementation, good for testing your own DOM/browser-related project
  • cheerio: great solution if you like/often use jQuery
  • puppeteer: Google's own way to provide headless testing using Google Chrome
  • own solution (your possible future project link here)

Although these solutions do not provide a way to access your browser's own, actual DOM by default, but you can create a project to send some form of data about your DOM to the server, then use/render/manipulate that data based on your needs.

...and yes, web-scraping and web development in terms of tools and utilities became more sophisticated and certainly easier in several fields.


node.js chose not to include it in their standard library. For any functionality, there is an inevitable tradeoff between comprehensiveness, scalability, and maintainability.

That doesn't mean it's not potentially useful. There is at least one JavaScript DOM implementation intended for NodeJS (among other CommonJS implementations).