pnpm dùng content-addressable store: mỗi package version lưu một lần trong global store (~/.pnpm-store), tất cả projects symlink đến store — tiết kiệm disk đáng kể (100 projects dùng React chỉ lưu 1 copy). node_modules structure: pnpm tạo non-flat node_modules — mỗi package chỉ thấy dependencies được khai báo trong package.json của nó (strict mode).
- Phantom dependencies: npm/yarn hoist packages lên root node_modules, code có thể import packages không khai báo trong dependencies — chạy được locally nhưng fail ở nơi khác; pnpm strict mode ngăn phantom deps bằng cách không hoist.
- Workspace protocol: pnpm-workspace.yaml khai báo workspace packages; 'my-lib': 'workspace:*' trong dependencies để ref local packages — pnpm tự resolve khi install, thay bằng version thật khi publish.
- Performance: pnpm nhanh hơn npm vì hardlinks, parallel installs; tương đương hoặc nhanh hơn Yarn.
- Strict mode có thể break legacy code dùng phantom deps — dùng shamefully-hoist: true hoặc .npmrc để workaround. pnpm ngày càng phổ biến cho monorepos (Turborepo + pnpm là stack phổ biến).
pnpm uses a content-addressable store: each package version is stored once in a global store (~/.pnpm-store), and all projects symlink to that store — significant disk savings (100 projects using React store only 1 copy). node_modules structure: pnpm creates a non-flat node_modules — each package can only see dependencies declared in its own package.json (strict mode).
- Phantom dependencies: npm/yarn hoist packages to the root node_modules, so code can import packages not declared in dependencies — works locally but fails elsewhere; pnpm strict mode prevents phantom deps by not hoisting.
- Workspace protocol: pnpm-workspace.yaml declares workspace packages; 'my-lib': 'workspace:*' in dependencies to reference local packages — pnpm resolves automatically on install, replacing with the real version when publishing.
- Performance: pnpm is faster than npm due to hard links and parallel installs; comparable to or faster than Yarn.
- Strict mode may break legacy code using phantom deps — use shamefully-hoist: true or .npmrc as a workaround. pnpm is increasingly popular for monorepos (Turborepo + pnpm is a common stack).