Alexey Grachev: Go Frontend

Kyiv Go Meetup Mei 2018:



Host: - Halo semuanya! Terima kasih sudah datang kesini! Hari ini kami memiliki dua pembicara resmi - Lesha dan Vanya. Akan ada dua lagi jika kita punya cukup waktu. Pembicara pertama adalah Alexey Grachev, dia akan memberi tahu kami tentang GopherJS.

Alexey Grachev (selanjutnya - AG): - Saya adalah Go-developer, dan saya menulis layanan web di Go. Kadang-kadang Anda harus berurusan dengan front-end, kadang-kadang Anda harus naik ke sana dengan pena. Saya ingin berbicara tentang pengalaman dan penelitian saya. Go front end.

Legenda adalah ini: pertama kita akan berbicara tentang mengapa kita ingin menjalankan Go di front-end, kemudian kita akan berbicara tentang bagaimana ini bisa dilakukan. Ada dua cara - Web Assembly dan GopherJS. Mari kita lihat apa keputusan ini dan apa yang bisa dilakukan.

Apa yang salah dengan frontend?


Apakah semua orang setuju bahwa semuanya baik-baik saja dengan frontend?



Apakah ada beberapa tes? Perakitan lambat? Ekosistem? Baik.

Mengenai frontend, saya suka kutipan salah satu pengembang frontend mengatakan dalam bukunya:



Tidak ada sistem tipe dalam Javascript. Sekarang saya akan menyebutkan masalah yang saya temui dalam pekerjaan saya dan menjelaskan bagaimana mereka diselesaikan.

Biasanya sulit untuk memanggil sistem tipe sistem tipe di Javasript - ada garis yang menunjukkan jenis objek, tetapi pada kenyataannya tidak ada hubungannya dengan jenis. Masalah ini diselesaikan dalam TypeScript (add-on untuk Javasript) dan Flow (jenis pemeriksa statis dalam Javascript). Sebenarnya, frontend telah mencapai solusi untuk masalah sistem tipe yang buruk di Javascript.



Tidak ada perpustakaan standar di browser - ada beberapa objek bawaan dan fungsi "ajaib" di browser. Tetapi saya tidak memiliki perpustakaan standar dalam Javascript seperti itu. Masalah ini pernah dipecahkan oleh jQuery (semua orang menggunakan jQuery dengan semua prototipe, helper, fungsi yang diperlukan untuk bekerja). Sekarang semua orang menggunakan Lodash:



Callback hell. Saya pikir semua orang melihat kode Javascript sekitar 5 tahun yang lalu, dan itu tampak seperti "mie" dari seluk beluk callback yang luar biasa. Sekarang masalah ini telah diselesaikan (dengan merilis ES-15 atau ES-16), mereka menambahkan janji ke Javascript dan semua orang mulai bernafas lebih mudah untuk sementara waktu.



Sampai Promice hell datang ... Saya tidak tahu bagaimana industri front-end mengelola, tetapi mereka terus-menerus mendorong diri mereka ke beberapa belantara yang aneh. Mereka juga berhasil membuat neraka pada "janji". Kemudian mereka memecahkan masalah ini dengan menambahkan primitif baru - async / menunggu:



Masalah diselesaikan dengan asynchrony. Async / wait adalah primitif yang cukup populer dalam berbagai bahasa. Dalam "Python" dan yang lain ada pendekatan seperti itu - itu cukup baik. Masalahnya teratasi.

Masalah apa yang tidak terselesaikan? Kompleksitas kerangka kerja yang tumbuh secara eksponensial, kompleksitas ekosistem dan program itu sendiri.



  • Sintaksis Javasript agak aneh. Kita semua tahu masalah dengan menambahkan array dan objek dan lelucon lainnya.
  • Javascript adalah multi-paradigma. Sekarang ini adalah sistem yang sangat mendesak ketika ekosistemnya sangat besar:

    • semua orang menulis dengan gaya yang berbeda - seseorang menulis secara struktural, seseorang menulis secara fungsional, pengembang yang berbeda menulis secara berbeda;
    • dari paket yang berbeda, paradigma yang berbeda ketika Anda menggunakan paket yang berbeda;
    • ada banyak "kesenangan" dengan pemrograman fungsional di Javasript - perpustakaan rambda telah muncul dan sekarang tidak ada yang bisa membaca program yang ditulis di perpustakaan ini.

  • Ini semua membuat dampak besar pada ekosistem, dan itu telah tumbuh luar biasa. Paket tidak kompatibel satu sama lain: seseorang yang dijanjikan, seseorang yang async / menunggu, seseorang yang dipanggil kembali. Mereka juga menulis dalam berbagai paradigma!
  • Ini membuat proyek sulit dipertahankan. Sulit menemukan bug jika Anda tidak dapat membaca kode.

