Klasik node_modules yapısı artık tek yöntem değil
Yeni pnpm kullanıcıları sık sık bana pnpm'in yarattığı node_modules
'ün garip yapısını soruyor. Neden düz yapıda değil? Tüm alt bağımlılıklar nerede?
Makalenin okuyucularının npm ve Yarn tarafından oluşturulan
node_modules
yapısına zaten aşina olduğunu varsayacağım. Npm 3'ün neden v3'tenode_modules
'ün düz yapısını kullanmaya başlaması gerektiğini anlayamadıysanız, bazı eski kaynakları inceleyebilirsiniz: Neden pnpm kullanmalıyız?.
Öyleyse neden pnpm'in node_modules
'ü olağandışı? İki dizin oluşturalım ve birinde npm add express
, diğerinde ise pnpm add express
komutlarını çalıştıralım. İşte ilk dizinin node_modules
'ünden elde ettiğiniz klasör yapısı:
.bin
accepts
array-flatten
body-parser
bytes
content-disposition
cookie-signature
cookie
debug
depd
destroy
ee-first
encodeurl
escape-html
etag
express
Klasör yapısının tamamını burada görebilirsiniz.
Ve bu ise, pnpm tarafından oluşturulan node_modules
:
.pnpm
.modules.yaml
express
Buradan kontrol edebilirsiniz.
Peki, tüm bu bağımlılıklar nerede? Görüldüğü üzere, node_modules
'te .pnpm
adında yalnızca bir klasör ve express
adında bir sembolik bağlantı var. Eh, biz zaten sadece express
yükledik, bu yüzden uygulamanızın erişmesi gereken tek paket bu
pnpm'in katı kurallılığının neden iyi bir şey olduğu hakkında daha fazla bilgi edinin
Bakalım, express
içinde neler var:
▾ node_modules
▸ .pnpm
▾ express
▸ lib
History.md
index.js
LICENSE
package.json
Readme.md
.modules.yaml
express
'in node_modules
'ü yok mu? express
'in tüm bağımlılıkları nerede?
İşin püf noktası, express
'in sadece bir sembolik bağlantı olmasıdır. Node.js bağımlılıkları çözdüğünde, onların gerçek konumlarını kullanır, bu nedenle sembolik bağlantıları korumaz. Ancak, express
'in gerçek konumu nerede diye sorabilirsiniz?
İşte burada: node_modules/.pnpm/express@4.17.1/node_modules/express.
Tamam, şimdi .pnpm/
klasörünün amacını biliyoruz. .pnpm/
tüm paketleri düz bir klasör yapısında saklar, böylece her paket bu modelle adlandırılan bir klasörde bulunabilir:
.pnpm/<paket-adı>@<versiyon>/node_modules/<paket-adı>
Biz buna sanal saklama dizini diyoruz.
Bu düz yapı, npm v2 tarafından oluşturulan node_modules
'ün neden olduğu iç içe dosya yolu sorunlarını önler, ancak npm v3,4,5,6 veya Yarn v1 tarafından oluşturulan düz node_modules
yapısına gerek duymadan paketleri korur.
Şimdi, express
'in gerçek konumuna bakalım:
▾ express
▸ lib
History.md
index.js
LICENSE
package.json
Readme.md
Bu bir dolandırıcılık mı? Hala node_modules
yok! pnpm ' nin node_modules
yapısının ikinci hilesi, paketlerin bağımlılıklarının, bağımlı paketin gerçek konumlarının aynı dizin düzeyinde olmasıdır. Dolayısıyla express
'in bağımlılıkları .pnpm/express@4.17.1/node_modules/express/node_modules/
'ün içerisinde değil, .pnpm/express@4.17.1/node_modules/ içerisindedir:
▾ node_modules
▾ .pnpm
▸ accepts@1.3.5
▸ array-flatten@1.1.1
...
▾ express@4.16.3
▾ node_modules
▸ accepts
▸ array-flatten
▸ body-parser
▸ content-disposition
...
▸ etag
▾ express
▸ lib
History.md
index.js
LICENSE
package.json
Readme.md
express
'in tüm bağımlılıkları, node_modules/.pnpm/
içindeki uygun dizinlere sembolik bağlantılardır. express
'in bağımlılıklarını bir seviye yukarı yerleştirmek dairesel sembolik bağlantılardan kaçınmayı sağlar.
Gördüğünüz gibi, pnpm'in node_modules
yapısı ilk bakışta olağandışı görünse de:
- Tamamıyla Node.js uyumlu
- paketler bağımlılıklarıyla güzel bir şekilde gruplandırılmıştır
Eş bağımlılıkları olan paketler için yapı biraz daha karmaşık, ancak fikir aynıdır: düz bir dizin yapısıyla iç içe yerleştirme oluşturmak için sembolik bağlantılar kullanmaktır.