Rumah >pembangunan bahagian belakang >Golang >Go-DOM - peristiwa penting

Go-DOM - peristiwa penting

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-22 02:44:17279semak imbas

Go-DOM -  major milestone

Selepas hanya di bawah 2 minggu bekerja; Saya akhirnya mencapai pencapaian utama pertama untuk Go-DOM.

Kini, penyemak imbas akan memuat turun dan melaksanakan JavaScript jauh apabila membina pepohon DOM.

Sejarah Ringkas

Projek ini bermula sebagai idea gila; melihat bahawa Go dan HTMX ialah timbunan yang semakin popular;

Go sudah mempunyai semua alatan yang anda perlukan untuk menguji pemaparan sebelah pelayan tulen. Tetapi apabila menambah perpustakaan seperti HTMX, gelagat apl adalah hasil koreografi antara DOM awal; atribut pada elemen interaktif; titik akhir HTTP dicapai, dan kandungan yang dihantar oleh titik akhir tersebut; kedua-dua pengepala dan badan respons. Untuk mengesahkan gelagat dari sudut pandangan pengguna, anda memerlukan penyemak imbas; atau sekurang-kurangnya abah-abah ujian yang berkelakuan ... tidak sepenuhnya berbeza dengan penyemak imbas.1

Mencari "pelayar tanpa kepala sedang berjalan" hanya membawa kepada hasil yang mencadangkan untuk menggunakan penyemak imbas sebenar dalam mod tanpa kepala. Gabungan ini yang mempunyai overhed yang besar; tidak menggalakkan gelung TDD yang pantas dan cekap. Bergantung pada penyemak imbas sebenar biasanya melambatkan anda dan bukannya mempercepatkan anda.2

Jadi idea itu tercetus; tulis pelayar tanpa kepala dalam Go tulen sebagai alat ujian untuk aplikasi web;

Ketidakpastian pertama yang perlu ditangani ialah penghuraian HTML; serta pelaksanaan skrip. Saya berjaya dengan pantas; dalam masa 2 hari untuk menangani kedua-duanya. Saya mempunyai penghurai HTML yang sangat asas; serta saya telah menyepadukan v8 ke dalam pangkalan kod3 dan menjadikan objek Go boleh diakses oleh kod JavaScript.

Penghuraikan HTML kemudiannya dialih keluar, kerana go x/net/html sudah pun melaksanakan penghurai HTML; berurusan dengan semua kebiasaan penghuraian HTML. Menghuraikan dokumen yang dibentuk dengan baik bukanlah masalah yang sangat sukar untuk diselesaikan. Ia dengan anggun menangani HTML yang cacat sehingga menjadi rumit.

Selepas beberapa lama, saya juga berjaya mendapatkan pelaksanaan skrip sebaris untuk dijalankan pada saat yang tepat; iaitu skrip dilaksanakan apabila elemen sebenarnya disambungkan ke DOM, bukan selepas HTML penuh dihuraikan.

Bekerja dengan permintaan HTTP

Selepas dapat memproses dokumen HTML dengan skrip sebaris; langkah seterusnya ialah sebenarnya memuat turun skrip daripada sumber. Ini diperlukan untuk menyepadukan lapisan HTTP; supaya penyemak imbas mengambil kandungan itu sendiri; daripada diberi makan kandungan.

http.Client juga membenarkan anda mengawal lapisan pengangkutan sebenar menggunakan antara muka http.RoundTripper. Biasanya anda memulakan pelayan; yang akan mendengar permintaan pada port TCP. Dalam konteks ini TCP berfungsi sebagai lapisan pengangkutan; tetapi ia sendiri tidak relevan untuk pemprosesan permintaan HTTP. Disebabkan oleh kesederhanaan timbunan HTTP standard dalam Go; keseluruhan pelayan HTTP diwakili oleh satu fungsi, func Handle(http.ResponseWriter, *http.Request).

Pelayar tanpa kepala boleh memintas sepenuhnya overhed tindanan TCP dan memanggil fungsi ini terus menggunakan RoundTripper tersuai.

Kini penyemak imbas boleh melakukan permintaan HTTP, tetapi kod penyemak imbas itu sendiri tidak mengetahui hakikat bahawa lapisan HTTP dipintas. Dan dengan ini datang keupayaan untuk memuat turun skrip semasa penghuraian DOM.

Contoh Kod

Mari kita terokai ujian mudah, kerana ia kelihatan sekarang dalam pangkalan kod (kod menggunakan Ginkgo dan Gomega, gabungan IMHO yang agak diabaikan)

Pertama, ujian mencipta pengendali HTTP mudah yang menyediakan dua titik akhir, /index.html dan /js/script.js.