Apa itu Web Assemly?


Orang-orang pemberani dari Mozilla Foundation dan beberapa perusahaan lain datang dengan sesuatu yang disebut Web Assembly. Apa itu?



  • Ini adalah mesin virtual yang dibangun ke dalam browser yang mendukung format biner.
  • Program biner sampai di sana, mereka dijalankan hampir secara asli, yaitu, browser tidak perlu mengurai semua "mie" dari kode javascript setiap waktu.
  • Semua browser telah menyatakan dukungan.
  • Karena ini adalah bytecode, Anda dapat menulis kompiler untuk bahasa apa pun.
  • Empat browser utama sudah hadir dengan dukungan Majelis Web.
  • Segera kami menunggu dukungan asli di Go. Arsitektur baru seperti itu telah ditambahkan: GOARCH = wasm GOOS = js (soon). Sejauh ini, seperti yang saya mengerti, itu tidak fungsional, tetapi ada pernyataan bahwa itu pasti akan ada di Go.

Apa yang harus dilakukan sekarang? Gopherjs


Meskipun kami tidak memiliki dukungan Perakitan Web, ada pengangkut seperti GopherJS.



  • Pergi kode transpiles ke Javascript murni.
  • – , ( Vanilla JS, ).
  • , Go, … – , .
  • , , : syscall, net- ( net/http-, , XMLHttpRequest). – , stdlib Go, .
  • Go, ( .) GopherJS .

GopherJS sangat mudah didapat - ini adalah paket Go biasa. Kami berhasil, dan kami memiliki tim GopherJS untuk membangun aplikasi:



Ini adalah dunia halo kecil ...



... Program-Go reguler, paket fmt reguler dari perpustakaan standar dan Binding Js untuk mencapai API browser. Println akhirnya akan dikonversi ke log konsol dan browser akan menulis "Hello Gophers"! Sesederhana itu: kita lakukan build GopherJS - jalankan di browser - semuanya berfungsi!

Apa yang ada di sana saat ini? Binding




Ada binder ke semua framework js populer:

  • JQuery
  • Angular.js;
  • D3.js untuk grafik dan bekerja dengan data besar;
  • React.js;
  • VueJS;
  • bahkan ada dukungan Elektron (yaitu, kita sekarang dapat menulis aplikasi desktop di Elektron);
  • dan yang paling lucu adalah WebGL (kita bisa membuat aplikasi grafis lengkap, termasuk game dengan grafik 3D, musik, dan semua barang lainnya);
  • dan banyak pengikat lainnya untuk semua kerangka kerja dan perpustakaan javascript populer.

Kerangka


  1. Sudah ada kerangka kerja web yang dikembangkan khusus untuk GopherJS - Vecty. Ini adalah analog lengkap dari React.js, tetapi hanya dikembangkan di Go, dengan spesifikasi GopherJS.
  2. Ada tas permainan (tiba-tiba!). Saya menemukan dua yang paling populer:

    • Inggris;
    • Ebiten.

Saya akan menunjukkan beberapa contoh tentang bagaimana ini terlihat dan apa yang dapat Anda tulis di Go sekarang:



Atau opsi semacam itu (saya tidak menemukan penembak 3D, tapi mungkin itu):



Apa yang saya sarankan?


Sekarang industri front-end sedemikian rupa sehingga semua bahasa yang menangis dari Javascript sebelum ini akan terburu-buru di sana. Sekarang semua orang akan dikompilasi ke dalam Sidang Web. Apa yang kita butuhkan untuk mengambil tempat yang layak di sana sebagai β€œpenjual”?



Go secara tradisional menyatakan bahwa itu adalah bahasa pemrograman Sistem, dan praktis tidak ada perpustakaan untuk bekerja dengan UI. Ada sesuatu di sana, tetapi setengah ditinggalkan, setengah tidak berfungsi.

Dan ini adalah kesempatan bagus untuk membuat perpustakaan UI on Go yang akan berjalan di GopherJS! Anda akhirnya dapat menulis kerangka kerja Anda sendiri! Waktunya telah tiba ketika Anda bisa menulis kerangka kerja, dan dia akan menjadi yang pertama menerima adaptasi awal, dan Anda akan menjadi bintang (jika itu kerangka kerja yang baik).

