Saya tertarik untuk mendengar bagaimana Anda lebih suka mengotomatiskan minifikasi Javascript untuk aplikasi web Java Anda. Berikut beberapa aspek yang sangat saya minati:
- Bagaimana cara mengintegrasikannya? Apakah ini bagian dari alat build Anda, filter servlet, program mandiri setelah pemrosesan file WAR, atau yang lainnya?
- Apakah mudah untuk mengaktifkan dan menonaktifkan ? Sangat tidak lucu untuk mencoba dan men-debug skrip yang diperkecil, tetapi juga berguna bagi pengembang untuk dapat menguji bahwa minifikasi tidak merusak apa pun.
- Apakah itu bekerja secara transparan , atau apakah itu memiliki efek samping (selain yang melekat dalam minifikasi) yang harus saya pertimbangkan dalam pekerjaan saya sehari-hari?
- Minifier mana yang digunakannya?
- Apakah itu kekurangan fitur yang dapat Anda pikirkan?
- Apa yang Anda suka tentang itu?
- Apa yang tidak kamu suka tentang itu?
Ini sebagian besar akan berfungsi sebagai referensi untuk proyek masa depan saya (dan mudah-mudahan SOer lain akan menemukannya informatif juga), jadi semua jenis alat itu menarik.
(Perhatikan bahwa ini bukan pertanyaan tentang penambang mana yang terbaik . Kami sudah memiliki banyak penambang .)
java
javascript
automation
minify
gustafc
sumber
sumber
Jawaban:
Pos pembulatan
Jika Anda memposting sesuatu yang baru di utas ini, edit posting ini untuk ditautkan ke milik Anda.
apply
Tugas semut (menggunakan Kompresor YUI)exec
Tugas semut menggunakan Tersersumber
Kami menggunakan tugas Ant untuk mengecilkan file js dengan YUICompressor selama pembuatan produksi dan memasukkan hasilnya ke dalam folder terpisah. Kemudian kami mengunggah file-file itu ke server web. Anda dapat menemukan beberapa contoh bagus untuk integrasi YUI + Ant di blog ini .
Berikut ini contohnya:
sumber
script src
pada build dev atau Anda hanya menyalin file non-minified ke direktori / js yang dikompresi?<fileset dir="${generatedScriptsDir}" includes="**/*.js"/>
tetapi tidak berhasil. Bagaimana saya bisa menghasilkan file di${generatedScriptsDir}
?Saya pikir salah satu alat terbaik dan tepat untuk pekerjaan itu adalah wro4j. Lihat https://github.com/wro4j/wro4j
Itu melakukan semua yang Anda butuhkan:
Dapat berjalan dalam mode debug serta mode produksi. Cukup tentukan semua file yang harus ditangani / pra-proses dan sisanya akan dilakukan.
Anda cukup menyertakan sumber daya yang digabungkan, diperkecil, dan dikompresi seperti ini:
sumber
wro
di server Aplikasi) dariapache
server web?Saya telah menulis makro semut untuk kompiler Penutupan Google dan kompresor Yahoo dan menyertakan file ini dalam proyek web yang berbeda.
Integrasi:
<import file="build-minifier.xml" />
di build.xml Anda, lalu aktifkan tugas semut seperti biasa:<gc-js dir="${build.js.dir}" src="prototype" />
<yc-js-all dir="${build.js.dir}" />
Pilihan dua minifier: Google Closure compiler dan Yahoo compressor, Anda harus mengunduhnya secara manual dan meletakkannya di dekat file xml
Minifier melewati file yang sudah dikompresi (diakhiri dengan
-min*
)Biasanya saya membuat tiga versi script: tidak terkompresi (misalnya
prototype.js
) untuk debugging, dikompresi dengan closure compiler (prototype-min-gc.js
) untuk server produksi, dikompresi dengan Yahoo (prototype-min-yc.js
) untuk troubleshooting karena closure compiler menggunakan optimasi yang berisiko dan terkadang menghasilkan file terkompresi yang tidak valid dan kompresor Yahoo lebih amanKompresor Yahoo dapat mengecilkan semua file dalam satu dir dengan makro tunggal, kompiler Penutup tidak bisa
sumber
Saya mencoba dua cara:
Tentu saja solusi terakhir lebih baik karena tidak menghabiskan sumber daya pada waktu proses (aplikasi web saya menggunakan mesin aplikasi google) dan tidak mempersulit kode aplikasi Anda. Jadi asumsikan kasus terakhir ini dalam jawaban berikut:
menggunakan maven
Anda mengaktifkannya hanya saat menyusun perang terakhir; dalam mode pengembangan Anda melihat versi sumber daya Anda yang tidak terkompresi
benar
Kompresor YUI
tidak, ini sangat lengkap dan mudah digunakan
itu terintegrasi dengan alat favorit saya (maven) dan plugin ada di repositori pusat (warga negara maven yang baik)
sumber
Saya pikir Anda memerlukan pustaka kompresi, misalnya tag Granule.
http://code.google.com/p/granule/
Itu gzip dan menggabungkan javascript yang dibungkus oleh tag g: kompres menggunakan metode yang berbeda, juga memiliki tugas Ant juga
contoh kode adalah:
sumber
Saya sangat terkejut tidak ada yang menyebut JAWR - https://jawr.github.io
Ini cukup matang dan mendukung semua fitur standar yang diharapkan, dan lebih banyak lagi. Berikut adalah bagaimana hal itu sesuai dengan kriteria OP yang sangat baik.
Ini awalnya melakukan pemrosesan / pengangkatan berat saat startup aplikasi dan penyajian didasarkan pada servlet . Dimulai dengan 3.x, mereka menambahkan dukungan untuk pengintegrasian pada waktu pembuatan .
Dukungan untuk JSP dan Facelet disediakan melalui pustaka tag JSP kustom untuk mengimpor sumber daya yang diproses. Selain itu, pemuat sumber daya JS diimplementasikan yang mendukung pemuatan sumber daya dari halaman HTML statis .
Sebuah
debug=on
opsi tersedia untuk digunakan sebelum aplikasi dimulai, danGET
parameter khusus dapat ditentukan pada permintaan individu dalam produksi untuk beralih mode debug secara selektif pada waktu proses untuk permintaan tersebut.Untuk JS mendukung YUI Compressor dan JSMin, untuk CSS saya tidak yakin.
SASS
dukungan datang ke pikiran. Yang mengatakan, itu mendukungLESS
.sumber
Proyek kami telah menanganinya dengan berbagai cara tetapi kami terus menggunakan Kompresor YUI melalui iterasi yang berbeda.
Kami awalnya memiliki servlet yang menangani kompresi untuk JavaScript saat pertama kali file tertentu diakses; itu kemudian di-cache. Kami sudah memiliki sistem untuk menangani file properti khusus jadi kami cukup memperbarui file konfigurasi kami untuk mendukung pengaktifan atau penonaktifan kompresor tergantung pada lingkungan tempat kami bekerja.
Sekarang lingkungan pengembangan tidak pernah menggunakan JavaScript terkompresi untuk tujuan debugging. Sebagai gantinya, kami menangani kompresi dalam proses pembuatan kami saat mengekspor aplikasi kami ke file WAR.
Klien kami tidak pernah menyuarakan kekhawatiran tentang kompresi dan pengembang tidak menyadarinya sampai mereka memutuskan untuk men-debug JavaScript. Jadi saya akan mengatakan itu agak transparan dengan minimal, jika ada, pengaruh samping.
sumber
Ini berhasil untuk saya: https://bitbucket.org/m6_russell_francis/yui-compressor-ant-task/wiki/Home
sumber
Saya sedang menulis kerangka kerja untuk mengelola aset web, yang disebut humpty . Ini bertujuan untuk menjadi lebih sederhana dan lebih modern daripada jawr atau wro4j dengan menggunakan WebJars dan ServiceLoaders.
Dalam pengembangan, servlet memproses aset sesuai kebutuhan. Aset kemudian akan dikompilasi sebelumnya sebelum produksi dan ditempatkan di folder publik, sehingga satu-satunya bagian yang digunakan adalah membuat penyertaan yang benar dalam HTML.
Itu akan dilakukan dengan beralih antara mode pengembangan dan produksi.
Saya yakin ini transparan, tetapi sangat mendukung penggunaan WebJars.
Plugin mana pun yang Anda tempatkan di classpath Anda gunakan. Saat ini sedang menulis plugin untuk Google Closure Compiler.
Masih pra-rilis, meskipun saya menggunakannya dalam produksi. Plugin maven masih membutuhkan banyak pekerjaan.
Kesederhanaan hanya dengan menambahkan dependensi untuk mengonfigurasi kerangka kerja
Ini bayiku, aku suka semuanya;)
sumber
Terlambat banget ke pesta di sini, tapi menurutku ini mungkin bisa membantu seseorang yang masih mencari jawaban berbeda:
Setelah mencoba menggunakan YUI Compressor, saya kecewa karena itu tidak kompatibel dengan versi jQuery dan Prism yang lebih baru (dua pustaka JS pihak ketiga utama yang saya butuhkan untuk proyek saya yang ingin saya kompres menjadi satu file). Jadi saya memutuskan untuk menggunakan Terser , yang merupakan cabang dari Uglify-JS yang mendukung ES6 +. Saya tidak bisa membuatnya berjalan langsung menggunakan
<exec>
tugas, tetapi menggunakan metode baris perintah Windows berfungsi untuk Win 10, setidaknya (tidak mengatakan itu tidak dapat berfungsi sebaliknya, tetapi ini adalah penyelesaian yang sangat mudah). Tidak perlu menambahkan apa pun ke variabel sistem Path (karena Node.JS biasanya ditambahkan selama instalasi). Saya pertama kali menggunakan<concat>
tugas ANT untuk membuat file besar dan tidak terkompresi. Gunakan<fileset>
karena akan menjaga ketertiban (jika itu penting, bagaimanapun).Kemudian gunakan
<exec>
tugas untuk menjalankan program NPM apa pun, seperti Terser. The Apache halaman manual pada tugas ini mengindikasikan ini adalah Windows atasi untuk menjalankan kelelawar file, tapi itu benar-benar memungkinkan Anda menjalankan apa saja aplikasi baris perintah (bahkan mereka yang<exec>
misterius tidak dapat menemukan sebaliknya).Mengintegrasikan? Ini adalah bagian dari skrip build ANT (plugin DITA Open Toolkit untuk mendukung JavaScript kustom, antara lain - bukan aplikasi Web Java, tetapi menggunakan Java untuk membuat output HTML5), jadi integrasi tidak lebih dari sekadar menambahkan itu. tugas ke target baru (ada lebih banyak kode mengenai pengaturan default dan memeriksa parameter input!).
Mudah Diaktifkan / Nonaktifkan? Dalam kasus saya, saya memiliki parameter yang saya berikan ke ANT Build untuk menyertakan membangun dan mengecilkan file JS. Jadi ya, itu hanya melakukan target ini jika saya menyetel param ke 'Ya'. Itu adalah hal yang cukup mudah untuk disiapkan dalam build ANT.
Transparan Sejauh ini, tampaknya tidak berpengaruh pada salah satu dari beberapa file JS yang saya sertakan. Beberapa di antaranya adalah milik saya (dan saya bukan ahli JS, dengan cara apa pun) dan beberapa, seperti yang saya sebutkan, pustaka JS umum.
Minifier Terser, tetapi Anda bisa menggunakan apa saja yang diperkecil dengan input baris perintah dengan metode ini.
Kekurangan fitur? Terser hanya bekerja dengan JavaScript. Jika saya ingin melakukan hal yang sama untuk file CSS saya (yang saya lakukan), saya menggunakan YUI Compressor.
Seperti Itu, ini adalah proyek yang sedang aktif dan memiliki dukungan yang baik. Plus, implementasi saat ini (hanya memanggilnya melalui
<exec>
target ANT ) memungkinkan saya untuk menukar minifier jika saya perlu menggunakan sesuatu yang lain di jalan.Tidak suka Itu membutuhkan Node.JS. Tidak ada yang melawan Node.JS, ingatlah, hanya saja proyek khusus ini tidak membutuhkannya sebaliknya. Saya lebih suka menggunakan file Java .jar seperti YUI Compressor untuk ini (saya dapat dengan mudah mendistribusikannya dengan plugin jika saya perlu).
sumber