Alexey Grachev: Pergi Frontend

Kyiv Go Meetup Mei 2018:

Alexey Grachev: Pergi Frontend

Mengetuai: - Hai semua! Terima kasih kerana berada di sini! Hari ini kami mempunyai dua penceramah rasmi - Lyosha dan Vanya. Akan ada dua lagi jika kita mempunyai masa yang cukup. Penceramah pertama ialah Alexey Grachev, dia akan memberitahu kami tentang GopherJS.

Alexey Grachev (selepas ini – AG): – Saya seorang pembangun Go, dan saya menulis perkhidmatan web dalam Go. Kadang-kadang anda perlu berurusan dengan bahagian hadapan, kadang-kadang anda perlu masuk ke dalamnya secara manual. Saya ingin bercakap tentang pengalaman dan penyelidikan saya tentang Go on the frontend.

Lagendanya ialah: mula-mula kita akan bercakap tentang sebab kita mahu menjalankan Go di bahagian hadapan, kemudian kita akan bercakap tentang cara ini boleh dilakukan. Terdapat dua cara - Perhimpunan Web dan GopherJS. Mari lihat apakah status penyelesaian ini dan apa yang boleh dilakukan.

Apa yang salah dengan bahagian hadapan?

Adakah semua orang bersetuju bahawa semuanya baik dengan bahagian hadapan?

Alexey Grachev: Pergi Frontend

Adakah ujian tidak mencukupi? Binaan lambat? Ekosistem? baiklah.

Mengenai bahagian hadapan, saya suka petikan yang dikatakan oleh salah seorang pembangun bahagian hadapan dalam bukunya:

Alexey Grachev: Pergi Frontend

Javascript tidak mempunyai sistem jenis. Sekarang saya akan menamakan masalah yang saya hadapi dalam perjalanan kerja saya dan menerangkan bagaimana ia diselesaikan.

Sistem jenis secara umum hampir tidak boleh dipanggil sistem jenis dalam Javasript - terdapat baris yang menunjukkan jenis objek, tetapi sebenarnya ini tidak ada kaitan dengan jenis. Masalah ini diselesaikan dalam TypeScript (tambahan kepada Javasript) dan Flow (pemeriksa jenis statik dalam Javascript). Sebenarnya, bahagian hadapan telah mencapai tahap menyelesaikan masalah sistem jenis buruk dalam Javascript.

Alexey Grachev: Pergi Frontend

Tiada perpustakaan standard dalam penyemak imbas seperti itu - terdapat beberapa objek terbina dalam dan fungsi "ajaib" dalam penyemak imbas. Tetapi dalam Javascript tidak ada perpustakaan standard seperti itu. Masalah ini telah diselesaikan sekali oleh jQuery (semua orang menggunakan jQuery dengan semua prototaip, pembantu, fungsi yang diperlukan untuk berfungsi). Kini semua orang menggunakan Lodash:

Alexey Grachev: Pergi Frontend

Panggil balik neraka. Saya rasa semua orang melihat kod Javascript kira-kira 5 tahun yang lalu, dan ia kelihatan seperti "mi" kerumitan panggilan balik yang luar biasa. Sekarang masalah ini telah diselesaikan (dengan keluaran ES-15 atau ES-16), janji telah ditambahkan pada Javascript dan semua orang boleh bernafas lega untuk seketika.

Alexey Grachev: Pergi Frontend

Sehingga neraka Promice tiba ... Saya tidak tahu bagaimana industri bahagian hadapan berjaya, tetapi mereka sentiasa memandu diri mereka ke dalam hutan yang aneh. Kami juga berjaya menepati janji. Kemudian kami menyelesaikan masalah ini dengan menambah primitif baharu - async/await:

Alexey Grachev: Pergi Frontend

Masalah dengan asynchrony telah diselesaikan. Async/wait ialah primitif yang agak popular dalam pelbagai bahasa. Python dan yang lain mempunyai pendekatan ini - ia agak bagus. Masalah selesai.

Apakah masalah yang tidak diselesaikan? Kerumitan rangka kerja yang semakin meningkat secara eksponen, kerumitan ekosistem dan program itu sendiri.

Alexey Grachev: Pergi Frontend

  • Sintaks Javascript agak pelik. Kita semua tahu masalah dengan menambah tatasusunan dan objek dan jenaka lain.
  • Javascript ialah pelbagai paradigma. Ini adalah sistem yang sangat mendesak sekarang apabila ekosistemnya sangat besar:
    • semua orang menulis dalam gaya yang berbeza - ada yang menulis secara berstruktur, ada yang menulis secara fungsional, pembangun yang berbeza menulis dengan cara yang berbeza;
    • daripada pakej yang berbeza, paradigma yang berbeza apabila anda menggunakan pakej yang berbeza;
    • terdapat banyak "keseronokan" dengan pengaturcaraan berfungsi dalam Javasript - perpustakaan rambda muncul dan kini tiada siapa yang boleh membaca program yang ditulis dalam perpustakaan ini.

  • Semua ini memberi kesan besar kepada ekosistem, dan ia telah berkembang dengan luar biasa. Pakej tidak serasi antara satu sama lain: ada yang berdasarkan janji, ada yang berdasarkan async/menunggu, ada yang berdasarkan panggilan balik. Mereka juga menulis dalam paradigma yang berbeza!
  • Ini menjadikan projek itu sukar untuk diselenggara. Sukar untuk mencari pepijat jika anda tidak dapat membaca kod tersebut.

Apakah Perhimpunan Web?

Mereka yang berani dari Yayasan Mozilla dan beberapa syarikat lain menghasilkan perkara seperti Perhimpunan Web. Apakah ini?

Alexey Grachev: Pergi Frontend

  • Ini ialah mesin maya terbina dalam pelayar yang menyokong format binari.
  • Program binari sampai ke sana dan dilaksanakan hampir secara asli, iaitu, penyemak imbas tidak perlu menghuraikan semua "mi" kod javascript setiap kali.
  • Semua pelayar telah mengisytiharkan sokongan.
  • Oleh kerana ini adalah bytecode, anda boleh menulis pengkompil untuk mana-mana bahasa.
  • Empat penyemak imbas utama sudah dihantar dengan sokongan Perhimpunan Web.
  • Kami menjangkakan sokongan asli dalam Go tidak lama lagi. Seni bina baharu ini telah pun ditambah: GOARCH=wasm GOOS=js (tidak lama lagi). Setakat ini, seperti yang saya faham, ia tidak berfungsi, tetapi ada kenyataan bahawa ia pasti akan berada dalam Go.

Apa yang perlu dilakukan sekarang? GopherJS

Walaupun kami tidak mempunyai sokongan untuk Perhimpunan Web, terdapat transpiler seperti GopherJS.

Alexey Grachev: Pergi Frontend

  • Kod Go ditranspilkan ke dalam Javascript "tulen".
  • Berjalan dalam semua penyemak imbas - tiada ciri baharu yang hanya disokong oleh penyemak imbas moden (ini ialah Vanilla JS, yang berjalan pada apa-apa sahaja).
  • Terdapat sokongan untuk hampir semua yang Go ada, termasuk goroutine dan saluran... semua yang kami suka dan tahu sangat.
  • Hampir keseluruhan perpustakaan standard disokong, kecuali pakej yang tidak masuk akal untuk disokong dalam penyemak imbas: syscall, interaksi bersih (terdapat klien net/http, tetapi tiada pelayan, dan klien ditiru melalui XMLHttpRequest). Secara umum, keseluruhan perpustakaan standard tersedia - di sini ia ada dalam penyemak imbas, di sini ialah stdlib Go, yang kami suka.
  • Keseluruhan ekosistem pakej dalam Go, semua penyelesaian pihak ketiga (templatan, dll.) boleh disusun menggunakan GopherJS dan dijalankan dalam penyemak imbas.

GopherJS sangat mudah diperoleh - ia hanya pakej Go biasa. Kami pergi dapatkan, dan kami mempunyai arahan GopherJS untuk membina aplikasi:

Alexey Grachev: Pergi Frontend

Ini adalah dunia hello yang kecil...

Alexey Grachev: Pergi Frontend

