Prune unused npm dependencies with pnpm
pnpm, a npm replacement, follows the pattern of npm and downloads all optional
dependencies. This is normally fine, but as more packages use npm as a binary
distribution platform, the number of optional dependencies grows. For example,
esbuild
is a Go binary distributed via npm. To work, esbuild lists 24
supported operating systems and architectures as optional dependencies.
{ "name":"esbuild" , "version":"0.25.5" , "optionalDependencies": { "@esbuild/aix-ppc64":"0.25.5" , "@esbuild/android-arm":"0.25.5" , "@esbuild/android-arm64":"0.25.5" , "@esbuild/android-x64":"0.25.5" , "@esbuild/darwin-arm64":"0.25.5" , "@esbuild/darwin-x64":"0.25.5" , "@esbuild/freebsd-arm64":"0.25.5" , "@esbuild/freebsd-x64":"0.25.5" , "@esbuild/linux-arm":"0.25.5" , "@esbuild/linux-arm64":"0.25.5" , "@esbuild/linux-ia32":"0.25.5" , "@esbuild/linux-loong64":"0.25.5" , "@esbuild/linux-mips64el":"0.25.5" , "@esbuild/linux-ppc64":"0.25.5" , "@esbuild/linux-riscv64":"0.25.5" , "@esbuild/linux-s390x":"0.25.5" , "@esbuild/linux-x64":"0.25.5" , "@esbuild/netbsd-arm64":"0.25.5" , "@esbuild/netbsd-x64":"0.25.5" , "@esbuild/openbsd-arm64":"0.25.5" , "@esbuild/openbsd-x64":"0.25.5" , "@esbuild/sunos-x64":"0.25.5" , "@esbuild/win32-arm64":"0.25.5" , "@esbuild/win32-ia32":"0.25.5" , "@esbuild/win32-x64":"0.25.5" } }
The esbuild binary is about 10 MiB, so there's about 250 MiB of optional dependencies.
Most engineering orgs only care about a few operating systems, typically Linux
and Darwin, with both x64 and arm64 architectures. Luckily, pnpm provides
hooks to prune unused optional dependencies. The prune
hook runs after