login
RepoCritics — Review. Share. Archive. Every open-source repo.

denoland/std

Wiki: denoland/std

Source: https://github.com/denoland/std

Last synced 2026-07-18 · 1020 words · Edit wiki on GitHub →

denoland/std

> The Deno Standard Library — audited, web-standards-first building blocks, > published as independent @std/* packages on JSR.

GitHub repo · Official website · License: MIT

Overview

denoland/std (formerly deno_std; the old name still redirects) is the standard library for the Deno runtime, started in November 2018 alongside Deno itself. It fills the gap between Deno's deliberately small built-in API surface and what real programs need: paths, filesystem helpers, HTTP utilities, assertions, CSV/YAML/TOML/JSONC parsing, encoding, async primitives, CLI argument parsing, semver, UUIDs, streams — each shipped as its own semver'd package (@std/path, @std/assert, @std/csv, ...).

The library has lived through two identity shifts. Early std imitated Go's standard library — including Go-style Reader/Writer I/O interfaces — and was imported by URL from deno.land/std@0.x/, versioned as one monolithic 0.x release train. Around 2024 both decisions were reversed: the I/O layer was rebuilt on Web Streams and other web standards[^2], and distribution moved to JSR with per-package semantic versioning; deno.land/std was frozen at 0.224.0[^1]. The first wave of packages reached stable 1.0.0 in 2024[^3].

The 3.5k GitHub stars badly understate reach: std is a default dependency of most non-trivial Deno code, and JSR's @std scope is among the most-downloaded on the registry. Maintenance is healthy — pushes within days of writing and ~300 open issues under active triage by paid Deno company staff, not volunteers.

Getting Started

# Deno
deno add jsr:@std/assert jsr:@std/path

# Node.js / Bun (via JSR's npm compatibility layer)
npx jsr add @std/path
import { assertEquals } from "@std/assert";
import { join } from "@std/path";
import { delay } from "@std/async";

Deno.test("join builds platform-correct paths", async () => {
  await delay(10);
  assertEquals(join("users", "brad"), "users/brad");
});

Run with deno test. On Node/Bun, packages that only use web-standard APIs work as normal npm imports.

Architecture / How It Works

The repo is a monorepo where each top-level directory is one independently versioned JSR package with its own deno.json. Design rules are written down in an in-repo architecture guide[^2] and enforced in review:

  • Web standards first. APIs are built on ReadableStream, Uint8Array,

URL, AbortSignal — not runtime-specific primitives. The Go-derived Reader/Writer interfaces of early std were removed in the pre-1.0 cleanup.

  • Fine-grained modules. Most functions live in single-export files

(@std/path/join, @std/collections/chunk), so bundlers tree-shake well and you can import one function without pulling a kitchen sink.

  • Minimal coupling. Inter-package dependencies are kept few and explicit;

there is no shared "internal utils" grab bag exposed to users.

  • Stability tiers. Packages at >=1.0.0 follow strict semver; sub-1.0

packages (e.g. @std/log, @std/datetime for long stretches) follow a documented 0.x breaking-change convention[^4] and can churn between minors.

  • Runtime portability is per-package. JSR displays compatibility per

package. Anything touching the Deno.* namespace is Deno-only; pure-web-standard packages run on Node, Bun, browsers, and edge runtimes.

Test coverage is tracked publicly per package[^5]; stable packages require near-complete coverage plus documented examples on every exported symbol.

Production Notes

  • The URL-import era is over. deno.land/std serves nothing newer than

0.224.0[^1]. Old URLs keep resolving, but fixes land only on JSR; codebases on https://deno.land/std@0.x/... imports face a mechanical but tedious migration to jsr:@std/* specifiers.

  • Pre-1.0 history means old tutorials lie. Years of 0.x breaking changes:

std/http's serve() removed in favor of built-in Deno.serve; std/node moved into the Deno CLI; std/flags became @std/cli's parseArgs; std/testing/asserts became @std/assert. Assume any std snippet from before 2024 is stale until checked against JSR docs.

  • Mixed versions are normal, pin them anyway. Per-package semver means one

project legitimately holds @std/path@1.x next to @std/log@0.x. Commit the lockfile; sub-1.0 packages can break on minor bumps.

  • Node/Bun usage works but read the compat badge. JSR transpiles @std/*

for npm consumers, and web-standard packages behave identically. Packages that reach for Deno.* fail outside Deno — and the failure is late (call time), not at install time.

  • Don't reimplement what the runtime absorbed. Deno has steadily pulled std

functionality into the CLI (serve, Node compat). Check whether a built-in exists before adding the std package; the std team itself deprecates in that direction.

When to Use / When Not

Use when:

  • You write Deno code at all — std is the sanctioned first stop before any

third-party dependency.

  • You want coverage-tested parsing (CSV, YAML, TOML, JSONC), encoding, or path

handling instead of picking among npm micro-packages.

  • You need cross-runtime utilities built on web standards that behave the same

in Deno, Node, Bun, and edge workers.

Avoid when:

  • You target Node exclusively — Node's own core modules plus established npm

libraries have deeper ecosystem support, and JSR adds an indirection layer.

  • You need a package still at 0.x and can't absorb breaking minor releases.
  • You need what std deliberately excludes (ORMs, frameworks, heavy date math).

Alternatives

  • nodejs/node — when targeting Node only, its built-in node: core modules

cover most of the same ground with zero dependencies.

  • es-toolkit/es-toolkit — broader general-purpose utility belt (lodash

successor) when you need collection/function helpers beyond std's scope.

  • date-fns/date-fns — full-featured date manipulation; @std/datetime is thin

and long sat below 1.0.

  • unjs/pathe — drop-in cross-runtime path utilities when you want npm-native

distribution rather than JSR.

History

| Version | Date | Notes | |---------|------|-------| | repo created | 2018-11 | Started alongside pre-1.0 Deno; Go-stdlib-inspired design. | | 0.x train | 2019–2024 | Monolithic versioning, URL imports from deno.land/std, frequent breaking changes. | | JSR migration | 2024 | Split into per-package @std/* on JSR, independent semver[^3]. | | 0.224.0 | 2024 | Final release published to deno.land/std; URL distribution frozen[^1]. | | @std 1.0.0 | 2024 | First wave of packages stabilized under strict semver[^3]. |

References

[^1]: denoland/std README — "Newer versions ... hosted on JSR. Older versions up till 0.224.0 are still available at deno.land/std." https://github.com/denoland/std [^2]: Deno Standard Library architecture guide. https://github.com/denoland/std/blob/main/.github/ARCHITECTURE.md [^3]: JSR @std scope — per-package versions and stability status. https://jsr.io/@std [^4]: Pre-1.0 versioning follows the semver <1.0.0 proposal. https://github.com/semver/semver/pull/923 [^5]: Deno std test coverage explorer. https://std-coverage.deno.dev/

Tags

typescript, deno, standard-library, jsr, javascript, utilities, web-standards, cross-runtime, monorepo, testing