Zero-Config โข DOM-Free โข HTML String โข Fast Node Testing
๐ค Astro component renderer. Zero configuration. Produces clean HTML strings directly in Node.js without any DOM environment. ๐ฌ
- โจ Features
- ๐ต๐ผ Usage
- ๐คน๐ผ API
- ๐๏ธ Examples
- โ๏ธ Implementation
- ๐ฏ Motivation
- ๐ Changelog
- ๐ชช License
- ๐ Support
- ๐งฌ Related
- ๐จ๐ปโ๐ป Author
- โจ Zero-config: drop in and render
Astrocomponents instantly - ๐ข Fast: pure
Node.js, noDOMsimulation overhead - ๐ง Returns clean HTML string: ready for snapshots or text checks
- ๐ซ No
happy-dom/jsdomneeded: runs in plain Node environment - โ
Works with
Vitest: perfect with@vitest-environment node - ๐ฆ Tiny footprint: minimal wrapper over Astro's
ContainerAPI - ๐ก๏ธ Safe types: full
TypeScriptsupport, exportedAstroComponentFactory - ๐ Supports
props/slots: pass options just likerenderToString - โก Modern baseline: Node
>=24, Astro>=6ready, leveraging the AstroContainer API - ๐งผ Clean errors: meaningful messages on render failures
Install it by executing any of the following, depending on your preferred package manager:
pnpm add -D @igorskyflyer/astro-render-componentyarn add -D @igorskyflyer/astro-render-componentnpm i -D @igorskyflyer/astro-render-componentasync function renderAstroComponent(
component: AstroComponentFactory,
options: ContainerRenderOptions = {}
): Promise<string>Renders an Astro component to an HTML string using the experimental Container API.
Server-side only utility โ no DOM environment required.
Perfect for Vitest tests (@vitest-environment node), snapshots, and SSR checks.
Render an Astro component to HTML string:
MyComponent.test.ts
// @vitest-environment node
import { renderAstroComponent } from '@igorskyflyer/astro-render-component'
import MyComponent from '../MyComponent.astro'
const html: string = await renderAstroComponent(MyComponent, {
props: { title: 'Hello' }
})
expect(html).toContain('<h1>Hello</h1>')This utility is a thin, zero-config wrapper over Astro's experimental Container API:
- Core API used
experimental_AstroContainer.create()โ creates isolated render context
container.renderToString(component, options)โ renders to HTML string
- Behavior
- Server-side only: runs in plain Node.js (no DOM, no happy-dom/jsdom)
- Returns plain string containing full rendered HTML (tags, attributes, text, islands)
- Supports props, slots, and other
ContainerRenderOptions - Throws meaningful error on failure (e.g. invalid component, render crash)
- No side effects, no caching, no hydration setup
- Key characteristics
- Type-safe: derives
AstroComponentFactoryfromrenderToStringsignature - ESM-only output (.js + .d.ts)
- Designed for testing (Vitest with
@vitest-environment node) and lightweight SSR
- Type-safe: derives
Provide the lightest possible server-side Astro component renderer: zero config, no DOM dependency, fast HTML string output for testing and SSR checks.
Read about the latest changes in the CHANGELOG.
Licensed under the MIT license.
involves a significant investment of time.
If this project or its implementation has provided value,
support is greatly appreciated.
Thank you for supporting these efforts! ๐๐
@igorskyflyer/astro-easynav-button
๐งญ Add an easy-to-use navigational button (jump to top/bottom) to your Astro site. ๐ผ
@igorskyflyer/astro-post-excerpt
โญ An Astro component that renders post excerpts for your Astro blog - directly from your Markdown and MDX files. Astro v2+ collections are supported as well! ๐
๐ช Provides ways of testing whether an array of chars is present inside a given String. โ
@igorskyflyer/magic-queryselector
๐ช A TypeScript-types patch for querySelector/querySelectorAll, make them return types you expect them to! ๐ฎ
@igorskyflyer/vscode-folderpicker
โจ Provides a custom Folder Picker API + UI for Visual Studio Code. ๐จ
Created by Igor Dimitrijeviฤ (@igorskyflyer).
