Apa kelemahan mengirim XML ke browser dan membiarkannya menerapkan XSLT?

14

Konteks

Bekerja sebagai pengembang lepas, saya sering membuat situs web sepenuhnya berdasarkan XSLT. Dengan kata lain, pada setiap permintaan, file XML dihasilkan, berisi semua yang perlu kita ketahui tentang konten halaman: nama pengguna yang saat ini masuk, entri menu atas, jika menu ini dinamis / dapat dikonfigurasi, teks untuk tampilkan di area spesifik halaman, dll. Kemudian proses XSL (cache, dll.) ke halaman HTML / XHTML untuk dikirim ke browser.

Ini memiliki poin yang baik untuk membuatnya lebih mudah untuk membuat situs web skala kecil, terutama dengan PHP. Ini adalah semacam mesin template, tetapi saya lebih suka mesin template lain karena jauh lebih kuat daripada kebanyakan mesin template, dan karena saya tahu itu lebih baik dan menyukainya. Juga dimungkinkan, jika perlu, untuk memberikan akses ke data XML mentah berdasarkan permintaan untuk akses otomatis, tanpa perlu membuat API terpisah.

Tentu saja, itu akan gagal sepenuhnya pada situs web skala menengah atau besar, karena, bahkan dengan teknik caching yang baik, XSL masih menurunkan kinerja situs web secara keseluruhan dan membutuhkan lebih banyak server di sisi server.

Pertanyaan

Browser modern memiliki kemampuan untuk mengambil file XML dan mentransformasikannya dengan file XSL terkait yang dinyatakan dalam XML like <?xml-stylesheet href="demo.xslt" type="text/xsl"?>. Firefox 3 dapat melakukannya. Internet Explorer 8 juga dapat melakukannya.

Ini berarti bahwa dimungkinkan untuk memigrasikan pemrosesan XSL dari server ke sisi klien untuk 50% pengguna (berdasarkan statistik peramban di beberapa situs web tempat saya mungkin ingin menerapkan ini). Ini berarti bahwa 50% pengguna hanya akan menerima file XML pada setiap permintaan, sehingga mengurangi bandwidth mereka dan server (file XML menjadi lebih pendek dari analog HTML yang diproses), dan mengurangi penggunaan CPU server.

Apa kelemahan teknik ini?

Saya memikirkan beberapa hal, tetapi itu tidak berlaku dalam situasi ini:

  • Implementasi yang sulit dan kebutuhan untuk memilih, berdasarkan permintaan browser, kapan harus mengirim XML mentah dan kapan harus mengubahnya ke HTML. Jelas, sistem tidak akan jauh lebih sulit daripada yang sebenarnya. Satu-satunya perubahan yang dilakukan adalah menambahkan tautan file XSL ke setiap XML, dan menambahkan cek browser.
  • Lebih banyak IO dan penggunaan bandwidth, karena file XSLT akan diunduh oleh browser, alih-alih di-cache oleh server. Saya tidak berpikir itu akan menjadi masalah, karena file XSLT akan di-cache oleh browser (seperti gambar, atau CSS, atau file JavaScript sebenarnya di-cache).
  • Mungkin ada beberapa masalah di sisi klien, seperti mungkin masalah saat menyimpan halaman di beberapa browser.
  • Kesulitan untuk men-debug kode: tidak mungkin memperoleh sumber HTML yang sebenarnya digunakan peramban, karena satu-satunya sumber yang ditampilkan adalah XML yang diunduh. Di sisi lain, saya jarang melihat kode HTML di sisi klien, dan dalam kebanyakan kasus, itu tidak dapat digunakan secara langsung (spasi kosong dihapus).
