Ana içeriğe atla

Klasik node_modules yapısı artık tek yöntem değil

· 3 dakikalık okuma

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'te node_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:

  1. Tamamıyla Node.js uyumlu
  2. 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.