# jsdom changelog > Pure-JavaScript implementation of web standards, for running the DOM in Node. - Vendor: jsdom - Category: Developer Tools - Official site: https://github.com/jsdom/jsdom - Tracked by: What's New (https://whatsnew.fyi/product/jsdom) - Harvested from: GitHub (jsdom/jsdom) - Entries below: 10 (newest first) What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. ## Releases ### v30.0.1 - Date: 2026-07-29 - Version: v30.0.1 - Original notes: https://github.com/jsdom/jsdom/releases/tag/v30.0.1 - Permalink: https://whatsnew.fyi/product/jsdom/releases/v30.0.1 * Fixed `getComputedStyle()` with `calc()` and other functions throwing an exception, which regressed in v30.0.0. (@asamuzaK) * Sped up up range operations on large documents (@leonidaz) ### v30.0.0 - Date: 2026-07-27 - Version: v30.0.0 - Original notes: https://github.com/jsdom/jsdom/releases/tag/v30.0.0 - Permalink: https://whatsnew.fyi/product/jsdom/releases/v30.0.0 Breaking changes: - Node.js minimum version raised to `^22.22.2 || ^24.15.0 || >=26.0.0`. Other changes: * Added `CSS.escape()` and `CSS.supports()` functions. (@asamuzaK) * Added `'background-position-x'` and `'background-position-y'` CSS properties. (@olagokemills) * Fixed `getComputedStyle()` to convert length values into pixels. (@asamuzaK) * Fixed CSS function serialization, e.g., in the return value of `getPropertyValue()`. (@asamuzaK) * Fixed the type of error thrown by `document.evaluate()` (@dokson) ### v29.1.1 - Date: 2026-04-30 - Version: v29.1.1 - Original notes: https://github.com/jsdom/jsdom/releases/tag/v29.1.1 - Permalink: https://whatsnew.fyi/product/jsdom/releases/v29.1.1 * Fixed `'border-radius'` computed style serialization. (@asamuzaK) * Fixed computed style computation when using `'background-origin'` and `'background-clip'` CSS properties. (@asamuzaK) * Significantly optimized initial calls to `getComputedStyle()`, before the cache warms up. (@asamuzaK) ### v29.1.0 - Date: 2026-04-27 - Version: v29.1.0 - Original notes: https://github.com/jsdom/jsdom/releases/tag/v29.1.0 - Permalink: https://whatsnew.fyi/product/jsdom/releases/v29.1.0 * Added basic support for the ratio CSS type. (@asamuzaK) * Fixed `getComputedStyle()` sometimes returning outdated results after CSS was modified. (@asamuzaK) ### v29.0.2 - Date: 2026-04-07 - Version: v29.0.2 - Original notes: https://github.com/jsdom/jsdom/releases/tag/v29.0.2 - Permalink: https://whatsnew.fyi/product/jsdom/releases/v29.0.2 - Significantly improved and sped up `getComputedStyle()`. Computed value rules are now applied across a broader set of properties, and include fixes related to inheritance, defaulting keywords, custom properties, and color-related values such as `currentcolor` and system colors. (@asamuzaK) - Fixed CSS `'background`' and `'border'` shorthand parsing. (@asamuzaK) ### v29.0.1 - Date: 2026-03-20 - Version: v29.0.1 - Original notes: https://github.com/jsdom/jsdom/releases/tag/v29.0.1 - Permalink: https://whatsnew.fyi/product/jsdom/releases/v29.0.1 - Fixed CSS parsing of `'border'`, `'background'`, and their sub-shorthands containing keywords or `var()`. (@asamuzaK) - Fixed `getComputedStyle()` to return a more functional `CSSStyleDeclaration` object, including indexed access support, which regressed in v29.0.0. ### v27.4.0 - Date: 2026-03-15 - Version: v27.4.0 - Original notes: https://github.com/jsdom/jsdom/releases/tag/v27.4.0 - Permalink: https://whatsnew.fyi/product/jsdom/releases/v27.4.0 * Added `TextEncoder` and `TextDecoder`. * Improved decoding of HTML bytes by using the new [`@exodus/bytes`](https://www.npmjs.com/package/@exodus/bytes) package; it is now much more correct. (@ChALkeR) * Improved decoding of XML bytes to use UTF-8 more often, instead of sniffing for `` or using the parent frame's encoding. * Fixed a memory leak when `Range`s were used and then the elements referred to by those ranges were removed. ### v29.0.0 - Date: 2026-03-15 - Version: v29.0.0 - Original notes: https://github.com/jsdom/jsdom/releases/tag/v29.0.0 - Permalink: https://whatsnew.fyi/product/jsdom/releases/v29.0.0 Breaking changes: * Node.js v22.13.0+ is now the minimum supported v22 version (was v22.12.0+). Other changes: * Overhauled the CSSOM implementation, replacing the [`@acemir/cssom`](https://www.npmjs.com/package/@acemir/cssom) and [`cssstyle`](https://github.com/jsdom/cssstyle) dependencies with fresh internal implementations built on webidl2js wrappers and the [`css-tree`](https://www.npmjs.com/package/css-tree) parser. Serialization, parsing, and API behavior is improved in various ways, especially around edge cases. * Added `CSSCounterStyleRule` and `CSSNamespaceRule` to jsdom `Window`s. * Added `cssMediaRule.matches` and `cssSupportsRule.matches` getters. * Added proper media query parsing in `MediaList`, using `css-tree` instead of naive comma-splitting. Invalid queries become `"not all"` per spec. * Added `cssKeyframeRule.keyText` getter/setter validation. * Added `cssStyleRule.selectorText` setter validation: invalid selectors are now rejected. * Added `styleSheet.ownerNode`, `styleSheet.href`, and `styleSheet.title`. * Added bad port blocking per the [fetch specification](https://fetch.spec.whatwg.org/#bad-port), preventing fetches to commonly-abused ports. * Improved `Document` initialization performance by lazily initializing the CSS selector engine, avoiding ~0.5 ms of overhead per `Document`. (@thypon) * Fixed a memory leak when stylesheets were removed from the document. * Fixed `CSSStyleDeclaration` modifications to properly trigger custom element reactions. * Fixed nested `@media` rule parsing. * Fixed `CSSStyleSheet`'s "disallow modification" flag not being checked in all mutation methods. * Fixed `XMLHttpRequest`'s `response` getter returning parsed JSON during the `LOADING` state instead of `null`. * Fixed `getComputedStyle()` crashing in XHTML documents when stylesheets contained at-rules such as `@page` or `@font-face`. * Fixed a potential hang in synchronous `XMLHttpRequest` caused by a race condition with the worker thread's idle timeout. ### v28.1.0 - Date: 2026-03-15 - Version: v28.1.0 - Original notes: https://github.com/jsdom/jsdom/releases/tag/v28.1.0 - Permalink: https://whatsnew.fyi/product/jsdom/releases/v28.1.0 * Added `blob.text()`, `blob.arrayBuffer()`, and `blob.bytes()` methods. * Improved `getComputedStyle()` to account for CSS specificity when multiple rules apply. (@asamuzaK) * Improved synchronous `XMLHttpRequest` performance by using a persistent worker thread, avoiding ~400ms of setup overhead on every synchronous request after the first one. * Improved performance of `node.getRootNode()`, `node.isConnected`, and `event.dispatchEvent()` by caching the root node of document-connected trees. * Fixed `getComputedStyle()` to correctly handle `!important` priority. (@asamuzaK) * Fixed `document.getElementById()` to return the first element in tree order when multiple elements share the same ID. * Fixed `` elements to no longer incorrectly proxy event handlers to the `Window`. * Fixed `FileReader` event timing and `fileReader.result` state to more closely follow the spec. * Fixed a potential hang when synchronous `XMLHttpRequest` encountered dispatch errors. * Fixed compatibility with environments where Node.js's built-in `fetch()` has been used before importing jsdom, by working around undici v6/v7 incompatibilities. ### v28.0.0 - Date: 2026-03-15 - Version: v28.0.0 - Original notes: https://github.com/jsdom/jsdom/releases/tag/v28.0.0 - Permalink: https://whatsnew.fyi/product/jsdom/releases/v28.0.0 * Overhauled resource loading customization. See [the new README](https://github.com/jsdom/jsdom/blob/2b65c6a80af2c899e32933c5e0cb842164852149/README.md#loading-subresources) for details on the new API. * Added MIME type sniffing to `` (when `canvas` is installed) to fire `load` events, not `error` events, on non-OK HTTP responses. * Fixed many small issues in `XMLHttpRequest`.