Server-side DOM implementation based on Mozilla's dom.js
As the name might suggest, domino's goal is to provide a DOM in Node.
In contrast to the original dom.js project, domino was not designed to run untrusted code. Hence it doesn't have to hide its internals behind a proxy facade which makes the code not only simpler, but also more performant.
Domino currently doesn't use any harmony features like proxies or WeakMaps and therefore also runs in older Node versions.
Speed over Compliance
Domino is intended for building pages rather than scraping them. Hence Domino doesn't execute scripts nor does it download external resources.
Also Domino doesn't implement any properties which have been deprecated in HTML5.
Note that because domino does not use proxies,
length property and an
item(n) accessor method. See
github issue #27 for
CSS Selector Support
Domino provides support for
matches() backed by the Zest selector engine.
The only exception is the initial creation of a document:
var domino = require('domino'); var Element = domino.impl.Element; // etc var window = domino.createWindow('<h1>Hello world</h1>', 'http://example.com'); var document = window.document; // alternatively: document = domino.createDocument(htmlString, true) var h1 = document.querySelector('h1'); console.log(h1.innerHTML); console.log(h1 instanceof Element);
If you want a more standards-compliant way to create a
Document, you can
also use DOMImplementation:
var domino = require('domino'); var domimpl = domino.createDOMImplementation(); var doc = domimpl.createHTMLDocument();
By default many domino methods will be stored in writable properties, to allow polyfills (as browsers do). You can lock down the implementation if desired as follows:
global.__domino_frozen__ = true; // Must precede any `require('domino')` var domino = require('domino');
The tests can be run via
npm test or directly though the Mocha command line: