Skip to content

Provides Undici request in Node, native fetch in the browser.

License

Notifications You must be signed in to change notification settings

Owen3H/undici-shim

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

63 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

undici-shim Codacy Badge GitHub repo size

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.

Why?

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 %

Install

Bun (Recommended) - bun add undici-shim
PNPM - pnpm i undici-shim

Usage

ESM

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())

CommonJS

const { fetch } = require('undici-shim')

fetch('https://jsonplaceholder.typicode.com/posts/1')
    .then(res => res.json())
    .then(console.log)

Named Exports

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'