Gunakan HTMLStream API untuk memproses data streaming HTML di titik kehadiran (POPs), seperti data saham real-time atau catatan obrolan. Dengan HTMLStream API, Anda juga dapat mentransmisikan data streaming HTML dalam chunk untuk mempercepat transmisi data.
Informasi latar belakang
Edge Routine sangat cocok untuk berbagai skenario pengembangan frontend. Data spesifik, seperti header User-Agent, lokasi geografis, dan alamat IP, dikirim dari POPs. Oleh karena itu, Anda mungkin perlu memodifikasi alur halaman HTML secara real-time di POPs. Secara tradisional, ekspresi reguler digunakan untuk membuat parser ad hoc guna memodifikasi alur halaman HTML. Namun, pendekatan ini dapat menyebabkan kesalahan dan tidak mendukung pemrosesan aliran. Parser JavaScript open source seperti parse5 dan htmlparser2 mengonsumsi banyak sumber daya memori serta menurunkan kinerja sistem. Untuk mengatasi masalah ini, Edge Routine menyediakan parser yang mendukung pemrosesan aliran di POPs. Anda dapat menggunakan parser ini untuk memodifikasi kode dan halaman HTML.
Parser ini dibangun di dalam Edge Routine dan tidak didasarkan pada standar web.
Contoh
Skenario
Jika Anda ingin memodifikasi semua tag jangkar
<a/>dalam halaman HTML untuk menghubungkannya kehttp://www.taobao.com, gunakan kode berikut di Edge Routine.Kode Contoh
async function handleRequest(request) { // 1. Dalam contoh ini, halaman HTML yang ingin Anda modifikasi dikembalikan. const response = await fetch("http://www.example.com"); // 2. Konfigurasikan parser berbasis pemrosesan aliran untuk mengelola konten HTML. Parser ini mendukung beberapa pemilih CSS. // Tentukan metode untuk menangkap sintaksis dan daftarkan fungsi callback untuk penulisan ulang. const htmlStream = new HTMLStream( response.body, // Tentukan aliran HTML yang ingin Anda modifikasi. [[ "a", // Pemilih elemen. Ini menentukan bahwa semua tag jangkar dipilih. { // Daftarkan fungsi callback. Fungsi callback elemen dapat dipanggil di dalam tag jangkar atau di dalam node elemen dari API DOM (Document Object Model). // Di dalam fungsi callback, Anda dapat mengubah objek event (e). element: function(e) { // Modifikasi atribut href. e.setAttribute("href", "http://www.taobao.com"); } } ]]); // 3. Kembalikan permintaan yang telah dimodifikasi ke browser. HTMLStream adalah aliran yang dapat dibaca. // Anda dapat menggunakan HTMLStream di semua skenario yang mendukung ReadableStream. return new Response(htmlStream); } export default { async fetch(request) { return handleRequest(request); } };Analisis Hasil
Kode contoh di atas menunjukkan cara memodifikasi aliran HTML secara real-time menggunakan HTMLStream API. Berikut adalah penjelasan tentang cara kerja HTMLStream:
API Fetch mengambil ekspresi aliran untuk permintaan. Namun, Edge Routine mungkin belum mengambil badan respons dari lapisan jaringan. Akibatnya, frekuensi pengumpulan sampah akibat penyanggaan data berkurang.
HTMLStream juga merupakan aliran yang mendukung operasi TransformStream. Setelah HTMLStream menerima aliran, HTMLStream memanggil fungsi callback penulisan ulang untuk memodifikasi halaman HTML yang ditentukan secara real-time. Jika Anda ingin memodifikasi halaman HTML, Anda harus mendapatkan aliran data mentah dari halaman tersebut. Kemudian, Anda dapat meletakkan aliran data mentah ke dalam aliran HTML yang telah Anda buat, seperti yang dijelaskan pada Langkah 2 dalam kode contoh di atas.
Parameter pertama dari HTMLStream adalah aliran, yang mewakili aliran data mentah dari halaman HTML.
Parameter kedua dari HTMLStream adalah array, yang mewakili sekelompok penulis ulang. Penulis ulang adalah array yang mencakup pemilih. Pemilih digunakan untuk menentukan konten HTML yang ingin Anda modifikasi dan memilih objek. Beberapa atribut dari objek akan dipanggil sebagai fungsi callback.
["a" , {....}]dalam contoh di atas digunakan untuk mendeklarasikan penulis ulang, yang mewakili array dengan dua elemen. String "a" dalam contoh di atas mewakili pemilih elemen yang digunakan untuk menemukan semua tag jangkar dalam dokumen. Objek dalam contoh di atas menentukan objek callback. Jika Anda memilih untuk menggunakan pemilih elemen, objek tersebut dapat mencakup fungsi callback berikut:Fungsi callback
element. Tanda tangan dari fungsi callback ini adalah function(e). Fungsi callback ini dipanggil ketika elemen-elemen yang dipilih oleh pemilih elemen diuraikan.Fungsi callback
comments. Tanda tangan dari fungsi callback ini adalah function(e). Fungsi callback ini dipanggil ketika komentar-komentar yang bersarang di dalam elemen diuraikan.Fungsi callback
text. Tanda tangan dari fungsi callback ini adalah function(e). Fungsi callback ini dipanggil ketika teks di dalam elemen diuraikan. Fungsi callback ini dapat dipanggil beberapa kali karena pemrosesan aliran, HTMLStream mungkin sedang memproses sebagian dari string.
Anda dapat langsung merespons HTMLStream. Namun, HTMLStream tidak menyangga data. Berbeda dengan parse5 dan htmlparser2, HTMLStream tidak menghasilkan pohon DOM, yang secara signifikan mengurangi waktu pemrosesan dan konsumsi memori. Dengan cara ini, HTMLStream dapat memberikan throughput tinggi dan konkurensi saat mem-parsing konten HTML.
Penulis Ulang
Penulis ulang digunakan untuk mendaftarkan objek yang ingin Anda tulis ulang. Objek ini adalah array yang terdiri dari dua elemen.
Elemen pertama dalam array harus bertipe string atau null.
String: menentukan pemilih elemen yang digunakan untuk menemukan elemen atau tag.
null: menentukan bahwa penulis ulang berlaku untuk seluruh dokumen.
nullDalam kebanyakan kasus, Anda tidak perlu menerapkan penulis ulang ke seluruh dokumen. Jika penulis ulang diterapkan ke seluruh dokumen, ia tidak dapat menemukan elemen.
Elemen kedua dalam array harus berupa objek JavaScript. Objek ini dikembalikan ke fungsi callback yang telah Anda daftarkan.
Jika Anda menggunakan pemilih elemen, objek ini dinamai sebagai fungsi callback elemen. Jika Anda menggunakan pemilih dokumen, objek ini dinamai sebagai fungsi callback dokumen.
Anda dapat menentukan satu atau lebih penulis ulang untuk operasi HTMLStream. Anda dapat menentukan beberapa pemilih elemen tetapi hanya satu pemilih dokumen.
Sintaks pemilih elemen
Sintaks pemilih elemen adalah subset dari sintaks pemilih CSS. Bahasa pemrograman pemilih elemen mungkin berbeda dari bahasa pemrograman pemilih CSS. Berikut adalah penjelasan tentang sintaks pemilih elemen:
*: menentukan semua elemen atau tag.div: menentukan tag bernamadiv. Anda dapat menentukan nama tag lain dalam format ini. Tag HTML dan tag kustom didukung.E#id: menentukan tag bernama E. ID dari tag ditentukan olehid.E.Class: menentukan tag bernama E. Kelas dari tag ditentukan olehClass.E[attr]: menentukan tag bernama E. Atribut dari tag mencakup nama attr.Atribut Elemen:
E[attr="a"]: menentukan tag bernama E. Atribut dari tag mencakup attr, yang diatur ke a. Nilai ini peka huruf besar/kecil.E[attr^="a"]: menentukan tag bernama E. Atribut dari tag mencakup attr, yang diatur ke a. Nilai ini tidak peka huruf besar/kecil.E[attr$="a"]: menentukan tag bernama E. Atribut dari tag mencakup attr yang nilainya diakhiri dengan a.E[attr^="a"]: menentukan tag bernama E. Atribut dari tag mencakup attr yang nilainya dimulai dengan a.E[attr*="a"]: menentukan tag bernama E. Atribut dari tag mencakup attr yang nilainya mengandung a.E[attr|="a"]: menentukan tag bernama E. Atribut dari tag mencakup attr yang nilainya dimulai dengan a- dan dipisahkan oleh koma (,). Contoh: en-ch, en-us.
Urutan Antar Elemen:
E F: menentukan tag bernama F, yang ada di elemen induk bernama E.E > F: menentukan tag bernama F yang elemen induknya adalah tag bernama E.
E:not(S): menentukan elemen bernama E. S adalah pemilih elemen lain. Elemen E hanya dapat dipilih jika pemilih diatur ke false.
Fungsi callback untuk pemilih elemen
Tabel berikut menjelaskan fungsi callback yang didukung oleh pemilih elemen.
Fungsi callback | Deskripsi | Tanda tangan fungsi callback |
element | Fungsi callback non-asinkron yang dipanggil setelah elemen-elemen yang dipilih sepenuhnya diuraikan. | Tanda tangan dari fungsi callback adalah function(e). Tanda tangan ini dibawa dalam objek Element. Untuk informasi lebih lanjut, lihat Element. |
comments | Fungsi callback non-asinkron yang dipanggil ketika elemen-elemen yang dipilih memiliki komentar. | Tanda tangan dari fungsi callback adalah function(e). Tanda tangan ini dibawa dalam objek Comments. Untuk informasi lebih lanjut, lihat Comments. |
text | Fungsi callback non-asinkron yang dipanggil ketika teks yang dikembalikan ke fungsi callback diuraikan. | Tanda tangan dari fungsi callback adalah function(e). Tanda tangan ini dibawa dalam objek TextChunk. Untuk informasi lebih lanjut, lihat TextChunk. null Fungsi callback ini dapat dipanggil beberapa kali. Ketika HTMLStream membaca potongan teks dari data HTML mentah, fungsi callback ini dipanggil setiap kali potongan diuraikan. Jika Anda ingin melihat teks lengkap, Anda harus memuat dan menggabungkan semua potongan teks. |
Pemilih elemen dapat mengabaikan semua fungsi callback di atas. Dalam hal ini, elemen relevan dicetak langsung tanpa pemrosesan. Jika Anda ingin memodifikasi potongan teks tertentu, Anda hanya perlu mendaftarkan fungsi callback yang diperlukan.
Pemilih dokumen
Pemilih dokumen digunakan untuk memilih dokumen tertentu. Untuk menggunakan pemilih dokumen, atur elemen pertama dalam array penulis ulang ke null. Dalam operasi HTMLStream, Anda hanya dapat mengonfigurasi satu pemilih dokumen.
Fungsi callback untuk pemilih dokumen
Fungsi callback untuk pemilih dokumen serupa dengan fungsi callback untuk pemilih elemen. Tabel berikut menjelaskan fungsi callback yang didukung oleh pemilih dokumen.
Fungsi Callback | Deskripsi | Tanda Tangan Fungsi Callback |
doctype | Fungsi callback non-asinkron yang dipanggil ketika deklarasi tipe dokumen (DOCTYPE) dalam dokumen yang ditentukan diuraikan. | Tanda tangan dari fungsi callback adalah function(e). Tanda tangan ini dibawa dalam objek Doctype. Untuk informasi lebih lanjut, lihat Doctype. |
comments | Fungsi callback non-asinkron yang dipanggil ketika dokumen yang ditentukan memiliki komentar. | Tanda tangan dari fungsi callback adalah function(e). Tanda tangan ini dibawa dalam objek Comments. Untuk informasi lebih lanjut, lihat Comments. |
text | Fungsi callback non-asinkron yang dipanggil ketika dokumen yang ditentukan memiliki node teks. | Tanda tangan dari fungsi callback adalah function(e). Tanda tangan ini dibawa dalam objek TextChunk. Untuk informasi lebih lanjut, lihat TextChunk. null Fungsi callback ini dapat dipanggil beberapa kali. Ketika HTMLStream membaca potongan teks dari data HTML mentah, fungsi callback ini dipanggil setiap kali potongan diuraikan. Jika Anda ingin melihat teks lengkap, Anda harus memuat dan menggabungkan semua potongan teks. |
docend | Fungsi callback non-asinkron yang dipanggil setelah dokumen yang ditentukan sepenuhnya diuraikan. Fungsi callback ini menambahkan konten seperti informasi debugging ke akhir dokumen HTML sebagai komentar. Anda dapat menggunakan informasi ini untuk pemecahan masalah. | Tanda tangan dari fungsi callback adalah function(e). Tanda tangan ini dibawa dalam objek Docend. Untuk informasi lebih lanjut, lihat Docend. |
Penanganan kesalahan
Edge Routine menangkap semua pengecualian JavaScript yang dilemparkan oleh fungsi callback di atas. Sementara itu, HTMLStream menghentikan pemrosesan aliran HTML dan menyebarkan pengecualian ke lapisan luar.
Jika metode reader.read dipicu dalam JavaScript, pengecualian dilemparkan lagi.
Jika metode reader.read dipanggil dalam HTMLStream ketika Edge Routine sedang berjalan, Edge Routine menyembunyikan pengecualian. Misalnya, jika pengecualian terjadi ketika Edge Routine mengembalikan respons ke klien, respons terganggu dan klien hanya menerima sebagian dari respons. Hal ini karena HTMLStream memperlakukan data sebagai aliran. Dalam hal ini, aliran mungkin terganggu sebelum semua data dikembalikan ke klien. Metode yang digunakan oleh HTMLStream untuk menangani pengecualian mirip dengan metode yang digunakan oleh TransformStream. TransformStream juga menulis dan membaca data sebagai aliran.
Parameter callback
Setiap fungsi callback menerima objek yang mewakili tag HTML yang dipilih atau informasi relevan lainnya. Objek ini juga dikenal sebagai parameter callback. Topik ini menjelaskan parameter callback seperti Element, TextChunk, dan Comments.
Semua parameter harus dilewatkan ke fungsi callback. Jika metode atau atribut parameter dipanggil di luar fungsi callback, pengecualian JavaScript dilemparkan. Untuk menghindari masalah ini, Anda dapat melewatkan parameter yang diinginkan ke objek atau struktur data JavaScript lainnya.
Opsi dalam metode yang dijelaskan dalam topik ini mewakili objek. Anda dapat mengatur atribut HTML dalam objek menjadi true atau false. Nilai true menentukan konten HTML, dan false menentukan konten teks. Jika Anda mengatur atribut HTML menjadi false, HTMLStream memanggil fungsi
html encoding/escaping.
Element
Definisi
Objek ini dikembalikan ketika fungsi callback Element dipanggil. Objek ini mewakili tag HTML yang dipilih.
Atribut
tagName(string): menentukan nama tag.attributes(iterator): mengembalikan iterator yang menemukan semua atribut yang ditentukan dalam format[name, value].removed(bool): menentukan apakah elemen dihapus. Atribut ini hanya-baca. Anda dapat memanggil metode remove() untuk menghapus elemen. Biasanya, Anda harus mengonfigurasi atribut ini untuk mengabaikan elemen yang sudah dihapus.namespaceURI: URI namespace dari elemen, seperti elemen SVG atau Script. Atribut ini hanya-baca.
Metode
Modifikasi Atribut
getAttribute(name): meminta nama atribut elemen tertentu.
setAttribute(name, value): menetapkan nama atribut untuk elemen tertentu dan memodifikasi nama atribut elemen tertentu.
hasAttribute(name): meminta apakah nama atribut ada dalam elemen tertentu.
removeAttribute(name): menghapus nama atribut dari elemen tertentu.
nullNama atribut dan nilai harus bertipe string.
Modifikasi Konten
before(data, option): menyisipkan konten sebelum elemen tertentu (tag elemen).
after(data, option): menyisipkan konten setelah elemen tertentu (tag elemen).
prepend(data, option): menyisipkan konten sebelum konten elemen tertentu (setelah tag pembuka elemen). Contoh:
<div>(prepend) |aaaa|(append)</div>.append(data, option): menyisipkan konten setelah konten elemen tertentu (sebelum tag penutup elemen). Contoh:
<div>(prepend) |aaaa|(append)</div>.replace(data, option): mengganti seluruh elemen, termasuk tag dan tag bersarang.
setInnerContent(data, option): menentukan konten elemen dan mempertahankan tag dan atribut.
remove(): menghapus elemen tertentu. Setelah elemen dihapus, nilai atribut removed berubah menjadi true.
removeAndKeepContent(): menghapus tag dan atribut elemen tertentu dan mempertahankan konten.
TextChunk
Definisi
Objek ini dikembalikan ketika fungsi callback Text dipanggil. Objek ini mewakili potongan teks HTML yang dipilih.
Atribut
removed(bool): menentukan apakah elemen dihapus. Atribut ini hanya-baca. Anda dapat memanggil metode remove() untuk menghapus elemen. Biasanya, Anda harus mengonfigurasi atribut ini untuk mengabaikan elemen yang sudah dihapus.text(string): menentukan konten teks. Atribut ini hanya-baca. Teks mungkin merupakan potongan teks. Jika string kosong, itu menunjukkan bahwa potongan teks terakhir dikembalikan. Dalam hal ini, Anda dapat menggabungkan semua potongan teks.lastInTextNode(bool): menentukan apakah ini adalah potongan teks terakhir. Atribut ini hanya-baca. Jika nilai atribut ini adalah true, atribut text mengembalikan string kosong.
Metode
Modifikasi Konten
before(data, option): menyisipkan konten sebelum elemen tertentu (tag elemen).
after(data, option): menyisipkan konten setelah elemen tertentu (tag elemen).
replace(data, option): mengganti seluruh elemen, termasuk tag dan tag bersarang.
remove(): menghapus elemen tertentu. Setelah elemen dihapus, nilai atribut removed berubah menjadi true.
Comments
Definisi
Objek ini dikembalikan ketika fungsi callback Comments dipanggil. Objek ini mewakili komentar dalam konten HTML yang dipilih.
Atribut
removed(bool): menentukan apakah elemen dihapus. Atribut ini hanya-baca. Anda dapat memanggil metode remove() untuk menghapus elemen. Biasanya, Anda harus mengonfigurasi atribut ini untuk mengabaikan elemen yang sudah dihapus.text(string): menentukan komentar yang ada atau komentar untuk menimpa yang sudah ada. Atribut ini dapat dibaca dan ditulis.
Metode
Modifikasi Konten
before(data, option): menyisipkan konten sebelum elemen tertentu (tag elemen).
after(data, option): menyisipkan konten setelah elemen tertentu (tag elemen).
replace(data, option): mengganti seluruh elemen, termasuk tag dan tag bersarang.
remove(): menghapus elemen tertentu. Setelah elemen dihapus, nilai atribut removed berubah menjadi true.
Doctype
Definisi
Objek ini dikembalikan ketika fungsi callback DOCTYPE dipanggil. Objek ini mewakili DOCTYPE dari konten HTML yang dipilih.
Atribut
name(string): menentukan nama DOCTYPE. Atribut ini hanya-baca.publicId(string): mengembalikan pengenal publik. Jika tidak ada pengenal publik, nilai null dikembalikan. Atribut ini hanya-baca.systemId(string): mengembalikan pengenal sistem. Jika tidak ada pengenal sistem, nilai null dikembalikan. Atribut ini hanya-baca.
Docend
Definisi
Objek ini dikembalikan ketika fungsi callback Docend dipanggil. Objek ini mewakili akhir dokumen HTML.
Metode
append(string, option): menambahkan konten ke akhir dokumen HTML.