servo-fetch
v0.13.1
Published
Fetch, render, and extract web content as Markdown, JSON, or screenshots with an embedded Servo browser engine. No Chromium required.
Downloads
370
Maintainers
Readme
servo-fetch
Node.js bindings for servo-fetch — fetch, render, and extract web content with an embedded Servo browser engine.
- No Chromium — single self-contained binary, bundled in the package
- JavaScript execution — full Servo engine with SpiderMonkey
- Schema extraction — declarative CSS-selector → structured JSON, no LLM
- Streaming crawl —
for awaitover pages as they complete - Typed — first-class TypeScript types, ESM and CommonJS
Install
npm install servo-fetchThe prebuilt binary for your platform is selected automatically through
optionalDependencies.
Supported targets: macOS (arm64, x64), Linux glibc (x64, arm64), Windows x64.
Quick Start
import { fetch, extract, crawl, map, screenshot } from "servo-fetch";
const md = await fetch("https://example.com"); // readable Markdown
const article = await extract("https://example.com"); // Readability data
console.log(article.title, article.textContent);
for await (const page of crawl("https://docs.example.com", { limit: 50 })) {
if (page.ok) console.log(page.url, page.title);
}
const urls = await map("https://example.com"); // sitemap discovery, no render
const png = await screenshot("https://example.com", { fullPage: true });Schema Extraction
import { extractSchema } from "servo-fetch";
const products = await extractSchema("https://shop.example.com", {
baseSelector: ".product",
fields: [
{ name: "title", selector: "h2", type: "text" },
{ name: "price", selector: ".price", type: "text" },
{ name: "url", selector: "a", type: "attribute", attribute: "href" },
],
});CLI
The bundled binary is also runnable directly:
npx servo-fetch "https://example.com"
npx servo-fetch "https://example.com" --format png -o page.pngAPI
| Function | Returns | CLI equivalent |
| --- | --- | --- |
| fetch(url, opts?) | Promise<string> (Markdown) | default |
| fetchHtml(url, opts?) | Promise<string> | --format html |
| fetchText(url, opts?) | Promise<string> | --format text |
| extract(url, opts?) | Promise<Article> | --format json |
| extractSchema<T>(url, schema, opts?) | Promise<T> | --schema |
| screenshot(url, opts?) | Promise<Buffer> | --format png |
| evaluate(url, expr, opts?) | Promise<string> | --js |
| batchFetch(urls, opts?) | Promise<BatchResult[]> | parallel fetch |
| crawl(url, opts?) | AsyncGenerator<CrawlResult> | crawl |
| crawlAll(url, opts?) | Promise<CrawlResult[]> | crawl |
| map(url, opts?) | Promise<MappedUrl[]> | map |
| version() | Promise<string> | --version |
Single-page calls accept { timeout, settle, userAgent, cookiesFile, headers, selector, visibility, signal }; crawl and map also accept headers.
Calls share one persistent servo-fetch process (warm engine), spawned on first use; shutdown() stops it.
Env: SERVO_FETCH_BINARY_PATH overrides binary resolution; SERVO_FETCH_ALLOW_PRIVATE=1 relaxes the SSRF guard for loopback/private addresses (trusted environments only).
Develop
Requires pnpm.
pnpm install
pnpm run build # tsdown
pnpm test # vitest
pnpm run typecheck # tsc --noEmit
pnpm run lint # biome (lint + format + import sort)