Saya mencoba menggunakan Grunt sebagai alat bantu membangun untuk aplikasi web saya.
Saya ingin memiliki setidaknya dua pengaturan:
I. Pengaturan pengembangan - memuat skrip dari file yang terpisah, tanpa gabungan,
jadi index.html saya akan terlihat seperti:
<!DOCTYPE html>
<html>
<head>
<script src="js/module1.js" />
<script src="js/module2.js" />
<script src="js/module3.js" />
...
</head>
<body></body>
</html>
II Setup produksi - muat skrip saya yang diperkecil & disatukan dalam satu file,
dengan index.html sesuai:
<!DOCTYPE html>
<html>
<head>
<script src="js/MyApp-all.min.js" />
</head>
<body></body>
</html>
Pertanyaannya adalah, bagaimana saya bisa membuat grunt membuat index.html ini tergantung pada konfigurasi ketika saya menjalankan grunt dev
atau grunt prod
?
Atau mungkin saya menggali ke arah yang salah dan akan lebih mudah untuk selalu menghasilkan MyApp-all.min.js
tetapi memasukkan semua skrip saya (concatenated) atau skrip loader yang secara sinkron memuat skrip-skrip tersebut dari file yang terpisah?
Bagaimana kamu melakukannya, kawan?
sumber
Jawaban:
Baru-baru ini saya menemukan
v0.4.0
tugas yang kompatibel dengan Grunt ini :menggerutu-preprocess
menggerutu-env
Berikut cuplikan dari saya
Gruntfile.js
.Pengaturan ENV:
Praproses:
Tugas:
Dan dalam
/src/tmpl/index.html
file template (misalnya):Saya yakin pengaturan saya berbeda dari kebanyakan orang, dan kegunaan di atas akan tergantung pada situasi Anda. Bagi saya, meskipun sedikit kode yang luar biasa, Yeoman grunt-usemin lebih kuat dari yang saya butuhkan secara pribadi.
CATATAN: Saya baru saja menemukan tugas-tugas yang tercantum di atas hari ini, jadi saya mungkin kehilangan fitur dan / atau proses saya mungkin berubah di jalan. Untuk saat ini, saya menyukai kesederhanaan dan fitur yang ditawarkan oleh grunt-preprocess dan grunt-env . :)
Pembaruan Jan 2014:
Termotivasi oleh suara turun ...
Ketika saya memposting jawaban ini, tidak ada banyak pilihan untuk Grunt
0.4.x
yang menawarkan solusi yang sesuai dengan kebutuhan saya. Sekarang, berbulan-bulan kemudian, saya kira ada lebih banyak pilihan di luar sana yang bisa lebih baik daripada yang saya posting di sini. Sementara saya secara pribadi masih menggunakan, dan menikmati menggunakan, teknik ini untuk membangun saya , saya meminta pembaca masa depan meluangkan waktu untuk membaca jawaban lain yang diberikan dan untuk meneliti semua opsi. Jika Anda menemukan solusi yang lebih baik, silakan kirim jawaban Anda di sini.Pembaruan Februari 2014:
Saya tidak yakin apakah ini akan membantu siapa pun, tetapi saya telah membuat repositori demo ini di GitHub yang memperlihatkan lengkap (dan lebih rumit penyiapan) menggunakan teknik yang telah saya uraikan di atas.
sumber
path : '/<%= pkg.name %>/dist/<%= pkg.version %>/<%= now %>/<%= ver %>'
yang menggabungkan semua var (itulah jalur build saya). Template saya akan memiliki:<script src="http://cdn.foo.com<!-- @echo path -->/js/bulldog.min.js"></script>
. Ngomong-ngomong, aku senang bisa menghemat waktu! : Ddata
objek yang berbeda untuk dev / prod.Saya sudah menemukan solusi saya sendiri. Belum dipoles tapi saya pikir saya akan bergerak ke arah itu.
Pada dasarnya, saya menggunakan grunt.template.process () untuk menghasilkan saya
index.html
dari template yang menganalisis konfigurasi saat ini dan menghasilkan daftar file sumber asli saya atau tautan ke file tunggal dengan kode minified. Contoh di bawah ini adalah untuk file js tetapi pendekatan yang sama dapat diperluas ke css dan file teks lainnya yang mungkin.grunt.js
:index.js (the index task)
:Akhirnya,
index.tmpl
dengan logika generasi yang dipanggang:UPD. Menemukan bahwa Yeoman , yang didasarkan pada mendengus, memiliki tugas usemin bawaan yang terintegrasi dengan sistem pembangunan Yeoman. Ini menghasilkan versi produksi index.html dari informasi dalam versi pengembangan index.html serta pengaturan lingkungan lainnya. Agak canggih tapi menarik untuk dilihat.
sumber
grunt.template.process()
(yang Anda gunakan di sini) yang akan membuat ini lebih mudah. Anda dapat melakukan hal yang sama menggunakan grunt-template hanya dengan mengirimkandata
objek yangberbedauntuk dev / prod.Saya tidak suka solusi di sini (termasuk yang saya berikan sebelumnya ) dan inilah alasannya:
Saya telah menemukan cara untuk menyelesaikan kedua masalah ini. Saya telah mengatur tugas kasar saya sehingga setiap kali file ditambahkan atau dihapus, tag skrip otomatis dihasilkan untuk mencerminkan hal itu. Dengan cara ini, Anda tidak perlu memodifikasi file html atau file mendengus Anda saat Anda menambah / menghapus / mengganti nama file JS Anda.
Untuk meringkas cara kerjanya, saya memiliki template html dengan variabel untuk tag skrip. Saya menggunakan https://github.com/alanshaw/grunt-include-replace untuk mengisi variabel itu. Dalam mode dev, variabel itu berasal dari pola globbing semua file JS saya. Tugas arloji menghitung ulang nilai ini ketika file JS ditambahkan atau dihapus.
Sekarang, untuk mendapatkan hasil berbeda dalam mode dev atau prod, Anda cukup mengisi variabel itu dengan nilai yang berbeda. Ini beberapa kode:
jsSrcFileArray
adalah pola menggumpal file grunt khas Anda.jsScriptTags
mengambiljsSrcFileArray
dan menyatukannya denganscript
tag di kedua sisi.destPath
adalah awalan yang saya inginkan pada setiap file.Dan inilah tampilannya HTML:
Sekarang, seperti yang Anda lihat di konfigurasi, saya menghasilkan nilai variabel itu sebagai
script
tag berkode keras ketika dijalankan dalamprod
mode. Dalam mode dev, variabel ini akan diperluas ke nilai seperti ini:Beri tahu saya jika Anda memiliki pertanyaan.
PS: Ini adalah jumlah kode gila untuk sesuatu yang ingin saya lakukan di setiap aplikasi JS sisi klien. Saya harap seseorang dapat mengubah ini menjadi plugin yang dapat digunakan kembali. Mungkin suatu hari nanti.
sumber
I've set up my grunt task so that every time a file is added or deleted, the script tags automatically get generated to reflect that
Bagaimana Anda melakukannya?<script>
tag HTML ?destPath
darijsScriptTags
dan bertukargrunt.file.expandMapping
dengangrunt.file.expand
karena file yang saya inginkan sudah di tempat yang benar. Ini banyak hal yang disederhanakan. Terima kasih @DanielKaplan, Anda telah menyelamatkan saya untuk waktu yang sangat lama :)Saya telah bertanya pada diri sendiri pertanyaan yang sama untuk sementara waktu, dan saya pikir plugin kasar ini dapat dikonfigurasi untuk melakukan apa yang Anda inginkan: https://npmjs.org/package/grunt-targethtml . Ini menerapkan tag html bersyarat, yang tergantung pada target kasar.
sumber
Saya mencari solusi yang lebih sederhana dan lurus sehingga saya menggabungkan jawaban dari pertanyaan ini:
Cara menempatkan if lagi memblokir di gruntfile.js
dan datang dengan langkah-langkah sederhana berikut:
Gunakan logika berikut di blok concat / copy Gruntfile.js Anda untuk file index.html Anda:
jalankan 'grunt --Release' untuk memilih file index-production.html dan tinggalkan flag untuk memiliki versi pengembangan.
Tidak ada plugin baru untuk ditambahkan atau dikonfigurasi dan tidak ada tugas kasar baru.
sumber
Tugas kasar ini bernama scriptlinker ini terlihat seperti cara mudah untuk menambahkan skrip dalam mode dev. Anda mungkin dapat menjalankan tugas concat terlebih dahulu dan kemudian arahkan ke file concatenated Anda dalam mode prod.
sumber
<!--SINON COMPONENT SCRIPTS-->
dan<!--SPEC SCRIPTS-->
. Dan di sini adalah tugas Grunt yang melakukannya (yang berfungsi, yang bertentangan dengan hal-hal dalam dokumen). Semoga ini bisa membantu;)grunt-dom-hijauer membaca dan memanipulasi HTML dengan pemilih CSS. Ex. baca tag dari html Anda. Hapus node, tambahkan node, dan banyak lagi.
Anda dapat menggunakan grunt-dom-hijauer untuk membaca semua file JS Anda yang ditautkan oleh index.html Anda, uglify mereka dan kemudian gunakan grunt-dom-hijauer lagi untuk memodifikasi indeks Anda.html untuk hanya menghubungkan JS yang diperkecil
sumber
Saya menemukan plugin kasar yang disebut grunt-dev-prod-switch. Yang perlu dilakukan adalah mengomentari blok tertentu yang dicari berdasarkan opsi --env yang Anda berikan untuk mendengus (meskipun membatasi Anda untuk dev, prod, dan test).
Setelah Anda mengaturnya seperti yang dijelaskan di sini , Anda dapat menjalankan misalnya:
grunt serve --env=dev
, dan yang dilakukannya hanyalah mengomentari blok yang dibungkus olehdan itu akan menghilangkan tanda blok yang dibungkus oleh
Ini juga berfungsi pada javascript, saya menggunakannya untuk mengatur alamat IP yang tepat untuk terhubung ke API backend saya. Blok hanya berubah menjadi
Dalam kasus Anda, sesederhana ini:
sumber
grunt-bake adalah skrip grunt yang fantastis yang akan bekerja sangat baik di sini. Saya menggunakannya dalam skrip build JQM otomatis saya.
https://github.com/imaginethepoet/autojqmphonegap
Lihatlah file grunt.coffee saya:
Ini terlihat pada semua file di base.html dan menghisapnya untuk membuat index.html berfungsi luar biasa untuk aplikasi multi halaman (phonegap). Ini memungkinkan pengembangan yang lebih mudah karena semua pengembang tidak bekerja pada satu aplikasi halaman tunggal yang panjang (mencegah banyak checkin konflik). Sebagai gantinya Anda dapat memecah halaman dan bekerja pada potongan kode yang lebih kecil dan kompilasi ke halaman penuh menggunakan perintah arloji.
Bake membaca templat dari base.html dan menyuntikkan halaman html komponen pada jam tangan.
jQuery Mobile Demo
app.initialize ();
Anda dapat mengambil langkah ini lebih jauh dan menambahkan suntikan di halaman Anda untuk "menu" "popup" dll sehingga Anda benar-benar dapat memecah halaman menjadi komponen yang lebih kecil yang dapat dikelola.
sumber
Gunakan kombinasi wiredep https://github.com/taptapship/wiredep dan usemin https://github.com/yeoman/grunt-usemin untuk meminta bantuan tugas-tugas ini. Wiredep akan menambahkan dependensi Anda satu file skrip pada satu waktu, dan usemin akan menggabungkan semuanya menjadi satu file untuk produksi. Ini kemudian dapat dicapai hanya dengan beberapa komentar html. Misalnya, paket bower saya secara otomatis disertakan dan ditambahkan ke html ketika saya menjalankan
bower install && grunt bowerInstall
:sumber
Jawaban ini bukan untuk noobs!
Gunakan Jade templating ... meneruskan variabel ke templat Jade adalah case use standar rawa
Saya menggunakan grunt (grunt-contrib-jade) tetapi Anda tidak harus menggunakan grunt. Cukup gunakan modul giok npm standar.
Jika menggunakan grunt maka gruntfile Anda akan menyukai sesuatu seperti ...
Kita sekarang dapat dengan mudah mengakses data yang dilewati oleh gerutuan di template Jade.
Sama seperti pendekatan yang digunakan oleh Modernizr, saya menetapkan kelas CSS pada tag HTML sesuai dengan nilai variabel yang diteruskan dan dapat menggunakan logika JavaScript dari sana berdasarkan pada apakah kelas CSS ada atau tidak.
Ini bagus jika menggunakan Angular karena Anda dapat melakukan ng-jika untuk memasukkan elemen dalam halaman berdasarkan pada apakah kelas ada.
Sebagai contoh, saya dapat menyertakan skrip jika kelas hadir ...
(Misalnya, saya dapat memasukkan skrip isi ulang langsung di dev tetapi tidak dalam produksi)
sumber
Pertimbangkan processhtml . Ini memungkinkan definisi beberapa "target" untuk bangunan. Komentar digunakan untuk memasukkan atau mengecualikan materi dari HTML:
menjadi
Ia bahkan bermaksud melakukan hal-hal bagus seperti ini (lihat README ):
sumber