TL;DR

WHATWG の DOM と HTML の標準など、多くの Web 標準を純粋な JavaScript で実装したライブラリ。Node.js 上でブラウザの一部を模倣できる。

なぜ必要か

Node.js にはブラウザの DOM API がないので、そのままでは DOM を操作するコードをテストできない。公式の README によると、jsdom は実際の Web アプリケーションをテストしたりスクレイピングしたりできる程度に、ブラウザの一部を模倣することを目指している。Jest でフロントエンドのコードをテストするときにも使われる。

仕組み

HTML をブラウザと同じようにパースし、window や document を持つ環境を作る。URL や Cookie、コンソール出力の扱いもオプションで設定できる。ページ内のスクリプトの実行は、既定では無効になっている。

例

const { JSDOM } = require("jsdom")
const { document } = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`).window
console.log(document.querySelector("p").textContent) // "Hello world"

注意点

画面の描画はできず、レイアウトも計算しないので、レイアウトに関わるプロパティはダミーの値を返す。ページ遷移にも対応していない。README は jsdom のサンドボックスが完全ではないとしているので、runScripts: "dangerously" は信頼できるコードにだけ使う。

関連

出典