Arseni Mourzenko
sumber
1
Tidak masalah seperti apa HTML mentah itu. Alat seperti Firebug memformatnya untuk Anda.
Jeremy Heiler
Apakah ada browser yang memiliki XSLT 2.0? Secara pribadi, saya tidak ingin kembali ke XSLT 1.
Christopher Creutzig
@ChristopherCreutzig: Saya ingat dukungan XSLT 2.0 sisi server sangat terbatas (walaupun saya tidak ingat persis apakah masalahnya dengan C #, Python, PHP, nginx ngx_http_xslt_moduleatau keempatnya). Saya sangat meragukan dukungan sisi klien XSLT 2.0 lebih baik.
Arseni Mourzenko
@MainMa Apa yang menghentikan saya menggunakan, misalnya, saxon di server, sepenuhnya mengabaikan apakah server saya ditulis dalam rakitan Ruby, PHP, Java, C #, atau x86? Server adalah tempat di mana saya dapat dengan bebas menggabungkan kode dari semua bahasa dan lingkungan yang saya inginkan - dengan asumsi saya tidak memiliki beberapa solusi hosting yang lumpuh di mana saya tidak dapat memanggil program eksternal, tentu saja.
Christopher Creutzig
1
@ChristopherCreutzig: Saya sering bekerja di lingkungan di mana orang tidak bisa meminta administrator sistem untuk menyebarkan apa pun yang diinginkan ke server. Ini membuat Saxon praktis tidak mungkin digunakan untuk saya.
Arseni Mourzenko

Jawaban:

27

Browser tidak dapat secara progresif merender XSLT

Ini berarti tidak ada lagi yang dimuat dan tidak ada yang ditampilkan sampai semua data dan seluruh stylesheet dimuat dan diproses.

Anda melewatkan rendering progresif dan prefetching gambar, CSS & JS.

Muatan awal tertunda oleh permintaan lain

Untuk file-file ish kecil (<20kb) jumlah permintaan, bukan bandwidth, adalah penghambat kinerja front-end, dan sebagian besar halaman dan stylesheet akan masuk dalam kategori ini.

Jika Anda memiliki halaman besar, maka itu lebih buruk - lihat poin pertama.

Anda mungkin tidak menghemat bandwidth

XSLT sendiri cukup verbose dan mungkin perlu mengandung template untuk seluruh situs dan logika untuk semua kasus yang jarang terjadi, bukan hanya hal-hal yang digunakan pada halaman saat ini.

Anda masih harus memasukkan semua data yang ditandai dalam file XML utama yang Anda kirim, misalnya jika Anda mengirim posting blog, maka tidak ada keajaiban yang dapat dilakukan XSLT untuk membuatnya secara substansial lebih kecil. Jika Anda mengirim data yang kompleks, toh itu akan memiliki banyak markup.

Tembolok berlebihan

Tembolok peramban tidak terlalu bagus :

40-60% pengguna Yahoo! Memiliki pengalaman cache kosong dan ~ 20% dari semua tampilan halaman dilakukan dengan cache kosong.

dan di seluler, di mana latensi membuat permintaan ekstra paling mahal, cache bahkan lebih buruk .

Periksa rasio pentalan Anda - mereka adalah pengguna yang tidak mendapat manfaat dari XSLT yang di-cache, dan bahkan membayar harga tambahan untuk mengunduh stylesheet dan menunggu untuk diproses.

gzip adalah XSLT terbalik

Sebagian besar transformasi dilakukan melalui XSLT untuk mengubah markup singkat menjadi lebih verbose dan menambahkan pengulangan. Tapi gzip sangat bagus dalam menghapus pengulangan / redundansi dari file!

Anda harus tetap menggunakan gzip (boros untuk mengirim XML tanpa kompresi). Sangat mungkin bahwa ukuran gzip dari dokumen yang diproses akan hampir sama dengan ukuran gzip dari XML yang belum diproses - tetapi Anda tidak perlu mengirim XSLT tambahan, dan browser akan dapat mulai merender segera setelah paket pertama tiba.

Klien mungkin lambat

Bahkan dengan asumsi kasus pemuatan terbaik dari cache, pemrosesan XSLT di sisi klien lebih cepat hanya jika CPU pengguna lebih cepat, dan mesin XSLT mereka lebih cepat.

Di sisi server Anda dapat melakukan semua jenis trik pengoptimalan (mis., Cache yang diproses fragmen atau bahkan seluruh halaman). Anda dapat menggunakan prosesor XSLT terbaru dan tercepat (browser hanya memiliki XSLT 1.0 dan kemungkinan tidak terlalu optimal). Dan server Anda mungkin memiliki CPU yang lebih besar daripada banyak komputer kantor, ponsel, dll.

Kornel
sumber
Jawaban Luar Biasa! Saya berharap saya bisa memilihnya beberapa kali.
Gaurav
1
+1 khusus untuk gzippoin
Nicole
3

Tidak ada alasan mengapa melakukan sisi server ini tidak boleh skala serta menghasilkan HTML secara langsung. Juga tidak ada banyak alasan untuk overhead konstan besar dibandingkan dengan PHP. Tampaknya ada kompiler XSLT> JVM / CLR dan saya kira Anda bahkan bisa menerjemahkannya ke kode asli.

Namun gagasan untuk mengangkut data dan struktur presentasi secara terpisah adalah baik.
Ini dapat menghemat banyak bandwidth dan bahkan kinerja server. Namun pomeL telah menyebutkan sejumlah poin.

Untuk dukungan yang tepat di browser, xslt.js dapat membantu.

Secara pribadi, saya bukan penggemar XML, jadi saya akan menggunakan JSON sebagai gantinya dan mesin template JS, yang akan dijalankan di browser. Atau semacam mesin template, yang mengubah markup template menjadi js dapat dieksekusi di sisi server, yang digunakan untuk rendering di sisi klien.
JavaScript cukup cepat dan tersedia hampir di mana saja. JSON dan JS jauh lebih kompak daripada XML dan XSLT.

back2dos
sumber
Tetapi Anda perlu mengembangkan "jsonlt" sendiri untuk mempresetasikan data Anda dengan benar atau mengembangkan sisi klien hanya untuk rendering, tidak seperti XML / XSLT yang sudah datang dengan itu.
Walfrat
2

Mengirim XML yang ringkas dan memiliki XSLT yang di-cache pada klien bahkan dapat menghemat bandwidth Anda.

Anda meninggalkan browser apa pun yang tidak mendukung XSLT, seperti ponsel cerdas. Tetapi Anda harus membuat versi khusus untuk ini.

9000
sumber
2
Tidak ada versi khusus untuk peramban yang tidak mendukung XSLT (IE6, peramban ponsel cerdas, dll.). Untuk browser-browser itu, transformasi XSL dilakukan oleh server , berdasarkan pada file XSLT yang sama , dan sebagai gantinya HTML dikirim.
Arseni Mourzenko
2
MainMa: ya, tetapi Anda biasanya menerapkan XSL yang berbeda untuk telepon pintar, karena ukuran layar sangat berbeda, Anda tidak dapat menggunakannya :hover. dll.
9000
1

Masalah utama yang dulunya adalah bahwa hanya beberapa browser yang mendukung hal ini dengan baik, jadi pada dasarnya tidak ada masalah dengan membuat platform baru untuk didukung. Selain itu versi IE yang lebih lama tidak mendukung ini dengan baik, dan jika saya ingat dengan benar setidaknya satu IE memiliki dialek XSLT yang berbeda memberikan segala macam masalah yang menyenangkan.


sumber
1
Jika beberapa browser itu adalah yang digunakan oleh sebagian besar pengguna, itu mungkin sepadan dengan masalahnya.
user281377
Plus, Anda tidak memiliki kendali atas tingkat dukungan apa yang ditawarkan sistem klien untuk XSLT. Jika mereka menggunakan beberapa plug-in yang tidak sesuai standar atau sesuatu (saya tahu, itu hampir tidak pernah terjadi ...), maka situs Anda tidak akan berfungsi dan hampir tidak mungkin untuk didukung.
TMN