Anda dapat menyesuaikan banyak paket berbeda yang sudah ada di ekosistem Go dengan spesifikasi peramban (misalnya, mesin Templat). Mereka sudah berfungsi, Anda dapat membuat binding yang nyaman sehingga Anda dapat dengan mudah membuat konten langsung di browser. Plus, Anda dapat membuat, misalnya, layanan yang dapat membuat hal yang sama di server dan di frontend menggunakan kode yang sama - semuanya seperti apa yang disukai pengembang front-end (hanya sekarang di Go).

Anda bisa menulis game! Hanya untuk bersenang-senang ...

Saya memilikinya.



Pertanyaan


Pertanyaan (selanjutnya - T): - Apakah saya menulis di Go atau di Js?

AG: - Anda menulis rutinitas, saluran, struktur, menanamkan pada Go - itu saja ... Anda berlangganan sebuah acara, melewati fungsi di sana.

T: - Yaitu, saya menulis di "telanjang" Js?

AG: - Tidak, Anda menulis seolah-olah di Go dan terhubung ke API browser (API tidak berubah pada saat yang sama). Anda dapat menulis ikatan agar pesan masuk ke saluran - mudah.

T: - Bagaimana dengan ponsel?

AG: - Saya pasti melihat: ada binder untuk patch Cordova yang diluncurkan Js. Di Bereaksi Asli, saya tidak tahu; mungkin ada, mungkin tidak (tidak terlalu tertarik). Mesin permainan N-go juga mendukung aplikasi seluler - iOs dan Android.

DI:- Pertanyaan tentang Majelis Web. Semakin banyak tempat yang ditempati, meskipun ketat, "zip" ... Bisakah kita membunuh dunia front-end dengan cara ini bahkan lebih?

AG: - Perakitan Web adalah format biner, dan biner secara default tidak boleh ada di rilis final lebih dari teks ... runtime menarik Anda, tetapi sama dengan pustaka Javascript standar, ketika tidak ada di sana, kami menggunakan beberapa jenis suatu hari nanti Lodash. Saya tidak tahu berapa banyak yang diambil Lodash.

T: - Secara eksplisit kurang dari runtime ...

AG: - Pada Javascript "murni"?

T: - Ya. Kami memerasnya sebelum mengirimkannya ...

AG:- Tapi ini teksnya ... Secara umum, megabita banyak, tetapi hanya itu (Anda memiliki semua runtime). Selanjutnya, Anda menulis logika bisnis Anda, yang akan meningkatkan biner Anda sebesar 1%. Sampai aku melihat ini, bunuh frontend. Selain itu, Perakitan Web akan berjalan lebih cepat dari Javascript karena alasan yang jelas - tidak perlu diuraikan.

T: - Sejauh ini, momen yang kontroversial ... Masih belum ada referensi implementasi "Vasma" (Web Assembly), sehingga Anda dapat dengan jelas menilai. Secara konseptual - ya: kita semua memahami bahwa biner harus lebih cepat, tetapi implementasi V8 yang sama saat ini sangat efektif.

AG: - Ya.

T: - Kompilasi bekerja sangat keren di sana dan bukan fakta bahwa akan ada keuntungan besar.

AG: - Majelis Web juga melakukan hal-hal hebat.

DI:- Sejauh ini, menurut saya, masih sulit untuk menilai Majelis Web. Bicara telah berlangsung selama bertahun-tahun, dan ada beberapa prestasi nyata yang bisa dirasakan.

AG: - Mungkin. Kita lihat.

T: - Kami tidak memiliki masalah di backend ... Mungkin meninggalkan masalah ini di frontend? Kenapa naik ke sana?

AH: - Kita harus menjaga staf perbatasan.


Sedikit iklan :)


Terima kasih untuk tetap bersama kami. Apakah Anda suka artikel kami? Ingin melihat materi yang lebih menarik? Dukung kami dengan melakukan pemesanan atau merekomendasikan kepada teman Anda, cloud VPS untuk pengembang dari $ 4,99 , analog unik dari server entry-level yang diciptakan oleh kami untuk Anda: Seluruh kebenaran tentang VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps mulai dari $ 19 atau cara membagi server? (opsi tersedia dengan RAID1 dan RAID10, hingga 24 core dan hingga 40GB DDR4).

Dell R730xd 2 kali lebih murah di pusat data Equinix Tier IV di Amsterdam? Hanya kami yang memiliki 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV dari $ 199 di Belanda!Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - mulai dari $ 99! Baca tentang Cara Membangun Infrastruktur Bldg. kelas c menggunakan server Dell R730xd E5-2650 v4 seharga 9.000 euro untuk satu sen?

All Articles