jquery, sizzle, css-select, cheerio-select, and dom7 are libraries designed to traverse and manipulate document structures using CSS-like selectors. jquery is the historic standard for DOM manipulation in browsers, bundling its own selector engine (sizzle historically, now native-based). sizzle is the standalone selector engine originally built for jQuery, capable of running in various JS environments. css-select is a pure JavaScript CSS selector compiler and evaluator optimized for non-browser environments like Node.js, often used with cheerio. cheerio-select is a wrapper that combines css-select with specific adapters to provide a jQuery-compatible selection API for server-side HTML parsing. dom7 is a lightweight library with a jQuery-like API specifically optimized for modern mobile browsers and often used within the Framework7 ecosystem. While they share the goal of selecting elements, their runtimes (browser vs. server), performance characteristics, and API completeness differ significantly.
Selecting elements from a document is a fundamental task in web development. While modern browsers provide native APIs like document.querySelectorAll, the ecosystem still relies on several libraries to handle complex selection logic, ensure cross-browser consistency, or operate outside the browser environment. Let's compare jquery, sizzle, css-select, cheerio-select, and dom7 to understand where each fits in a modern architecture.
The most critical distinction is where these libraries run. Some require a live browser DOM, while others are designed specifically for server-side Node.js environments where no real DOM exists.
jquery requires a browser environment (or a DOM shim like jsdom in Node). It interacts directly with the live DOM.
// jquery: Runs in browser or with jsdom
const $ = require('jquery')(window);
const items = $('#list .item'); // Queries live DOM
dom7 is strictly for modern browsers. It does not support server-side rendering out of the box.
// dom7: Browser only
import { $ } from 'dom7';
const items = $('#list .item'); // Queries live browser DOM
sizzle is environment-agnostic but expects a document-like object to query against. It can run in Node if provided a DOM structure.
// sizzle: Standalone engine
const Sizzle = require('sizzle');
// Requires a root element (e.g., from jsdom)
const items = Sizzle('.item', document);
css-select and cheerio-select are built for Node.js. They work on parsed ASTs (Abstract Syntax Trees) generated by parsers like htmlparser2, not live browser DOMs.
// css-select: Server-side AST querying
const select = require('css-select');
const items = select('.item', domNode); // Queries parsed AST
// cheerio-select: Server-side with jQuery syntax
const cheerio = require('cheerio');
const $ = cheerio.load('<ul><li class="item">Hi</li></ul>');
const items = $('.item'); // Queries Cheerio's internal AST
How do these libraries actually find elements? Do they trust the browser, or do they implement their own logic?
jquery (versions 3+) primarily delegates to the native querySelectorAll for speed but falls back to its internal logic (historically sizzle) for edge cases or older browsers.
// jquery: Hybrid approach
// Internally tries native querySelectorAll first
$('div[data-active="true"]');
sizzle implements the full CSS selector specification in pure JavaScript. It does not rely on native browser methods, ensuring consistent behavior across all environments, even broken ones.
// sizzle: Pure JS implementation
// Handles complex selectors manually without native help
Sizzle('div:has(> span.active)');
dom7 uses native querySelectorAll whenever possible to maintain high performance on mobile devices, wrapping the results in its own array-like object.
// dom7: Native wrapper
// Uses document.querySelectorAll under the hood
$('.tab-item').addClass('active');
css-select compiles CSS selectors into highly optimized JavaScript functions tailored for traversing ASTs. It supports many CSS4 selectors that browsers might not yet support.
// css-select: Compiled evaluator
// Compiles selector to a function for fast AST traversal
select.compile('div:nth-child(2n+1)');
cheerio-select relies entirely on css-select as its engine but adds a layer to map the results back to Cheerio objects, ensuring jQuery compatibility.
// cheerio-select: Wrapper around css-select
// Uses css-select internally but returns Cheerio objects
$('p > span:first-child');
A common pitfall is assuming all these libraries can manipulate the DOM. Some are only selectors.
jquery provides a massive API for selection, traversal, manipulation, events, and AJAX. It is a full toolkit.
// jquery: Full manipulation
$('#btn').on('click', () => {
$(this).hide().fadeIn();
});
dom7 offers a subset of jQuery's API focused on DOM manipulation and events, optimized for mobile touch interactions.
// dom7: Manipulation included
$('.card').on('tap', function () {
this.classList.add('selected');
});
sizzle, css-select, and cheerio-select (as a standalone concept) are primarily selection engines. They return arrays of nodes. They do not have .hide(), .ajax(), or event systems.
// sizzle: Selection only
const nodes = Sizzle('.active');
nodes.forEach(node => node.style.display = 'none'); // Manual DOM API needed
// css-select: Selection only
const nodes = select('.active', root);
// Must manually modify the AST or convert to HTML string later
Note: When using cheerio-select via the main cheerio package, you get manipulation methods because Cheerio adds them on top of the selection engine.
// cheerio (using cheerio-select engine): Manipulation via wrapper
const $ = cheerio.load(html);
$('.active').remove(); // Cheerio method, not native to the selector engine
Performance depends heavily on the context: live DOM updates vs. static parsing.
jquery and dom7 incur the cost of interacting with the live browser DOM. Frequent queries can trigger reflows if not careful. dom7 is generally lighter than jquery because it drops legacy support.
// jquery: Can be heavy due to legacy abstractions
// Looping over large sets can be slower than native
$('li').each(function() { /* ... */ });
dom7 is optimized for modern engines, reducing overhead.
// dom7: Leaner iteration
$$('.li').forEach(el => { /* ... */ });
css-select and cheerio-select are extremely fast for server-side operations because they operate on simple JavaScript objects (ASTs) without the overhead of a browser's rendering engine.
// css-select: Fast AST traversal
// Ideal for scraping thousands of documents
select.all('a[href]', documentRoot);
sizzle is generally slower than native browser selectors because it executes JavaScript logic for every step, but it is more consistent.
// sizzle: Consistent but slower than native
// Useful when native implementation is buggy
Sizzle('custom-tag[data-x]');
You maintain a 10-year-old internal tool with complex DOM manipulations and IE11 requirements.
jquery// jquery: Handling legacy events
$('#submit').bind('click', function(e) {
e.preventDefault();
$(this).closest('form').serialize();
});
You are building a hybrid mobile app needing touch events and DOM updates with minimal bundle size.
dom7// dom7: Touch interactions
$('.swipe-item').on('swipeleft', function () {
this.remove();
});
You need to extract data from thousands of HTML pages on a server.
cheerio (which uses cheerio-select/css-select)css-select logic is efficient.// cheerio: Server-side scraping
const $ = cheerio.load(htmlString);
const titles = $('h2').map((i, el) => $(el).text()).get();
You are building a custom HTML processor and need a reliable way to find nodes in a non-browser environment without the full Cheerio overhead.
css-select// css-select: Raw engine usage
const nodes = select('div.container', myCustomAstRoot);
It is vital to note the maintenance status of these tools.
sizzle: While still functional, the jQuery team has moved towards native selectors in recent jQuery versions. sizzle is in maintenance mode and generally should not be chosen for new projects unless you have a very specific need for a standalone, dependency-free selector engine that works in ancient environments. Native querySelectorAll or css-select (for Node) are better alternatives.jquery: Not deprecated, but considered legacy technology for new frontend development. Modern frameworks (React, Vue, Svelte) and native APIs have replaced its primary use cases.dom7, css-select, and cheerio-select: Actively maintained and relevant for their specific niches (mobile apps and server-side processing).| Feature | jquery | dom7 | sizzle | css-select | cheerio-select |
|---|---|---|---|---|---|
| Primary Env | Browser (Legacy) | Browser (Mobile) | Any (Standalone) | Node.js (AST) | Node.js (AST) |
| DOM Manipulation | โ Full | โ Subset | โ No | โ No | โ (Via Cheerio) |
| Engine | Native + Fallback | Native | Pure JS | Pure JS (Compiled) | Pure JS (via css-select) |
| Bundle Size | Large | Small | Medium | Tiny | Tiny (Engine only) |
| Use Case | Legacy Maintenance | Mobile Apps | Custom Engines | Scraping/Tools | Server-side Rendering |
The choice here isn't just about "which selector is fastest"; it's about where your code runs and what problem you are solving.
If you are in the browser starting a new project, you likely don't need any of these for selectionโuse native document.querySelectorAll. If you need manipulation helpers in a mobile context, dom7 is a solid, lightweight choice. If you are working on the server, css-select (directly or via cheerio) is the only correct architectural choice due to the lack of a real DOM.
Avoid sizzle for new work; its role has been superseded by native browser capabilities and specialized Node.js libraries. Reserve jquery for maintaining the past, not building the future.
Choose cheerio-select if you are already using cheerio for server-side HTML parsing and need a selector engine that strictly mimics jQuery's behavior, including specific quirks and extensions, to ensure consistency between server-side rendering logic and client-side expectations.
Choose css-select when building server-side tools, scrapers, or static analysis utilities in Node.js that need to query HTML/XML documents represented as abstract syntax trees (ASTs) rather than live DOM nodes. It is the engine of choice for performance-critical non-browser environments where native DOM APIs are unavailable.
Choose dom7 if you are developing high-performance mobile web applications, particularly within the Framework7 ecosystem, where you need a jQuery-like syntax but with a much smaller footprint and optimizations for modern mobile browsers (iOS Safari, Chrome Android). It is not suitable for server-side rendering or legacy desktop browser support.
Choose jquery if you are maintaining a legacy codebase that heavily relies on its chainable API for DOM manipulation, event handling, and AJAX, or if you need to support very old browsers without polyfills. Avoid it for new greenfield projects where modern vanilla JS APIs (like querySelectorAll) or framework-based approaches (React, Vue) offer better performance and smaller bundle sizes.
Choose sizzle only if you need a standalone, robust CSS selector engine to embed in a custom project or legacy environment that cannot use native browser APIs and does not need the full DOM manipulation features of jQuery. For most modern use cases, native browser selectors or css-select (for Node.js) are preferred alternatives.
CSS selector engine supporting jQuery selectors, based on css-select.
Supports all jQuery positional pseudo-selectors:
:first:last:eq:nth:gt:lt:even:odd:not(:positional), where :positional is any of the above.This library is a thin wrapper around css-select.
Only use this module if you will actually use jQuery positional selectors.