Merhaba arkadaşlar, bugün sizlere özellikle büyük projelerde can sıkıcı bir hal alan build sürelerini, basit bir NPM script optimizasyonuyla nasıl gözle görülür şekilde kısalttığımı anlatacağım. Bu hatayı ilk gördüğümde kafayı yemiştim, çünkü her `npm run build` komutunu verdiğimde sanki bir kahve molası vermem gerekiyormuş gibi hissettiriyordu.
Sorunun Kökeni: Global mi, Lokal mi?
Sorunum şuydu: Projemdeki package.json dosyasındaki script'lerim, `webpack`, `babel`, `jest` gibi araçları global olarak yüklenmiş gibi çağırıyordu. Örneğin script'im şöyleydi:
Bu, sistemimde global olarak yüklü olan `webpack` ve `jest` komutlarını çalıştırıyordu. Ancak bu durumun iki büyük dezavantajı vardı. Birincisi, ekip arkadaşlarının makinelerinde global versiyon farklılıklarından kaynaklanan tutarsızlıklar yaşanıyordu. İkincisi ve daha önemlisi, bu araçların çalıştırılabilir dosyaları zaten projemin node_modules/.bin klasöründe duruyordu ve her seferinde PATH üzerinden globala bakmak bir gecikmeye sebep oluyordu. Ayrıca CI/CD pipeline'ında da bu tutarsızlık sorun yaratıyordu.
Çözüm: Doğrudan .bin Yoluna Gitmek
Çözüm aslında çok basitti. NPM veya Yarn, bir paketi yüklediğinde, onun çalıştırılabilir (binary) dosyasını `node_modules/.bin` dizini altına linkliyor. Script'lerimizi buradaki dosyaları doğrudan çağıracak şekilde yazarsak, sistemin global PATH'ini taramasına gerek kalmaz. İşte benim kullandığım en temiz çözüm:
Bu basit değişiklikle, komut çalıştırıldığında işletim sistemi doğrudan proje içindeki, o projeye özel versiyona gidiyor. Bu sayede:
Versiyon tutarlılığı %100 sağlandı.
Komut çalıştırma süresinde, özellikle büyük projelerde küçük ama hissedilir bir hızlanma oldu (PATH araması ortadan kalktı).
CI/CD ortamında "komut bulunamadı" hataları tarihe karıştı.
Bir Adım Ötesi: npm-run-all ile Paralel Çalıştırma
Bu optimizasyonu, `npm-run-all` paketi ile birleştirince build sürelerim daha da kısaldı. Örneğin, `build:js` ve `build:css` gibi birbirinden bağımsız işleri paralel çalıştırabilirsiniz.
Bu yapı, işlemci gücünüzü daha verimli kullanmanızı ve build sürelerini ciddi oranda düşürmenizi sağlar. Tabii ki script'lerin birbirine bağımlı olmamasına dikkat etmek gerekiyor.
Sonuç olarak, bu küçük görünen değişiklik proje yönetiminde büyük bir rahatlık getirdi. Siz de projelerinizdeki NPM script'lerini kontrol edip, global çağrılar yerine lokal `.bin` yolunu kullanıyor musunuz? Ya da build sürelerinizi kısaltmak için farklı hangi numaraları kullanıyorsunuz? Yorumlarda deneyimlerinizi paylaşın, hep birlikte öğrenelim!
Sorunum şuydu: Projemdeki package.json dosyasındaki script'lerim, `webpack`, `babel`, `jest` gibi araçları global olarak yüklenmiş gibi çağırıyordu. Örneğin script'im şöyleydi:
JSON:
"scripts": {
"build": "webpack --config webpack.prod.js",
"test": "jest"
}
Çözüm aslında çok basitti. NPM veya Yarn, bir paketi yüklediğinde, onun çalıştırılabilir (binary) dosyasını `node_modules/.bin` dizini altına linkliyor. Script'lerimizi buradaki dosyaları doğrudan çağıracak şekilde yazarsak, sistemin global PATH'ini taramasına gerek kalmaz. İşte benim kullandığım en temiz çözüm:
JSON:
"scripts": {
"build": "./node_modules/.bin/webpack --config webpack.prod.js",
"test": "./node_modules/.bin/jest",
"lint": "./node_modules/.bin/eslint src/",
"format": "./node_modules/.bin/prettier --write ."
}
Bu basit değişiklikle, komut çalıştırıldığında işletim sistemi doğrudan proje içindeki, o projeye özel versiyona gidiyor. Bu sayede:
Versiyon tutarlılığı %100 sağlandı.
Komut çalıştırma süresinde, özellikle büyük projelerde küçük ama hissedilir bir hızlanma oldu (PATH araması ortadan kalktı).
CI/CD ortamında "komut bulunamadı" hataları tarihe karıştı.
Bu optimizasyonu, `npm-run-all` paketi ile birleştirince build sürelerim daha da kısaldı. Örneğin, `build:js` ve `build:css` gibi birbirinden bağımsız işleri paralel çalıştırabilirsiniz.
JSON:
"scripts": {
"build:js": "./node_modules/.bin/webpack --config webpack.prod.js",
"build:css": "./node_modules/.bin/node-sass src/scss -o dist/css",
"build": "npm-run-all --parallel build:js build:css"
}
Bu yapı, işlemci gücünüzü daha verimli kullanmanızı ve build sürelerini ciddi oranda düşürmenizi sağlar. Tabii ki script'lerin birbirine bağımlı olmamasına dikkat etmek gerekiyor.
Sonuç olarak, bu küçük görünen değişiklik proje yönetiminde büyük bir rahatlık getirdi. Siz de projelerinizdeki NPM script'lerini kontrol edip, global çağrılar yerine lokal `.bin` yolunu kullanıyor musunuz? Ya da build sürelerinizi kısaltmak için farklı hangi numaraları kullanıyorsunuz? Yorumlarda deneyimlerinizi paylaşın, hep birlikte öğrenelim!