It("Should download and execute script from script tags", func() {
  // Setup a server with test content
  server := http.NewServeMux()
  server.HandleFunc(
    "GET /index.html",
    func(res http.ResponseWriter, req *http.Request) {
      res.Write(
        []byte(
          `<html><head><script src="/js/script.js"></script></head><body>Hello, World!</body>`,
        ),
      )
    },
  )
  server.HandleFunc(
    "GET /js/script.js",
    func(res http.ResponseWriter, req *http.Request) {
      res.Header().Add("Content-Type", "text/javascript")
      res.Write([]byte(`var scriptLoaded = true`))
    },
  )

  // ...

Niat di sini hanyalah untuk mengesahkan bahawa skrip telah dilaksanakan. Untuk melakukan itu, skrip menghasilkan kesan sampingan yang boleh diperhatikan: Ia menetapkan nilai dalam skop global.

Untuk mengesahkan bahawa skrip telah dilaksanakan hanyalah soal meneliti skop global, yang dilakukan dengan melaksanakan JavaScript ad-hoc daripada ujian itu sendiri; mengesahkan hasil ungkapan.

Kod untuk mencipta penyemak imbas, memuatkan fail indeks dan mengesahkan kesan sampingan yang diperhatikan

browser := ctx.NewBrowserFromHandler(server)
Expect(browser.OpenWindow("/index.html")).Error().ToNot(HaveOccurred())
Expect(ctx.RunTestScript("window.scriptLoaded")).To(BeTrue())

Pelaksanaan ujian juga agak pantas. Bahagian suite ujian yang melibatkan pelaksanaan JavaScript pada masa ini terdiri daripada 32 ujian yang dijalankan dalam 23 milisaat.

Pencapaian seterusnya, sepadukan HTMX.

Memandangkan projek itu pada mulanya difikirkan semasa cuba mengesahkan aplikasi HTMX, matlamat seterusnya yang munasabah adalah untuk menyokong kes itu sahaja. Aplikasi HTMX ringkas dengan butang dan pembilang, yang meningkat apabila butang ditekan.

  • Pelaksanaan AnXMLHttpRequest perlu ada. Kerja sedang dijalankan untuk itu.
  • Penilai XPath. Saya percaya boleh diisi dengan poli untuk bermula.
  • Penyebaran acara. Hanya DOMContentLoaded dan memuatkan acara dipancarkan sekarang. Elemen perlu menyokong lebih banyak acara; seperti klik; serta kaedah untuk mencetuskannya.
    • Ini mungkin juga memerlukan tangkapan acara yang betul dan menggelegak.

Dan kemudian...

Berikutan itu, interaksi pengguna yang lebih maju; pengendalian borang yang betul, cth., garis panduan input (cth., menekan masuk dalam medan menyerahkan borang. Ini biasanya juga melibatkan sejenis pengalihan URL; yang mendorong keperluan untuk objek sejarah, dsb. .

Integrasi tapak luaran

Dengan keupayaan untuk mengawal lapisan pengangkutan; kami boleh menyediakan ujian dengan kebolehan unik; kita boleh mengejek tapak luar yang sistem akan bergantung pada masa berjalan. Cth., untuk nama hos yang diberikan, ujian boleh menyediakan Pengendali HTTP Go yang lain yang mensimulasikan gelagat.

Contoh yang paling jelas ialah penggunaan pembekal identiti luaran. Ujian ini boleh mensimulasikan kelakuan aliran log masuk; tidak perlu memaksa anda membuat akaun palsu dalam sistem luaran, mengalami kegagalan ujian kerana gangguan dalam sistem luaran, atau hanya tidak dapat mengautomasikan proses sama sekali kerana 2FA atau Captcha yang diperkenalkan oleh pembekal identiti.

Satu lagi kes penggunaan ialah penggunaan perpustakaan API-berat, seperti perpustakaan peta, yang memerlukan kos penggunaan. Olok-olok tapak luar untuk tidak menerima bil tambahan untuk menjalankan suite ujian anda.

Kebolehgunaan berbanding Keserasian

Mewujudkan pelaksanaan yang mematuhi standard whatwg 100% adalah satu usaha yang agak sukar; Saya tidak memahami sepenuhnya skop sehingga saya benar-benar mula membaca bahagian spesifikasi whatwg. Matlamatnya ialah untuk mencipta alat membantu menulis ujian untuk aplikasi web. Keserasian penuh adalah matlamat jangka panjang; tetapi sehingga projek itu mencapai sesetengah tahap kebolehgunaan, adakah saya akan mula mengisi lubang.

Atas sebab itu; ciri yang lebih berkemungkinan untuk digunakan dalam aplikasi sebenar lebih berkemungkinan diutamakan. Permintaan ciri yang menunjuk kepada ujian sebenar yang memberikan hasil yang salah mungkin akan diutamakan. Permintaan ciri untuk pelaksanaan standard tertentu mungkin akan ditolak.

Sebarkan

Saya percaya ini boleh menjadi alat yang sangat berguna untuk banyak pembangun, jadi jika anda membaca ini, beritahu rakan sekerja anda bahawa ia wujud. Ini adalah projek masa lapang setakat ini, yang saya ada banyak pada masa ini; tetapi itu tidak akan berlaku selama-lamanya.

Jika anda ingin melihat ini secara langsung, sebarkan ...

Mungkin anda akan menaja ini? Adakah anda mempunyai syarikat besar yang membina aplikasi web di Go? Sila hubungi saya.

Cari projek di sini: https://github.com/stroiman/go-dom


  1. Terima kasih jika anda berjaya menangkap penghormatan kepada drama radio BBC yang popular. ↩

  2. Ini berdasarkan pengalaman peribadi. Melakukan TDD dengan betul akan mempercepatkan anda kerana kitaran maklum balas yang pantas. Overhed penyemak imbas sebenar cenderung untuk membuat anda menulis ujian selepas kod pengeluaran; kehilangan faedah mereka daripada gelung maklum balas yang diberikan oleh suite ujian pantas kepada anda. ↩

  3. Kerja asas telah pun dibuat oleh projek v8go. Walau bagaimanapun; tidak semua ciri v8 terdedah kepada kod Go; termasuk ciri yang diperlukan untuk membenamkan objek asli. Saya dapat menambahnya dalam garpu yang berasingan; yang masih WIP. ↩

Atas ialah kandungan terperinci Go-DOM - peristiwa penting. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn