![Happy DOM Logo](https://github.com/capricorn86/happy-dom/raw/master/docs/happy-dom-logo.jpg)
About
Happy DOM is a JavaScript implementation of a web browser without its graphical user interface. It includes many web standards from WHATWG DOM and HTML.
The goal of Happy DOM is to emulate enough of a web browser to be useful for testing, scraping web sites and server-side rendering.
Happy DOM focuses heavily on performance and can be used as an alternative to JSDOM.
DOM Features
And much more..
Works With
Module Systems
Installation
npm install happy-dom
Usage
Happy DOM can be used as a simulated Browser or by using the Window class directly to quickly setup up a DOM.
Window
import { Window } from 'happy-dom';
const window = new Window({ url: 'https://localhost:8080' });
const document = window.document;
document.body.innerHTML = '<div class="container"></div>';
const container = document.querySelector('.container');
const button = document.createElement('button');
container.appendChild(button);
console.log(document.body.innerHTML);
await window.happyDOM.close();
Browser
import { Browser, BrowserErrorCaptureEnum } from 'happy-dom';
const browser = new Browser({ settings: { errorCapture: BrowserErrorCaptureEnum.processLevel } });
const page = browser.newPage();
await page.goto('https://github.com/capricorn86');
page.mainFrame.document.querySelector('a[href*="capricorn86/happy-dom"]').click();
await page.waitUntilComplete();
console.log(page.mainFrame.document.title);
await browser.close();
Documentation
Read more about how to use Happy DOM in our Wiki.
Performance
Operation | JSDOM | Happy DOM |
---|
Import / Require | 333 ms | 45 ms |
Parse HTML | 256 ms | 26 ms |
Serialize HTML | 65 ms | 8 ms |
Render custom element | 214 ms | 19 ms |
querySelectorAll('tagname') | 4.9 ms | 0.7 ms |
querySelectorAll('.class') | 6.4 ms | 3.7 ms |
querySelectorAll('[attribute]') | 4.0 ms | 1.7 ms |
querySelectorAll('[class~="name"]') | 5.5 ms | 2.9 ms |
querySelectorAll(':nth-child(2n+1)') | 10.4 ms | 3.8 ms |
See how the test was done here
Jest
Happy DOM provide with a package called @happy-dom/jest-environment that makes it possible to use Happy DOM with Jest.
Vitest
Vitest supports Happy DOM out of the box.
Global Registration
Happy DOM provide with a package called @happy-dom/global-registrator that can register Happy DOM globally. It makes it possible to use Happy DOM for testing in a Node environment.
Sister Projects
![Happy Conventional Commit](https://raw.githubusercontent.com/capricorn86/happy-conventional-commit/main/docs/logo_thumbnail.jpg)
![RTVision](https://avatars.githubusercontent.com/u/8292810?s=200&v=4)