Rocker adalah Java 8+ yang dioptimalkan, rendering nol-salinan, mesin templat cepat yang menghasilkan templat objek Java yang diketik secara statis yang dikompilasi bersama dengan sisa proyek Anda. Tidak ada lagi waktu "pemanasan" dalam produksi, logika berbasis refleksi yang lambat, atau kejutan jahat yang seharusnya ditangkap selama pengembangan.
Tulis templat Anda menggunakan sintaks tanpa tag intuitif dengan ekspresi Java standar untuk logika, iterasi, dan nilai. Gunakan Rocker's Special ?
Operator Kehadiran untuk Evaluasi Null-Safe. Semua pengangkatan berat dilakukan oleh parser rocker selama pengembangan - yang menjaga ketergantungan runtime hingga hanya beberapa kelas. Rocker akan mengurai templat Anda dan menghasilkan file sumber Java yang terdokumentasi dengan baik (sehingga Anda dapat dengan mudah memeriksa dan memahami cara kerjanya).
Termasuk fitur berikut:
?
Kehadiran operator memperluas sintaks untuk penanganan nilai nol yang disederhanakan.Project by Fizzed, Inc. (ikuti di Twitter: @fizzed_inc)
Mengembangkan dan memelihara proyek OpenSource membutuhkan waktu yang signifikan. Jika Anda menemukan proyek ini bermanfaat atau membutuhkan dukungan komersial, kami ingin mengobrol. Kirimi kami email di [email protected]
Sponsor proyek dapat mencakup manfaat berikut:
Berdasarkan benchmark template berikut, Rocker adalah pemenang yang jelas. ~ 250% lebih cepat dari freemarker sementara juga membutuhkan pesanan-magnitudo lebih sedikit memori.
Sebagian besar templat digunakan untuk situs web, jadi di sini ada sampel cepat yang menunjukkan cara kerja templat rocker dan dapat saling memanggil selama proses rendering. Buat templat yang berisi header dan footer umum serta placeholder untuk kandungan tubuh. Buat template src/main/java/views/main.rocker.html
@args (String title, RockerBody content)
< html >
< head >
< title > @title </ title >
</ head >
< body >
@content
</ body >
</ html >
Template yang kami rencanakan untuk ditampilkan kepada pengguna akan membuat kontennya dalam konteks footer umum/header. Dalam istilah Java, itu melewati blok Rendering Code untuk dieksekusi dalam templat lain. Buat template src/main/java/views/index.rocker.html
@args (String message)
@views.main.template("Home") - > {
< h1 > Hello @message! </ h1 >
}
Hei, bagaimana dengan argumen RockerBody content
? Kami meliputnya secara lebih rinci dalam sintaks readme, tetapi untuk sekarang hanya memahami bahwa ini satu -satunya jenis argumen khusus dan menginstruksikan Rocker bahwa templat mengharapkan "tubuh" untuk diteruskan ke sana.
Parser rocker akan menghasilkan file sumber Java untuk setiap templat. Mereka akan menjadi target/generated-sources/rocker/views/main.java
dan target/generated-sources/rocker/views/index.java
. Dalam aplikasi Anda, Anda dapat membuat templat indeks seperti itu.
static public void main ( String [] args ) {
String output = views . index . template ( "World" )
. render ()
. toString ();
}
Output akan sama:
< html >
< head >
< title > Home </ title >
</ head >
< body >
< h1 > Hello World! </ h1 >
</ body >
</ html >
Setelah Anda menghasilkan sumber Java dan mengintip ke dalam kode, mudah untuk melihat cara kerjanya. Kelas views.index membuat view. Template instance dan lepas landasan untuk itu - sementara juga melewati blok itu sendiri yang akan diterjemahkan ketika views.main memanggil variabel @content
. Sintaksnya identik dengan bagaimana lambda didefinisikan dalam Java 8 (diimplementasikan dengan lambdas untuk Java 8 dan kelas dalam anonim untuk Java 6/7). Rocker melakukan sejumlah hal di belakang layar untuk memastikan templat yang membuat templat lain berbagi konteks rendering yang sama (buffer output, konteks khusus aplikasi/status implisit).
Lihat file sintaks.md untuk penyelaman mendalam yang komprehensif pada sintaks rocker.
Rocker memiliki daftar kerangka kerja yang terus berkembang yang telah diintegrasikan dengan mulus. Jika Anda ingin menautkan ke kerangka kerja baru yang ditambahkan, silakan mengajukan masalah atau mengirimkan PR:
Statis (teks polos) untuk setiap templat rocker adalah (secara default) disimpan secara internal sebagai array byte statis yang telah dikonversi menjadi charset target Anda (misalnya UTF-8). Ketika templat diterjemahkan - array byte statis digunakan kembali di semua permintaan. Rocker membuat aliran output yang dioptimalkan yang menyimpan tampilan komposit (daftar tertaut) dari array byte yang digunakan kembali ditambah konten dinamis Anda. Karena template sebagian besar terdiri dari konten statis yang diterjemahkan ke dalam charset yang sama berulang kali, daripada mengalokasikan memori baru, menyalin konten itu, dan kemudian mengubahnya menjadi charset target Anda untuk setiap permintaan - Rocker hanya menggunakan pointer untuk itu berulang kali lagi. Teknik ini menghasilkan render yang cepat dan efisien memori.
Katakanlah Anda memiliki templat yang terdiri dari 9000 byte teks statis polos dan 1000 byte konten dinamis. Tanpa optimasi ini, akan membutuhkan ~ 100mb memori untuk melayani 100.000 permintaan (10000 byte x 10000 permintaan). Dengan optimasi ini, akan membutuhkan ~ 10MB memori untuk melayani 10000 permintaan (1000 byte x 10000 permintaan). Selain memori yang lebih rendah, Anda juga memotong 90MB salinan memori dan 90MB Konversi UTF-8 String-> Byte. Optimasi yang cukup berguna.
Semuanya disusun oleh kompiler proyek Anda bersama dengan kode sumber Java Anda yang lain. Setiap kode dinamis dalam templat Anda pada akhirnya dikonversi menjadi Java standar dan disusun. Tidak ada refleksi yang digunakan.
Versi 0.10.0 memperkenalkan dukungan untuk templat pemuatan ulang panas selama pengembangan. Hot Reloading memungkinkan Anda untuk memodifikasi kode sumber template, menyimpannya, dan membuat perubahan aktif pada permintaan berikutnya - tanpa harus memulai kembali JVM Anda. Rocker menawarkan dua rasa hot reload yang berbeda untuk fleksibilitas.
Fitur utama dari templat rocker adalah bahwa templat Anda diperiksa waktu kompilasi untuk penggunaan, argumen, logika, dll. Oleh kompiler java.
Dalam versi 0.10.0 Struktur yang mendasari templat dimodifikasi di mana templat menghasilkan dua kelas yang mendasarinya. Setiap templat menghasilkan kelas model (antarmuka) dan kelas implementasi (renderer -nya). Aplikasi Anda hanya akan berinteraksi secara langsung dengan model, sehingga memungkinkan Rocker untuk mengkompilasi ulang secara dinamis dan memuat ulang kelas implementasi.
Manfaat utama dari rasa satu adalah bahwa kode aplikasi Anda tetap sama dan dikompilasi-waktu diperiksa oleh kompiler Java, sedangkan konten templat dapat dimodifikasi dan secara otomatis dimuat ulang saat runtime. Hanya dalam kasus di mana Anda benar -benar mengubah argumen template, Anda perlu memulai kembali aplikasi Anda.
Jika Anda lebih suka kenyamanan templat yang sepenuhnya dinamis, buka dua mendukung pemuatan ulang panas dari kedua kelas model template (antarmuka) serta kelas implementasi (renderer -nya). Aplikasi Anda akan kehilangan beberapa pemeriksaan waktu kompilasi dan hit kinerja kecil, tetapi mendapatkan kenyamanan dari segala sesuatu yang dapat dimuat kembali. Cara aplikasi Anda akan menggunakan templat juga berbeda.
import com . fizzed . rocker . Rocker
...
// dynamic interfaces, dynamic implementation
String rendered = Rocker . template ( "views/index.rocker.html" )
. bind ( "val" , "ValueA" )
. render ()
. toString ();
Jalur dan argumen template akan diperiksa runtime. Harap dicatat bahwa setiap nilai yang dapat diikat harus cocok dengan nama dan jenis yang dinyatakan dalam templat Anda.
Jika peta yang dapat mengikat Anda mungkin berisi lebih banyak nilai yang daripada yang diperlukan ikatan santai tersedia. Alternatif santai tidak akan gagal rendering jika atribut lebih ekstra untuk daftar yang diperlukan. Misalnya:
@args (String name)
Hello ${name}!
Akan membuat dalam mode santai sebagai:
Map map = new HashMap ();
map . put ( "name" , "Joe" );
map . put ( "age" , 42 );
Rocker . template ( "views/hello.rocker.html" )
. relaxedBind ( map )
. render ();
// -> Hello Joe!
Dukungan untuk pemuatan ulang panas ditambahkan ke templat yang Anda hasilkan secara default di versi 0.10.0. Jika Anda ingin menonaktifkan dukungan, atur rocker.optimize
properti konfigurasi/sistem. Mengoptimalkan ke true selama build Anda. Karena kode ada di templat Anda secara default, Anda hanya perlu menyalakannya saat runtime.
Ketergantungan rocker-compiler
perlu ditambahkan ke build Anda. Ketergantungan ini hanya perlu hadir selama pengembangan dan dapat dihapus dalam produksi. Di Maven, ini berarti Anda ingin menambahkan ketergantungan dalam ruang lingkup provided
.
< dependency >
< groupId >com.fizzed</ groupId >
< artifactId >rocker-compiler</ artifactId >
< version >2.1.0</ version >
< scope >provided</ scope >
</ dependency >
Aktifkan Hot Reload saat runtime. Anda dapat mengaktifkan pemuatan ulang panas baik dengan properti sistem atau secara terprogram. Untuk mengaktifkan pemuatan ulang panas dengan properti sistem di Maven.
mvn -Drocker.reloading=true ...rest of args...
Atau, Anda dapat mengaktifkan pemuatan ulang panas secara terprogram.
import com . fizzed . rocker . runtime . RockerRuntime
...
RockerRuntime . getInstance (). setReloading ( true );
Ada contoh sederhana yang menunjukkan hot reload beraksi. Proyek ini menggunakan Blaze untuk membantu tugas skrip. Jalankan berikut ini
java -jar blaze.jar hot_reload
Arahkan browser Anda ke http: // localhost: 8080
Kemudian ubah & simpan rocker-test-reload/src/test/java/views/index.rocker.html
dan refresh browser Anda.
Rocker terdiri dari dua komponen - parser/generator dan runtime. Untuk menggunakan Rocker di proyek Anda, tambahkan ketergantungan runtime ke aplikasi Anda, kemudian aktifkan parser di alat build Anda diikuti dengan membuat templat pertama Anda.
Rocker diterbitkan ke Maven Central. Untuk ditambahkan sebagai ketergantungan di Maven:
< dependency >
< groupId >com.fizzed</ groupId >
< artifactId >rocker-runtime</ artifactId >
< version >2.1.0</ version >
</ dependency >
<!-- for hot-reloading support only during development -->
< dependency >
< groupId >com.fizzed</ groupId >
< artifactId >rocker-compiler</ artifactId >
< version >2.1.0</ version >
< scope >provided</ scope >
</ dependency >
Untuk ditambahkan sebagai ketergantungan di Gradle:
repositories {
mavenCentral()
}
dependencies {
compile group : ' com.fizzed ' , name : ' rocker-runtime ' , version : ' 2.1.0 '
// add rocker-compiler dependency as needed
}
Rocker mendukung Maven dan Gradle di luar kotak.
Tambahkan yang berikut ke pom Anda
< build >
< plugins >
< plugin >
< groupId >com.fizzed</ groupId >
< artifactId >rocker-maven-plugin</ artifactId >
< version >2.1.0</ version >
< executions >
< execution >
< id >generate-rocker-templates</ id >
< phase >generate-sources</ phase >
< goals >
< goal >generate</ goal >
</ goals >
</ execution >
</ executions >
</ plugin >
</ plugins >
</ build >
Secara default, Rocker akan secara rekursif memproses file templat apa pun yang diakhiri dengan .rocker.html
di src/main/java
. Direktori template disimpan akan menjadi paket Java standar yang akan ditempatkan kelas Java yang dihasilkan. File Sumber Java yang dihasilkan akan disimpan untuk target/generated-sources/rocker
. Plugin ini akan mengurus menambahkan direktori yang dihasilkan ini ke root sumber Anda.
Properti berikut didukung:
templateDirectory
adalah direktori dasar untuk memulai secara rekursif saat menemukan dan parsing file template. package
Java template akan dihasilkan untuk menggunakan direktori ini sebagai basisnya. Jadi jika Anda memiliki ${templateDirectory}/views/mytemplate.rocker.html
maka rocker akan menghasilkan ${outputDirectory}/views/mytemplate.java
. Default ke ${project.build.sourceDirectory}
.
outputDirectory
adalah direktori parser akan menghasilkan sumber untuk templat. Default ke ${project.build.directory}/generated-sources/rocker
classDirectory
adalah Direktori Hot Reload Feature Will (RE) mengkompilasi kelas untuk saat runtime. Default ke ${project.build.outputDirectory}
failOnError
menentukan apakah kesalahan parsing/menghasilkan menyebabkan Maven gagal. Default ke true.
skip
menentukan apakah eksekusi plugin harus dilewati. Default ke false.
touchFile
adalah file untuk "menyentuh" setelah berhasil menghasilkan sumber Java. Berguna untuk memicu alur kerja lainnya. Banyak IDE tidak akan secara otomatis memuat ulang sumber yang dihasilkan untuk penyelesaian kode kecuali jika secara eksplisit disuruh memuat ulang atau jika file Maven Pom.xml diubah. Dengan demikian, nilai ini secara default diatur ke ${basedir}/pom.xml
. Biasanya tidak berbahaya untuk menjaga hal ini diaktifkan.
skipTouch
menonaktifkan TouchFile. Default ke false.
addAsSources
akan menambahkan outputDirectory ke Maven sebagai sumber yang akan dikompilasi. Default ke true.
addAsTestSources
akan menambahkan outputDirectory ke Maven sebagai sumber uji untuk dikompilasi. Default ke false. Jika benar, ini dievaluasi sebelum addassources dan secara efektif memberi tahu Maven untuk mengkompilasi templat Anda sebagai kode uji.
Properti berikut juga didukung, tetapi penting untuk dipahami ini pada dasarnya adalah override ke parser dan semuanya default ke nilai default Rocker.
javaVersion
adalah versi java yang Anda inginkan kompatibel dengan template & runtime Anda. Default ke versi Java dari JVM Executing Maven (misalnya "1.8").
optimize
menentukan apakah dukungan pemuatan ulang panas akan dihapus dari templat yang dihasilkan. False secara default.
extendsClass
adalah kelas yang harus diperluas oleh semua implementasi templat. Berguna untuk kelas menengah khusus aplikasi yang Anda ingin semua templat diperpanjang. Default ke Default Rocker.
extendsModelClass
adalah kelas yang harus diperluas oleh semua model templat. Berguna untuk kelas menengah khusus aplikasi yang Anda ingin semua model templat diperpanjang. Default ke Default Rocker.
plainTextStrategy
adalah strategi yang digunakan untuk menanamkan teks biasa sebagai bagian dari templat. Default adalah static_byte_arrays_via_unloaded_class tetapi jika Anda membutuhkan kompatibilitas graalvm, Anda akan mencoba static_byte_arrays
discardLogicWhitespace
menentukan apakah whitespace dalam templat yang ditentukan hanya merupakan bagian dari blok logika/kontrol harus dibuang. Membantu membuat konten yang diberikan terlihat lebih profesional, sambil tetap menjaga banyak format Anda tetap utuh. Default ke Default Rocker.
targetCharset
adalah charset target untuk output template. Default ke Default Rocker.
suffixRegex
adalah ekspresi reguler untuk digunakan untuk menemukan template untuk diurai. Default ke Default Rocker.
markAsGenerated
menambahkan anotasi @Generated ke kelas yang dihasilkan. Retensi adalah kelas sehingga anotasi dapat digunakan oleh alat yang hanya bergantung pada file kelas dan bukan pada kode sumber. Default ke Default Rocker.
Terima kasih kepada @victory
dan @mnlipp
karena berkontribusi plugin Gradle. @etiennestuder
juga memiliki plugin lulusan alternatif yang mungkin ingin Anda pertimbangkan juga. Plugin Gradle Rocker diterbitkan ke Gradle.org. Cukup tambahkan yang berikut ini ke skrip build Anda:
plugins {
id " com.fizzed.rocker " version " 2.1.0 "
}
sourceSets {
main {
rocker {
srcDir( ' src/main/java ' )
}
}
}
rocker {
// (All settings are shown with their defaults)
//
// Skips building templates all together
skip false
// Base directory for generated java sources, actual target is sub directory
// with the name of the source set. The value is passed through project.file().
outputBaseDirectory = " $b uildDir /generated-src/rocker "
// Base directory for the directory where the hot reload feature
// will (re)compile classes to at runtime (and where `rocker-compiler.conf`
// is generated, which is used by RockerRuntime.getInstance().setReloading(true)).
// The actual target is a sub directory with the name of the source set.
// The value is passed through project.file().
classBaseDirectory = " $b uildDir /classes "
failOnError true
skipTouch true
// must not be empty when skipTouch is equal to false
touchFile " "
javaVersion ' 1.8 '
extendsClass null
extendsModelClass null
optimize null
discardLogicWhitespace null
targetCharset null
suffixRegex null
postProcessing null
markAsGenerated null
}
Sintaks template dijelaskan secara rinci di bawah ini, tetapi untuk saat ini membuat file baru di ${templateDirectory}/views/HelloWorld.rocker.html
@*
Example of hello world
*@
@args (String message)
Hello @message!
Saatnya menyusun proyek Anda dan mulai menggunakan template. Anda bisa menyebutnya dari Java seperti itu:
static public void main ( String [] args ) {
String output = views . HelloWorld
. template ( "World" )
. render ()
. toString ();
}
Rocker sangat dioptimalkan (secara default) ke output templat sebagai array byte. RockerOutput
default yang akan diterjemahkan oleh Template adalah dari tipe com.fizzed.rocker.runtime.ArrayOfByteArraysOutput
. Ini adalah pilihan yang sangat baik untuk array byte atau io asinkron. Namun, kerangka kerja memiliki kemampuan untuk rendering yang dioptimalkan ke string (atau output khusus lainnya).
Untuk secara efisien membuat string:
import com . fizzed . rocker . runtime . StringBuilderOutput ;
static public void main ( String [] args ) {
StringBuilderOutput output = views . HelloWorld
. template ( "World" )
. render ( StringBuilderOutput . FACTORY );
String text = output . toString ();
}
Untuk secara efisien membuat outputstream:
import com . fizzed . rocker . runtime . OutputStreamOutput ;
static public void main ( String [] args ) throws Exception {
final OutputStream os = new FileOutputStream ( new File ( "test" ));
OutputStreamOutput output = views . HelloWorld
. template ( "World" )
. render (( contentType , charsetName ) -> new OutputStreamOutput ( contentType , os , charsetName ));
}
Harap dicatat bahwa jika ada pengecualian selama render outputstream akan memiliki template parsial yang diberikan (hingga titik pengecualian). Dalam kebanyakan kasus akan lebih baik untuk membuat com.fizzed.rocker.runtime.ArrayOfByteArraysOutput
default dan tulis buffer array byte langsung ke outputStream Anda.
Ada banyak demo rocker yang sedang beraksi. Dari templat parsing ke model hingga secara tidak sinkron mengirimkan hasil di server HTTP. Proyek ini menggunakan Blaze untuk membantu tugas skrip. Jalankan yang berikut untuk daftar lengkap:
java -jar blaze.jar -l
Hak Cipta (C) 2015+ Fizzed, Inc.
Pekerjaan ini dilisensikan di bawah lisensi Apache, versi 2.0. Lihat lisensi untuk detailnya.