...Program Go biasa, pakej fmt perpustakaan standard biasa dan Binding Js untuk mencapai API penyemak imbas. Println akhirnya akan ditukar kepada log konsol dan penyemak imbas akan menulis "Hello gophers"! Semudah itu: kami membina GopherJS – kami melancarkannya dalam penyemak imbas – semuanya berfungsi!

Apa yang anda ada pada masa ini? Ikatan

Alexey Grachev: Pergi Frontend

Terdapat pengikatan untuk semua rangka kerja js yang popular:

  • JQuery;
  • Angular.js;
  • D3.js untuk merancang dan bekerja dengan data besar;
  • React.js;
  • VueJS;
  • malah terdapat sokongan untuk Electron (iaitu, kita sudah boleh menulis aplikasi desktop pada Electron);
  • dan perkara yang paling kelakar ialah WebGL (kami boleh membuat aplikasi grafik penuh, termasuk permainan dengan grafik 3D, muzik dan semua barangan);
  • dan banyak pengikatan lain kepada semua rangka kerja dan perpustakaan javascript yang popular.

Rangka Kerja

  1. Terdapat rangka kerja web yang telah dibangunkan khusus untuk GopherJS - Vecty. Ini adalah analog lengkap React.js, tetapi hanya dibangunkan dalam Go, dengan spesifikasi GopherJS.
  2. Terdapat beg permainan (kejutan!). Saya dapati dua yang paling popular:
    • Engo;
    • Ebiten.

Saya akan menunjukkan kepada anda beberapa contoh tentang rupa dan perkara yang anda sudah boleh tulis dalam Go:

Alexey Grachev: Pergi Frontend

Atau pilihan ini (saya tidak dapat mencari penembak 3D, tetapi mungkin ia wujud):

Alexey Grachev: Pergi Frontend

Apa yang saya tawarkan?

Kini industri front-end berada dalam keadaan sedemikian sehingga semua bahasa yang sebelum ini menangis dari Javascript akan tergesa-gesa ke sana. Sekarang semuanya akan disusun menjadi "Perhimpunan Web". Apakah yang kita perlukan untuk mengambil tempat yang sah di sana sebagai Gophers?

Alexey Grachev: Pergi Frontend

Go secara tradisinya menganggap bahawa ia adalah bahasa pengaturcaraan Sistem, dan hampir tiada perpustakaan untuk bekerja dengan UI. Ada sesuatu, tetapi ia separuh terbengkalai, separuh tidak berfungsi.

Dan kini adalah peluang yang baik untuk membuat perpustakaan UI dalam Go yang akan dijalankan pada GopherJS! Anda akhirnya boleh menulis rangka kerja anda sendiri! Inilah masanya anda boleh menulis rangka kerja, dan ia akan menjadi salah satu rangka kerja yang pertama dan mendapat penggunaan awal, dan anda akan menjadi bintang (jika ia adalah rangka kerja yang baik).

Anda boleh menyesuaikan banyak pakej berbeza yang sudah ada dalam ekosistem Go kepada spesifikasi penyemak imbas (contohnya, enjin Templat). Mereka akan berfungsi, anda boleh membuat pengikatan yang mudah supaya anda boleh dengan mudah memaparkan kandungan secara langsung dalam penyemak imbas. Selain itu, anda boleh membuat, sebagai contoh, perkhidmatan yang boleh menghasilkan perkara yang sama pada pelayan dan pada bahagian hadapan, menggunakan kod yang sama - semua yang disukai oleh pembangun bahagian hadapan (hanya sekarang dalam Go).

Anda boleh menulis permainan! Hanya untuk bersuka-ria…

Itu sahaja yang saya ingin katakan.

Alexey Grachev: Pergi Frontend

soalan

Soalan (selepas ini dirujuk sebagai Q): – Adakah saya menulis dalam Go atau Js?

AG: – Anda menulis rutin, saluran, struktur, pembenaman – semuanya dalam Go... Anda melanggan acara, lulus fungsi di sana.

V: – Jadi saya menulis dalam Js “telanjang”?

