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