Helo, nama saya Lucas Wasilewski dan sama seperti yang saya masukkan dalam penerangan projek pada github saya sejak saya memulakan pengaturcaraan dengan NodeJS (pada awal tahun 2021) saya sentiasa mahu tulis sesuatu yang kelihatan seperti alat itu, ini hanya meningkat selepas saya menonton dokumentari tentang projek itu dan saya kagum bagaimana dunia sumber terbuka boleh mempunyai beberapa kelainan dan selekoh dan sangat mengalu-alukan apabila ia mahu. Dan selepas seminggu banyak menggaru kepala, saya memutuskan untuk menulis artikel ini supaya pengaturcara masa depan gila yang mahukan cabaran ini tidak melakukan kesilapan yang sama yang saya lakukan.
Istilah ini dengan mudah boleh mengelirukan sesiapa sahaja yang tidak begitu faham tentang subjek tersebut dan oleh itu definisi yang baik diperlukan:
Waktu jalan Javascript ialah alat yang membolehkan anda menjalankan bahasa di luar penyemak imbas
Kini terdapat 3 runtime popular: NodeJS, Deno (Node Killer) dan Bun (Deno Killer), tetapi mereka pada asasnya melakukan perkara yang sama: mereka membenarkan anda menggunakan javascript dari penyemak imbas dan menggunakan perpustakaan lain untuk mencipta ciri baharu satu, dan itu sangat bagus, kerana anda boleh menggunakan mana-mana daripadanya untuk membina pelayan, mencipta perpustakaan dan juga aplikasi mudah alih atau terminal.
Kedua-dua Node dan Deno dicipta oleh orang yang sama: Ryan Dahl, dan pada tahun 2009 dia mencipta alat untuk membolehkan pembangun mencipta aplikasi "async IO", iaitu, yang tidak menyekat utas utama tetapi masih meneruskan membalas permintaan, dengan mengambil kira ini dia mencipta Libuv, sebuah perpustakaan yang melakukan perkara itu. Sehingga itu projek itu hanyalah timbunan besar C dan jika dia mahu lebih ramai orang menggunakan alat itu dia memerlukan beberapa bahasa yang lebih mudah difahami dan digunakan, secara kebetulan, pada masa yang sama Google melancarkan V8, yang secara amnya adalah ultra- pengkompil javascript yang pantas, ini membuatkan dia menggabungkan kedua-duanya dan seterusnya mencipta Node.
Beberapa lama kemudian (9 tahun lebih khusus), Ryan meninggalkan projek itu dan bekerja pada perkara lain yang dianggapnya lebih menarik, ini membuatkan dia menyedari beberapa ralat yang boleh diperbaiki dalam Node, tetapi komuniti sudah sangat besar dan terpaksa mengambil langkah besar ke belakang adalah mustahil, jadi, bertekad untuk melakukan kerja yang lebih baik, dia mencipta Deno, satu lagi masa jalan IO yang menjanjikan untuk menjadi lebih baik daripada Node, pada hari ini (2024) Deno berada dalam versi 2.0 dan sangat stabil untuk projek dan komuniti.
Keseluruhan cerita ini membuatkan lebih ramai orang menyertai komuniti masa jalan dan ini juga membawa kami kepada penciptaan Bun, dan jauh lebih baik, saya dan masa jalan anda! Sekarang mari kita mulakan perniagaan.
Seperti yang dinyatakan sebelum ini, V8 ialah enjin Node, jadi kami perlu memuat turunnya dan menyusunnya secara manual untuk mendapat akses kepada pustaka dan pengepalanya. Memandangkan ia adalah projek Google, mereka mempunyai kaedah mereka sendiri untuk memuat turun dan menyusun, jadi untuk ini kami perlu mengikut manual mereka: pautan, hanya menyalin dan menampal akan membawa anda ke arahan terakhir.
Namun, di sini saya melakukan kesilapan yang mengambil masa 3 hari untuk saya sedar bahawa saya melakukan semuanya salah. Selepas menjana fail konfigurasi binaan dengan:
tools/dev/v8gen.py x64.release
Anda perlu berhati-hati dengan fail args.gn di dalam folder out.gn/x64.release/ kerana ia mengandungi konfigurasi binaan yang akan digunakan oleh ninja (alat penyusunan) untuk menjana fail perpustakaan, beberapa tutorial Lama gunakan parameter v8_monolithic = true, tetapi dalam versi terkini ini tidak lagi digunakan. Menurut ulasan StackOverflow ini, kita kini perlu menggunakan parameter is_component_build = true untuk menjana fail yang betul dan mengubah suai bendera semasa menyusun fail, sesuatu yang sangat bodoh yang jika anda tidak memberi perhatian boleh membuang masa yang berharga.
Selepas meletakkan seluruh bendera dengan betul, kita hanya perlu menjalankan arahan untuk menyusun projek
ninja -C out.gn/x64.release
Sementara itu, pergi makan sesuatu, kerana V8 ialah projek yang sangat luas dengan ujian yang tidak terkira banyaknya, bergantung pada mesin anda, proses ini boleh mengambil masa 1 jam atau lebih dengan mudah, jadi biarkan ia berjalan dan teruskan membaca.
Selepas menyusun, anda boleh melihat v8/samples/hello-world.cc dan mula mendapat idea tentang cara menyusun javascript, tetapi khususnya baris ini:
v8::Local<v8::String> source = v8::String::NewFromUtf8Literal(isolate, "'Hello' + ', World!'"); // Compile the source code. v8::Local<v8::Script> script = v8::Script::Compile(context, source).ToLocalChecked();
Teruskan dan bermain dengan rentetan yang mengandungi "Hello World", buat fungsi, gelung, bersyarat dan menjadi gila apabila anda menyedari bahawa jika anda menyertakan console.log() klasik anda akan menerima undefined, yang pertama sekali ia membingungkan saya, saya selalu berfikir bahawa objek konsol adalah sebahagian daripada V8 itu sendiri, tetapi sebenarnya Node sendiri menyertakannya dan penyemak imbas memasukkannya sebagai sebahagian daripada DOM (siaran dari 2012 mengatakan bahawa console.log mungkin tidak disokong oleh pelayar), bermakna kami perlu menciptanya sendiri.
Untuk dapat mencipta fungsi kita sendiri, pertama sekali kita perlu memahami bahawa V8 berfungsi dengan beberapa skop, salah satunya ialah konteks, di mana melalui ini masa larian mengetahui di mana dan bagaimana untuk melaksanakan skrip secara individu, di dalamnya mungkin terdapat objek global yang dikongsi antara semua yang lain, dan di dalamnya kami akan memasukkan fungsi tersuai kami.
tools/dev/v8gen.py x64.release
Dengan baris ini kami dapat mencipta objek yang dipanggil global, kami memasukkan templat fungsi "cetak" yang apabila dilaksanakan memanggil fungsi Cetak.
v8::Local<v8::String> source = v8::String::NewFromUtf8Literal(isolate, "'Hello' + ', World!'"); // Compile the source code. v8::Local<v8::Script> script = v8::Script::Compile(context, source).ToLocalChecked();
Fungsi Cetak menerima parameter gila ini yang mengandungi maklumat tentang panggilan fungsi dalam javascript dan melaluinya kami mengulangi semua item di dalamnya, mengubahnya menjadi rentetan C dan mencetaknya pada skrin, sangat langsung, sangat mudah dan ia memenuhi peranannya, itu sudah cukup untuk memasukkannya ke dalam fail, membacanya dan memainkannya pada V8 (saya serahkan yang itu di tangan anda).
v8::Local<v8::ObjectTemplate> global = v8::ObjectTemplate::New(GetIsolate()); global->Set(GetIsolate(), "print", v8::FunctionTemplate::New(GetIsolate(), this->Print)); v8::Local<v8::Context> context = v8::Context::New(GetIsolate(), nullptr, global);
Nah, saya harap sekarang anda telah dapat mengikuti dan malah telah berhenti membaca untuk membuat beberapa pelaksanaan unik untuk Node buatan sendiri anda, tetapi V8 hanya akan membawa kami sejauh ini, supaya kami boleh lebih dekat dengan masa jalan profesional kami perlu menjadikan javascript dapat melaksanakan lebih banyak operasi, untuk melakukan ini kami akan menggunakan Libuv, yang dicipta tepat untuk ini.
Anda boleh mendapatkan tutorial untuk memasang dan menyusun di sini. Perkara penting yang perlu diperhatikan di sini ialah ia memberi kita kebebasan untuk melakukan operasi tak segerak, iaitu, tanpa menyekat utas utama, sekali gus membenarkan atur cara untuk terus melaksanakan semasa melakukan kerja yang lebih berat (seperti membuka fail atau menunggu permintaan dalam pelayan soket).
Ia sendiri sudah terbina dalam dengan fungsi untuk mencipta pelayan http, jadi kami hanya perlu menyegerakkannya dengan panggilan V8. Jangan silap, ini bukan tugas yang mudah, kerana antara muka kedua-dua perpustakaan berbeza jauh jadi sukar untuk menyambung kedua-duanya, tetapi sentiasa ada cara dan kod sumber nod terbuka jadi pastikan untuk mencuri beberapa idea daripada di sana
Kami telah sampai ke penghujung artikel lain dan dengan itu kami melihat beberapa butiran yang saya perhatikan semasa pelaksanaan. Yang pertama ialah kerumitan, sudah tentu, ia bukan projek yang mudah, tetapi sebaik sahaja anda memahami cara berinteraksi dengan antara muka V8, semuanya akan berjalan dengan cepat.
Projek ini membuatkan saya memahami Node dengan lebih baik juga. Hakikat bahawa masa jalan hanyalah satu konglomerat perpustakaan yang berkomunikasi menjadikannya sangat mudah untuk memahami cara perkara yang lebih kompleks (seperti "gelung peristiwa") berfungsi.
Jika anda ingin melihat apa yang saya lakukan betul, atau mungkin sangat salah, sila lihat projek di github: selesai
Cakap murah, tunjukkan kod - Linus Torvalds
## Rujukan
https://github.com/libuv/libuv
https://v8.dev/docs
https://stackoverflow.com/questions/71213580/cant-get-v8-monolith-to-genorate
https://github.com/ErickWendel/myownnode
https://github.com/WasixXD/done
Atas ialah kandungan terperinci Mencipta Masa Jalan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!