PnP
Plug'nPlay
Node.jsのnode_modulesにはいくつかの問題がある
木構造であるディレクトリでは依存関係グラフを正確に表現できない
同一名、同一バージョンのパッケージが複数箇所に出現する
hoistingと呼ばれる手法によって緩和できるが、今度は「本来requireできないはずのパッケージをrequireできてしまう」という問題が発生する
非常に巨大
とにかくファイルが多く、構築時に細かいファイルアクセスが大量に発生する
逆にioのベンチマークに使えるまであるtosuke.icon
この問題を「node_modulesを使わない」ことで解決するのがPnP
パッケージをアーカイブとして直接保持
requireやrequire.resolve、fsをモック
requireはパッケージ解決して、アーカイブを解凍して返すようにしてしまう
require.resolveはパッケージを示す仮想のパスを返すようにする
fsをモックして仮想のパスにアクセスしたときにアーカイブを解凍していい感じにするようにする
yarnだけの機能と思われがちだが、実はpnpmも対応しようとしている
https://pnpm.io/npmrc#node-linker
逆にyarnはpnpmの持つシンボリックリンクを使った効率的なnode_modulesの生成を取り込んでいる
https://github.com/yarnpkg/berry/blob/5411f76bcd89d1d6f430f4bd0e16146ce9fdd370/CHANGELOG.md#installs