Rumah >hujung hadapan web >tutorial js >Gunakan C/C untuk melaksanakan modul Node.js (1)_node.js

Gunakan C/C untuk melaksanakan modul Node.js (1)_node.js

WBOY
WBOYasal
2016-05-16 16:35:331222semak imbas

Perangkap yang berlaku lama dahulu - menggunakan Node.js untuk membina semula Hakim Dalam Talian NBUT, termasuk bahagian penilaian, juga terpaksa dibina semula. (Apabila ia akan selesai, jangan risau, (/ Д′)/~ ╧╧

Ringkasnya, apa yang perlu kita lakukan sekarang ialah menggunakan C/C untuk melaksanakan modul Node.js.

Persediaan

Jika seorang pekerja ingin menjalankan tugasnya dengan baik, dia mesti terlebih dahulu~~bermain penyangak~~ dan mengasah alatannya.

nod-gip

Mula-mula anda memerlukan modul nod-gyp.

Di mana-mana sudut, laksanakan:

Salin kod Kod adalah seperti berikut:

$ npm pasang node-gyp -g

Selepas beberapa siri blahblah, anda dipasang.

Python

 Maka anda memerlukan persekitaran ular sawa.

Pergi ke tapak web rasmi untuk mendapatkannya sendiri.


Nota: Menurut GitHub node-gyp, sila pastikan versi python anda adalah antara 2.5.0 dan 3.0.0.

Persekitaran kompilasi

Nah, saya terlalu malas untuk menulisnya secara terperinci. Sila pergi ke node-gyp untuk melihat keperluan pengkompil. Dan tuangkan dengan baik.

Bermula

Izinkan saya bercakap tentang pengenalan Hello World di laman web rasmi.

Helo Dunia

Sila sediakan fail C, sebagai contoh, panggil ia ~~sb.cc~~ hello.cc.

Kemudian mari kita pergi langkah demi langkah, mula-mula buat fail pengepala dan tentukan ruang nama:

Salin kod Kod adalah seperti berikut:

#include
#include
menggunakan ruang nama v8;

Fungsi utama

Seterusnya kita menulis fungsi yang nilai pulangannya ialah Handle.

Salin kod Kod adalah seperti berikut:

Mengendalikan Hello(Const Arguments& args)
{
//... Menunggu untuk ditulis
}

Kemudian izinkan saya menganalisis secara ringkas perkara ini:

Kendalikan

Anda mesti mempunyai integriti sebagai seorang manusia, saya ingin menyatakan terlebih dahulu bahawa saya merujuknya dari sini (@fool).


V8 menggunakan jenis Handle untuk mengehoskan objek JavaScript Sama seperti std::sharedpointer C, tugasan antara jenis Handle secara langsung lulus rujukan objek, tetapi perbezaannya ialah V8 menggunakan GCnya sendiri untuk mengurus kitaran hayat objek, dan bukannya rujukan pintar yang biasa digunakan. mengira untuk penunjuk.

Jenis JavaScript mempunyai jenis tersuai yang sepadan dalam C, seperti String, Integer, Object, Date, Array, dsb., yang mematuhi perhubungan warisan dalam JavaScript. Apabila menggunakan jenis ini dalam C, anda mesti menggunakan pengurusan Handle untuk menggunakan GC untuk mengurus kitaran hayatnya dan bukannya menggunakan tindanan dan timbunan asli.

Nilai yang dipanggil ini boleh dilihat daripada pelbagai hubungan warisan dalam fail pengepala v8.h enjin V8 Ia sebenarnya adalah kelas asas pelbagai objek dalam JavaScript.

Selepas memahami perkara ini, kita boleh memahami secara kasar maksud pengisytiharan fungsi di atas, iaitu kita menulis fungsi Hello yang mengembalikan nilai jenis tidak tentu.


Nota: Kami hanya boleh mengembalikan jenis tertentu, iaitu String, Integer, dsb. di bawah pengurusan Handle.

Hujah

Ini ialah parameter yang dihantar ke dalam fungsi ini. Kita semua tahu bahawa dalam Node.js, bilangan parameter adalah rawak. Apabila parameter ini dihantar ke C, ia ditukar menjadi objek jenis Argumen ini.

Kami akan bercakap tentang penggunaan khusus kemudian, di sini anda hanya perlu memahami apa ini. (Mengapa anda begitu kritikal? Kerana contoh dalam dokumentasi rasmi Node.js dibincangkan secara berasingan. Saya hanya bercakap tentang contoh Hello World yang pertama sekarang (´థ౪థ)σ

Sumbangan

Kemudian kami mula menambah bata dan jubin. Hanya dua ayat mudah:

Salin kod Kod adalah seperti berikut:

Mengendalikan Hello(Const Arguments& args)
{
Skop HandleScope;
Kembalikan skop.Close(String::New("world"));
}

Apakah maksud kedua-dua ayat ini? Maksud kasarnya ialah mengembalikan rentetan "dunia" dalam Node.js.

Skop Pemegang

Rujukan yang sama datang dari sini.


Kitaran hayat Handle berbeza daripada penunjuk pintar C Ia tidak wujud dalam skop semantik C (iaitu, bahagian yang dikelilingi oleh {}), tetapi perlu ditentukan secara manual melalui HandleScope. HandleScope hanya boleh diperuntukkan pada tindanan Selepas objek HandleScope diisytiharkan, kitaran hayat Handle yang dibuat kemudiannya diuruskan oleh HandleScope Selepas objek HandleScope dimusnahkan, Handle yang diuruskan olehnya akan dinilai oleh GC sama ada untuk menjadi. dikitar semula.

Jadi, kita perlu mengisytiharkan Skop ini apabila kita perlu menguruskan kitaran hayatnya. Okay, jadi kenapa kod kami tidak kelihatan seperti ini?

Salin kod Kod adalah seperti berikut:

Mengendalikan Hello(Const Arguments& args)
{
Skop HandleScope;
Return String::New("world");
}

Kerana apabila fungsi itu kembali, skop akan dimusnahkan dan Pemegang yang diurusnya juga akan dikitar semula, jadi String ini akan menjadi tidak bermakna.

Jadi V8 menghasilkan idea ajaib - fungsi HandleScope::Close(Handle Value)! Tujuan fungsi ini adalah untuk menutup Skop ini dan memindahkan parameter di dalam Skop sebelumnya untuk pengurusan, iaitu Skop sebelum memasuki fungsi ini.

Jadi terdapat skop kod kami yang terdahulu.Close(String::New("world"));.

String::Baharu

 Kelas String ini sepadan dengan kelas rentetan asli dalam Node.js. Diwarisi daripada kelas Nilai. Sama seperti ini, terdapat juga:

•Susunatur
•Integer
•Boolean
•Objek
•Tarikh
•Nombor
•Fungsi
•...

Sesetengah perkara ini diwarisi daripada Nilai, dan ada yang diwarisi dua kali. Kami tidak akan melakukan banyak penyelidikan di sini Anda boleh melihat kod V8 (sekurang-kurangnya fail pengepala) atau membaca manual ini.

Dan bagaimana pula dengan Baharu ini? Anda boleh melihatnya di sini. Hanya buat objek String baharu.

Pada ketika ini, kami telah menyelesaikan analisis fungsi utama ini.

Eksport objek

Mari kita semaknya Jika kita menulisnya dalam Node.js, bagaimanakah kita mengeksport fungsi atau objek?

Salin kod Kod adalah seperti berikut:

exports.hello = function() {}

Jadi, bagaimana kita melakukan ini dalam C?

Fungsi permulaan

Mula-mula, kita tulis fungsi permulaan:

Salin kod Kod adalah seperti berikut:

void init(Mengendalikan eksport)
{
//...Saya sedang menunggu untuk menulis tentang adik awak! #゚Å゚)⊂彡☆))゚Д゚)・∵
}

Ini adalah punggung penyu! Tidak kira apa nama fungsinya, tetapi parameter yang dihantar mestilah Pemegang, yang bermaksud kami akan mengeksport sesuatu pada produk ini seterusnya.

Kemudian, kami menulis bahan yang dieksport di sini:

Salin kod Kod adalah seperti berikut:

void init(Mengendalikan eksport)
{
eksport->Set(String::NewSymbol("hello"),
FunctionTemplate::New(Hello)->GetFunction());
}

Maksud umum ialah, tambahkan medan yang dipanggil hello pada objek eksport ini, dan perkara yang sepadan ialah fungsi, dan fungsi ini ialah fungsi Hello sayang kami.

Untuk meletakkannya dengan jelas dalam kod pseudo:

Salin kod Kod adalah seperti berikut:

void init(Mengendalikan eksport)
{
exports.Set("hello", function hello);
}

Selesai!

 (Selesai, kakak! Diam (‘д‘⊂彡☆))Д´)

Benar·Eksport

Ini adalah langkah terakhir Kami perlu mengisytiharkan bahawa ini adalah pintu masuk ke eksport, jadi kami menambah baris ini di penghujung kod:
NODE_MODULE(hello, init)

Adakah anda membayar seorang nenny? ! Apa ini?

Jangan risau, NODE_MODULE ini ialah makro, yang bermaksud kami menggunakan fungsi inisialisasi init untuk mengeksport perkara yang akan dieksport ke hello. Jadi dari mana datangnya salam ini?

Ia berasal daripada nama fail! Ya, betul, ia berasal dari nama fail. Anda tidak perlu mengisytiharkannya terlebih dahulu, dan anda tidak perlu risau tentang tidak dapat menggunakannya Secara ringkasnya, apa sahaja nama fail binari yang dikompilasi akhir anda, isikan sahaja hello di sini, kecuali akhiran sudah tentu.

Lihat dokumentasi rasmi untuk butiran.


Ambil perhatian bahawa semua tambahan Node mesti mengeksport fungsi permulaan:

Salin kod Kod adalah seperti berikut:

void Initialize (Kendalikan eksport);
NODE_MODULE(module_name, Initialize)

Tiada koma bertindih selepas NODE_MODULE kerana ia bukan fungsi (lihat node.h).

Nama_modul perlu sepadan dengan nama fail perduaan akhir (tolak akhiran .nod).

Susun (๑•́ ₃ •̀๑)

Ayuh, mari kita susun bersama-sama!

Mari buat fail arkib baharu yang serupa dengan Makefile - binding.gyp.

Dan tambah kod ini di dalam:

Salin kod Kod adalah seperti berikut:

{
"sasaran": [
{
"target_name": "hello",
"sumber": [ "hello.cc" ]
}
]
}

Mengapa anda menulisnya seperti ini? Anda boleh merujuk kepada dokumentasi rasmi node-gyp.

konfigurasikan

Selepas fail siap, kita perlu melaksanakan arahan ini dalam direktori ini:

Salin kod Kod adalah seperti berikut:

$ nod-gyp configure

Jika semuanya normal, direktori binaan harus dijana, dan akan ada fail berkaitan di dalamnya, mungkin fail vcxproj M$ Visual Studio, dsb., mungkin Makefile, bergantung pada platform.

bina

Selepas Makefile dijana, kami mula membina dan menyusun:
$ binaan nod-gyp

Apabila semuanya disusun, ia benar-benar selesai! Jika anda tidak percaya saya, lihat direktori binaan/Keluaran Adakah terdapat fail hello.node di bawah? Ya, inilah sabun yang C akan ambil untuk Node.js nanti!

Ambil gay! Nod ヽ(✿゚▽゚)ノ C

Kami mencipta fail baharu jianfeizao.js dalam direktori tadi:

Salin kod Kod adalah seperti berikut:

var addon = memerlukan("./build/Release/hello");
console.log(addon.hello());

Adakah anda melihatnya? Adakah anda melihatnya? Dah keluar, dah keluar! Hasil daripada Node.js dan C menjadi radikal! Addon.hello() ini ialah Handle Hello(const Arguments& args) yang kami tulis dalam kod C sebelum ini, dan kini kami telah mengeluarkan nilai yang dipulangkan.

Tidur, bahagian seterusnya akan lebih mendalam

Hari sudah lewat, jadi itu sahaja untuk hari ini Semua orang boleh mencipta sambungan C paling asas bagi dunia Hello. Kali seterusnya saya menulis ia harus lebih mendalam. Mengenai bila kali seterusnya, saya sebenarnya tidak tahu.
(Hei, hey, hey, bagaimana seorang melancap boleh jadi tidak bertanggungjawab! (o゚ロ゚)┌┛Σ(ノ´ω`)ノ

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