AG: – Tidak, anda menulis seolah-olah dalam Go dan menyambung ke API penyemak imbas (API tidak berubah). Anda boleh menulis pengikatan anda sendiri supaya mesej dihantar ke saluran - ia tidak sukar.

V: – Bagaimana dengan mudah alih?

AG: – Saya pasti melihat: terdapat pengikatan untuk tampung Cordova yang Js jalankan. Dalam React Native - Saya tidak tahu; mungkin ada, mungkin tidak (saya tidak begitu berminat). Enjin permainan N-go menyokong kedua-dua aplikasi mudah alih - kedua-dua iOS dan Android.

V: – Soalan mengenai Perhimpunan Web. Semakin banyak ruang sedang digunakan, walaupun terdapat pemampatan dan "zip"... Tidakkah kita akan membunuh dunia hadapan dengan cara ini lebih lagi?

AG: – Perhimpunan Web ialah format perduaan, dan perduaan secara lalai tidak boleh berada dalam keluaran akhir lebih daripada teks... Anda ditarik ke masa jalan, tetapi ini adalah sama seperti menyeret keluar perpustakaan Javascript standard apabila ia tiada, jadi kami gunakan sedikit Lodash. Saya tidak tahu berapa banyak yang Lodash ambil.

V: – Jelas sekali kurang daripada masa jalan...

AG: - Dalam Javascript "tulen"?

V: - Ya. Kami memampatkannya sebelum menghantarnya...

AG: – Tetapi ini adalah teks... Secara umum, satu megabait kelihatan seperti banyak, tetapi itu sahaja (anda mempunyai keseluruhan masa jalan). Seterusnya, anda menulis logik perniagaan anda sendiri, yang akan meningkatkan binari anda sebanyak 1%. Setakat ini saya tidak nampak ini membunuh bahagian hadapan. Selain itu, Perhimpunan Web akan berfungsi lebih cepat daripada Javascript atas sebab yang jelas - ia tidak perlu dihuraikan.

V: – Ini masih menjadi titik kontroversi... Belum ada sebarang pelaksanaan rujukan “Vasma” (Perhimpunan Web) supaya seseorang boleh menilai dengan jelas. Dari segi konsep, ya: kita semua faham bahawa binari sepatutnya lebih pantas, tetapi pelaksanaan semasa V8 yang sama adalah sangat cekap.

AG: - Ya.

V: – Kompilasi di sana berfungsi sangat hebat dan bukan fakta bahawa akan ada kelebihan besar.

AG: – Perhimpunan Web juga dibuat oleh orang besar.

V: – Nampaknya saya masih sukar untuk menilai Perhimpunan Web. Terdapat perbualan yang berlaku selama bertahun-tahun sekarang, tetapi terdapat beberapa pencapaian sebenar yang dapat dirasai.

AG: - Mungkin. Kita akan lihat.

V: – Kami tidak mempunyai masalah di bahagian belakang... Mungkin kami harus meninggalkan masalah ini di bahagian hadapan? Mengapa pergi ke sana?

AG: – Kita perlu mengekalkan kakitangan barisan hadapan.

Beberapa iklan 🙂

Terima kasih kerana tinggal bersama kami. Adakah anda suka artikel kami? Ingin melihat kandungan yang lebih menarik? Sokong kami dengan membuat pesanan atau mengesyorkan kepada rakan, cloud VPS untuk pembangun dari $4.99, analog unik pelayan peringkat permulaan, yang kami cipta untuk anda: Keseluruhan kebenaran tentang VPS (KVM) E5-2697 v3 (6 Teras) 10GB DDR4 480GB SSD 1Gbps daripada $19 atau bagaimana untuk berkongsi pelayan? (tersedia dengan RAID1 dan RAID10, sehingga 24 teras dan sehingga 40GB DDR4).

Dell R730xd 2 kali lebih murah di pusat data Equinix Tier IV di Amsterdam? Hanya disini 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV daripada $199 di Belanda! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - daripada $99! Baca tentang Bagaimana untuk membina infrastruktur corp. kelas dengan penggunaan pelayan Dell R730xd E5-2650 v4 bernilai 9000 euro untuk satu sen?

Sumber: www.habr.com

Tambah komen