A small ESM/UMD library providing the fast request
function from Undici within Node, otherwise window.fetch
is utilized when running in a browser environment.
Upon trying to distribute a project, I found Undici could not be used on the client-side.
As such, this is a drop-in replacement for Undici when using bundlers like webpack/rollup.
Without the overhead of WHATWG Streams, the request method proves much faster than fetch in both latency and throughput.
Tests | Samples | Results | Tolerance | Difference with slowest |
---|---|---|---|---|
undici - fetch | 20 | 1028.31 req/sec | ± 2.71 % | - |
http - no keepalive | 10 | 3891.51 req/sec | ± 2.00 % | + 278.44 % |
undici - pipeline | 95 | 6034.47 req/sec | ± 2.95 % | + 486.83 % |
http - keepalive | 50 | 6382.57 req/sec | ± 2.98 % | + 520.68 % |
undici - request | 15 | 8528.35 req/sec | ± 2.11 % | + 729.35 % |
Bun (Recommended) - bun add undici-shim
PNPM - pnpm i undici-shim
When importing, the request
method is used by default, though it also works as a named export.
import request from 'undici-shim'
// or
import { request } from 'undici-shim'
Then simply call it asynchronously and return the response as usual. However, methods like .json()
and .text()
have been moved to the body instead of the response like the standard fetch
.
const res = await request('https://jsonplaceholder.typicode.com/posts/1')
console.log(await res.body.json())
For consistency across environments, you can use Undici fetch instead.
import { fetch } from 'undici-shim'
const res = await fetch('https://jsonplaceholder.typicode.com/posts/1')
console.log(await res.json())
const { fetch } = require('undici-shim')
fetch('https://jsonplaceholder.typicode.com/posts/1')
.then(res => res.json())
.then(console.log)
Node
Starting from v1.3.2, named exports are identical to Undici.
import { request, Dispatcher, Headers, ... } = from 'undici-shim'
Browser
import { fetch, Request, Response, Headers } = from 'undici-shim'