İçerik
Grunt, kısaca bir görev çalıştırıcısıdır. Front-end’de ihtiyaç duyabileceğimiz, sürekli olarak çalıştırdığımız ya da iş yükü fazla olup ara-sıra çalıştırdığımız kod bloklarını otomatik olarak çalıştırmamıza yardımcı oluyor. Çalışma mantığını anladıktan sonra ve hâli hazırda yazılmış eklentileri gördükten sonra yapabilecekleriniz için hayal gücünüzü kullanmanıza gerek kalmayacaktır.
Grunt nedir, nasıl kurulur, kullanılır, örnekler vs olabildiğince değinmeye çalışacağım. Şimdi biraz derine inelim…
Grunt Nedir ?
Grunt, yukarıda da belirttiğim üzere görev çalıştırıcısı (koşucusudur), yani terimsel olarak ifade edilecek olursa task runner‘dır. Başka bir task runner olan Gulp’un sağlam bir rakibidir (diyorlar, bana göre ayrı kulvardalar). Görevleri belirler, yapması gerekenleri ifade eder ve çalıştırırsınız, tüm olay aslında bundan ibarettir. Örneğin;
- LESS ya da SASS kullanıyorsanız bu dosyanızı compile ettirebilir,
- Javascript dosyalarınızı minify ettirebilir,
- Bir çok javascript dosyanız varsa bunları bundle haline getirebilirsini
gibi daha bir çok alternatifiniz bulunmakta.
Bu saydıklarım sadece bir kaç örnekten ibaret elbette… Siz de kendi görevinizi oluşturabilir ve Gruntlayabilirsiniz – tabii yazılmışları önce bir incelerseniz boşuna zaman kaybetmez ve alternatif fikirler de elde edinebilirsiniz.
Hazır pluginlere buradan bakabilirsiniz.
Grunt Kurulumu
Kurulum için öncelikle Node.js kurmanız gerekiyor. Eğer Node kurulu ise aşağıdaki satırı, komut satırında çalıştırarak kurabilirsiniz.
1 |
npm install -g grunt-cli |
Kurmuş olduğumuz grunt-cli
dir. “CLI”, command line interface‘in kısaltmasıdır. grunt-cli’ı kurduktan sonra herhangi bir dizindeyken komut satırında grunt
yazarak çalıştırabilirsiniz. Her proje için yeniden kurulum yapmanıza gerek yok.
Küçük not: eğer Node u yeniden kuruyorsanız ve Windowstaysanız command promt u yeniden başlatmanız gerekiyor.
Gereksinim
Her proje için node ile grunt paketini kurmamız gerekiyor. Bunun için öncelikle node’u initialize etmemiz gerekiyor… proje dizinine gidip komut satırına;
1 |
npm init |
yazıp çalıştırıyoruz ve projemizin ismini cismini sormaya başlıyor. Bu bilgiler çok önemli olmadığı için enter enter yapa yapa devam edebilirsiniz. En sonunda “Bu bilgiler doğru mu?” diye sorduğunda yine enter a basıp devam edebilirsiniz. Bu işlem node.js’in dosyası olan package.json dosyasını oluşturmaya yarar ve içine projemiz için ihtiyaç duyacağımız paketleri belirtmek için kullanacağız.
1 |
npm install grunt --save |
yazıp çalıştırmamız gerekiyor. Ardından node_modules
diye bir klasör oluşacak ve klasör içine grunt
klasörü eklenecek ve içine de ihtiyaç duyduğu diğer paketler eklenecektir. Not: Buradaki --save
parametresini eklemezseniz package.json
dosyasına gereksinim olarak eklemez.
Gruntfile
Şimdi de Grunt’ın konfigürasyon dosyası olan Gruntfile.js
dosyasını oluşturmamız gerekiyor. Aşağıda boş bir Gruntfile.js
örneği mevcut.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
module.exports = function(grunt) { grunt.initConfig({ // tasklar bura yazilacak }); // grunt'a npm tasklari yukluyoruz. // yukaridaki tasklar loadNpmTasks yapmadan calismaz. // grunt.loadNpmTasks('npm-islemi-herbiri-ayri-satira'); // grunt.registerTask('default', ['task1', 'task2']); grunt.registerTask('default', []); }; |
Bu kod bloğunu taslak olarak varsayın ve isterseniz bir yere kaydedin. Mevcut sürümde boş bir şekilde çalışan gruntfile budur. Tabîi açıklama satırlarını silebilirsiniz… Test etmek için komut satırına sadece
1 |
grunt |
yazmanız yeterli. Eğer bir hata alıyorsanız grunt ya da grunt-cli yüklemede bir problem olmuştur. Hata almıyorsanız konsol çıktısı aşağıdaki gibi olacaktır.
1 |
Done. |
Artık görevleri yazmaya başlayabiliriz anlamına geliyor bu…
Görevleri seçerken daha çok kendi çok kullandıklarımı tercih ettim, siz de ilk başta bunları kullanırsanız (örnekleri yaparken) bir problem olduğunda belirtmeniz kolay olur.
Örnek 1: Uglify
İlk görevimiz javascript dosyalarını minify etmek (sıkıştırmak) olacak. Bunun için grunt-contrib-uglify pluginini kullanacağız. Öncelikle plugini indiriyoruz
1 |
npm install grunt-contrib-uglify --save-dev |
Buradaki --save-dev
parametresi sadece developmentta kullanacağımız için devDependencies
arasına eklememize yarıyor. Yani --save
parametresinden farkı birisi productionda diğeri ise development + productionda kullanmamız için…
Gruntfileımızdaki tasklara aşağıdaki kod bloğunu ekliyoruz.
1 2 3 4 5 6 7 8 9 10 |
uglify: { hedef1: { options: { beautify: true }, files: { 'js/dosya.min.js': ['js/dosya.js'] } } } |
ardından uglifyı kullanabilmek için loadNpmTask yapıyoruz.
1 |
grunt.loadNpmTasks('grunt-contrib-uglify'); |
daha sonra ise registerTask yapıyoruz
1 |
grunt.registerTask('default', ['uglify:hedef1']); |
Eğer adımları doğru izlediyseniz sizin de dosyanız aşağıdaki gibi kaynak koda sahip olmalıydı;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
module.exports = function(grunt) { grunt.initConfig({ uglify: { hedef1: { options: { beautify: true }, files: { 'js/dosya.min.js': ['js/dosya.js'] } } } }); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.registerTask('default', ['uglify:hedef1']); }; |
Artık hazırız, komut satırında grunt yazıp çalıştırdığınızda js
klasöründeki dosya.js
adındaki dosya sıkıştırılacak(minify edilecek) ve dosya.min.js
adında yeni bir dosya olarak kaydedilecektir.
Not: Daha farkı özelliklere ait bir çok uglify oluşturabilirsiniz. Bunun için yapmanız gereken
hedef1
gibi farklı alt objeler oluşturmak ve ayarları vermek. Fakat aynı özelliklere ait olan farklı dosyalar elde etmek istiyorsanız sadecefiles
kısmına yeni bir alt nesne ekleyin. İnternette ilgili örnekler mevcut durumda.Eğer
hedef1
gibi farklı bir obje eklersenizregisterTask
’a da bunu belirtmeniz gerekiyor
Örnek 2: Uglify ve CSSMin
CSSMin ise adı üstünde CSS dosyalarınızı minify etmenize yardımcı olur. Productionda olabildiğince boyutu azaltmamız gerekiyor ne de olsa…
Yine öncelikle plugini indiriyoruz;
1 |
npm install grunt-contrib-cssmin --save-dev |
Ardından görevimizi ekliyoruz:
1 2 3 4 5 6 7 |
cssmin: { hedef1: { files: { 'cikti.min.css': ['foo.css', 'bar.css'] } } } |
sırada yine loadNpmTask var…
1 |
grunt.loadNpmTasks('grunt-contrib-cssmin'); |
ve son olarak registerTask’a ekliyoruz.
1 |
grunt.registerTask('default', ['uglify:hedef1', 'cssmin:hedef1']); |
Artık çalıştırmaya hazır. 2 adet css dosyası oluşturun (foo.css ve bar.css olarak) ve bırakın minify etsin.
Eğer herşeyi doğru yerine yerleştirdiyseniz aşağıdaki gibi bir dosyanız olmalı;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
module.exports = function(grunt) { grunt.initConfig({ uglify: { hedef1: { options: { beautify: true }, files: { 'js/dosya.min.js': ['js/dosya.js'] } } }, cssmin: { hedef1: { files: { 'cikti.min.css': ['foo.css', 'bar.css'] } } } }); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-cssmin'); grunt.registerTask('default', ['uglify:hedef1', 'cssmin:hedef1']); }; |
Aynı şekilde CSSMin’in de ayarları ve birden çok instance oluşturma özelliği mevcut. Plugin sayfasından detaylara bakabilirsiniz veya yardım isterseniz yorum yazabilirsiniz.
Kolaylıklar dilerim ;)
Kamil
Hocam mesela, her 10 dk da bir servise bağlanıp güncel datayı ekrana yenilenmeden getirmek için kullanabiliyor muyuz?
Ahmet Ertem
https://www.npmjs.com/package/grunt-crontab boyle bir plugin var fakat test etmedim hic :)
hakan
hocam nedir bu grunt webe yeni başladım bir tane templatem var çalıştıramadım bir türlü ne oldugunu anladım ama nasıl çalıştaracagım windosta localhostta bir türlü çözemedim.
FAHMI
Hocam mesela, her 10 dk da bir servise bağlanıp güncel datayı ekrana yenilenmeden getirmek için kullanabiliyor muyuz?
fatihcinar
Çok açık bir anlatım,elinize sağlık.