แก้ไขเก่าและเรียนรู้สิ่งใหม่คุณสามารถเปียก
ก่อนอื่นโปรดจำคู่มือออนไลน์ของ V8 - http://izs.me/v8-docs/main.html
จำไฟล์ล่าสุดของ GUSTURE.GYP ได้หรือไม่?
การคัดลอกรหัสมีดังนี้:
-
"เป้าหมาย": [
-
"target_name": "addon",
"แหล่งที่มา": ["addon.cc"]
-
-
-
เช่นนี้เรียนรู้จากตัวอย่างหนึ่งและเรียนรู้จากมัน หากคุณมีไฟล์ *.cc เพิ่มเติมมันจะเป็นเช่นนี้:
"แหล่งที่มา": ["addon.cc", "myexample.cc"]
ครั้งสุดท้ายที่เราแยกสองขั้นตอนและในความเป็นจริงการกำหนดค่าและการรวบรวมสามารถรวมเข้าด้วยกัน:
$ node-gyp กำหนดค่าการสร้าง
คุณตรวจสอบเสร็จแล้วหรือยัง? ปราศจาก? -
โอเคไปเลย
สารบัญ
พารามิเตอร์ฟังก์ชัน
ตอนนี้เราจะพูดถึงพารามิเตอร์ในที่สุด
ลองจินตนาการว่ามีฟังก์ชั่นเพิ่ม (a, b) ที่แสดงถึงการเพิ่ม A และ B เพื่อส่งคืนผลลัพธ์ดังนั้นให้เขียนเฟรมด้านนอกฟังก์ชั่นก่อน:
การคัดลอกรหัสมีดังนี้:
#include <node.h>
ใช้เนมสเปซ V8;
จับ <Alde> เพิ่ม (อาร์กิวเมนต์ const & args)
-
ขอบเขตของ Handlescope;
// ... กลับมาอีกครั้ง!
-
ข้อโต้แย้ง
นี่คือพารามิเตอร์ของฟังก์ชัน มาดูการอ้างอิงคู่มืออย่างเป็นทางการของ V8 ก่อน
•ความยาว int () const
•ตัวดำเนินการ <Vale> ท้องถิ่น [] (int i) const
เราไม่สนใจคนอื่นทั้งสองนี้สำคัญมาก! หนึ่งหมายถึงจำนวนพารามิเตอร์ที่ส่งผ่านในฟังก์ชันและอีกอันคือวงเล็บที่เข้าถึงพารามิเตอร์ NTH ผ่านดัชนีตัวห้อย
ดังนั้นสำหรับข้อกำหนดข้างต้นเราสามารถเข้าใจได้ว่า args.length () คือ 2, args [0] หมายถึง a และ args [1] หมายถึง b และเราต้องตัดสินว่าประเภทของตัวเลขทั้งสองนี้จะต้องเป็นตัวเลข
ไม่แน่ใจว่าตัวดำเนินการดัชนีในวงเล็บส่งคืนผลลัพธ์ของ <value> ในท้องถิ่นซึ่งเป็นคลาสพื้นฐานของ Node.js ทุกประเภททุกประเภท ดังนั้นหากพารามิเตอร์ที่ส่งผ่านเป็นประเภทที่แตกต่างกันเราต้องตัดสินว่าพารามิเตอร์คืออะไร สิ่งนี้เกี่ยวข้องกับฟังก์ชั่นบางอย่างของประเภทค่านี้
• isarray ()
• Isboolean ()
• iSdate ()
• isfunction ()
• ISINT32 ()
• isnativeError ()
• isnull ()
• isnumber ()
• iSregexp ()
• isstring ()
-
ฉันจะไม่แสดงรายการทั้งหมดอ่านส่วนที่เหลือด้วยตัวเอง 。:. ゚ (*´∀`) ノ゚:。
การรับรู้
นี่คือฟังก์ชั่นที่เราจะใช้ในภายหลัง โดยเฉพาะมันสามารถพบได้ในเอกสาร V8
ตามชื่อแนะนำว่ามันกำลังโยนข้อผิดพลาด หลังจากดำเนินการคำสั่งนี้มันจะเทียบเท่ากับการเรียกใช้คำสั่ง throw () ในไฟล์ local node.js ตัวอย่างเช่น:
ThrowException (ข้อยกเว้น :: TypeError (String :: ใหม่ ("จำนวนอาร์กิวเมนต์ผิด")));
มันเทียบเท่ากับการดำเนินการ node.js:
โยน typeerror ใหม่ ("จำนวนอาร์กิวเมนต์ผิด");
ไม่ได้กำหนด ()
ฟังก์ชั่นนี้ยังอยู่ในเอกสาร
โดยเฉพาะอย่างยิ่งมันเป็นค่า NULL เนื่องจากฟังก์ชั่นบางอย่างไม่จำเป็นต้องส่งคืนค่าใด ๆ หรือไม่ส่งคืนค่า ในเวลานี้จะต้องใช้ undefined () แทน
ดำเนินการ!
หลังจากเข้าใจคะแนนข้างต้นฉันเชื่อว่าคุณจะสามารถเขียนตรรกะของ A + B เร็ว ๆ นี้ ฉันจะคัดลอกรหัสอย่างเป็นทางการของ Node.js และอ่านให้คุณ มันจะทำ:
การคัดลอกรหัสมีดังนี้:
#include <node.h>
ใช้เนมสเปซ V8;
จับ <Alde> เพิ่ม (อาร์กิวเมนต์ const & args)
-
ขอบเขตของ Handlescope;
// หมายความว่าพารามิเตอร์มากกว่า 2 ตัวสามารถส่งผ่านได้ แต่อันที่จริงเราใช้สองตัวแรกเท่านั้น
if (args.length () <2)
-
// โยนข้อผิดพลาด
ThrowException (ข้อยกเว้น :: TypeError (String :: ใหม่ ("จำนวนอาร์กิวเมนต์ผิด")));
// ส่งคืนค่าว่าง
return scope.close (undefined ());
-
// ถ้าหนึ่งในสองพารามิเตอร์แรกไม่ใช่ตัวเลข
if (! args [0]-> isnumber () ||! args [1]-> isnumber ())
-
// โยนข้อผิดพลาดและส่งคืนค่าว่าง
ThrowException (ข้อยกเว้น :: TypeError (String :: ใหม่ ("ข้อโต้แย้งผิด")));
return scope.close (undefined ());
-
// สำหรับรายละเอียดโปรดดูเอกสาร V8
// http://izs.me/v8-docs/classv8_1_1value.html#a6eac2b07dced58f1761bbfd53bf0e366)
ฟังก์ชั่น // `numberValue`
local <gumber> num = number :: new (args [0]-> numberValue () + args [1]-> numberValue ());
Return Scope.close (NUM);
-
ฟังก์ชั่นเสร็จสิ้นแล้ว!
ในที่สุดเขียนฟังก์ชั่นการส่งออกในตอนท้ายและจะโอเค
การคัดลอกรหัสมีดังนี้:
เป็นโมฆะ init (handle <jobick> การส่งออก)
-
Exports-> set (string :: newsymbol ("เพิ่ม")
functionTemplate :: ใหม่ (เพิ่ม)-> getFunction ());
-
node_module (addon, init)
หลังจากที่คุณรวบรวมเราสามารถใช้มันได้เช่นนี้:
การคัดลอกรหัสมีดังนี้: var addon = ต้องการ ('./ build/release/addon');
console.log (addon.add (1, 1) + "b");
คุณจะเห็น 2b! ✧。٩ (ᗜ) و✧*.
ฟังก์ชั่นการโทรกลับ
ในบทก่อนหน้าเราได้พูดคุยเกี่ยวกับ Hello World เท่านั้น ในบทนี้อาจารย์คุณยายค้นพบด้วยความรู้สึกผิดชอบชั่วดีและเขียนฟังก์ชั่นการโทรกลับ
สำหรับการประชุมให้เขียนกรอบก่อน:
การคัดลอกรหัสมีดังนี้:
#include <node.h>
ใช้เนมสเปซ V8;
จับ <AldE> RunCallback (Const อาร์กิวเมนต์ & Args)
-
ขอบเขตของ Handlescope;
// ... cracky crackle Crackle Crackle Crackle Crackle Crackle Crackle Crackle
return scope.close (undefined ());
-
จากนั้นเราตัดสินใจว่าจะใช้แบบนี้อย่างไร:
func (ฟังก์ชั่น (msg) {
console.log (ผงชูรส);
-
นั่นคือมันจะผ่านพารามิเตอร์ไปยังฟังก์ชันการโทรกลับเราคิดว่ามันเป็นสตริงแล้วเราสามารถ console.log () เพื่อดูได้
ก่อนอื่นคุณต้องมีชุดสตริง
โดยไม่ต้องกังวลใจเพิ่มเติมให้ป้อนสตริงก่อน (√ζε :)
แต่เราต้องทำสตริงประเภททั่วไปนี้เพราะรหัส Node.js อ่อนแอ
local <ค่า> :: ใหม่ (String :: ใหม่ ("Hello World"));
อะไร คุณถามฉันว่า <ค่าท้องถิ่น> คืออะไร?
จากนั้นฉันจะพูดถึงเรื่องนี้เล็กน้อยอ้างถึงเอกสารอ้างอิงจากที่นี่และ V8
ดังที่เอกสารแสดงให้เห็นว่า <T> ได้รับการสืบทอดมาจากมือจับ <T> และฉันจำได้ว่าบทก่อนหน้าได้พูดคุยเกี่ยวกับการจัดการ <T> แล้ว
จากนั้นนี่คือท้องถิ่น
มีที่จับสองประเภทที่จับท้องถิ่นและด้ามจับแบบถาวรซึ่งเป็นท้องถิ่น <t>: ด้ามจับ <t> และถาวร <t>: ด้ามจับ <t> ไม่มีความแตกต่างระหว่างอดีตและด้ามจับ <T> และรอบการอยู่รอดทั้งสองอยู่ในขอบเขต วงจรชีวิตหลังถูกแยกออกจากขอบเขตคุณต้องเรียกด้วยตนเองว่า :: กำจัดเพื่อยุติวงจรชีวิตของมันด้วยตนเอง กล่าวอีกนัยหนึ่งการจัดการในท้องถิ่นนั้นเทียบเท่ากับการจัดสรรวัตถุบนสแต็กบน C ++ `และด้ามจับแบบถาวรนั้นเทียบเท่ากับ C ++ ที่จัดสรรวัตถุบนกอง
จากนั้นคุณต้องมีชุดตารางพารามิเตอร์
วิธีรับพารามิเตอร์บรรทัดคำสั่งหลังจากเรียก C/C ++ บนบรรทัดคำสั่งเทอร์มินัล?
การคัดลอกรหัสมีดังนี้:
#include <stdio.h>
เป็นโมฆะหลัก (int argc, char* argv [])
-
-
-
โดยวิธีการที่ ARGC นี่คือจำนวนพารามิเตอร์บรรทัดคำสั่งและ argv [] เป็นพารามิเตอร์ต่าง ๆ จากนั้น V8 ยังใช้วิธีการที่คล้ายกันในการเรียกใช้ฟังก์ชันการโทรกลับของ node.js:
การคัดลอกรหัสมีดังนี้: v8Export local <value> v8 :: function :: call (handle <jobick> recv,
int argc,
จับ <ALUE> argv []
-
~~ qaq ติดอยู่ในมือจับ <Ojrop> Recv! - - เขียนต่อไปในวันพรุ่งนี้ -
วันใหม่เริ่มต้นและฉันรู้สึกว่าฉันเต็มไปด้วยความแข็งแกร่ง (∩^o^) ⊃━☆゚.*・。。
หลังจากที่ฉันได้ตรวจสอบในหลาย ๆ ด้าน (segmentfault, stackoverflow และกลุ่ม QQ) ในที่สุดฉันก็แก้ไขความหมายของพารามิเตอร์ทั้งสามของฟังก์ชันข้างต้น
ฉันจะไม่พูดถึงพารามิเตอร์สองตัวสุดท้ายหนึ่งคือจำนวนพารามิเตอร์และอีกพารามิเตอร์และอีกพารามิเตอร์และอีกพารามิเตอร์ สำหรับการจัดการพารามิเตอร์แรก <jobch> Recv คำอธิบายของ Stackoverflow Brother เป็นดังนี้:
มันเหมือนกับที่ใช้ใน JS ใน JS คุณทำ
การคัดลอกรหัสมีดังนี้:
VAR Context = ... ;
cb.apply (บริบท, [... args ... ]);
วัตถุที่ผ่านเป็นอาร์กิวเมนต์แรกจะกลายเป็นสิ่งนี้ภายในขอบเขตฟังก์ชัน เอกสารเพิ่มเติมเกี่ยวกับ MDN หากคุณไม่รู้จัก JS ดีคุณสามารถอ่านเพิ่มเติมเกี่ยวกับ JS ได้ที่นี่: http://unschooled.org/2012/03/understanding-javascript-this/
- ข้อความที่ตัดตอนมาจาก stackoverflow
ในระยะสั้นฟังก์ชั่นของมันคือการระบุตัวชี้นี้กับฟังก์ชั่นที่เรียกว่า การใช้การโทรนี้คล้ายกับ bind (), call () และใช้ () ใน JavaScript
ดังนั้นสิ่งที่เราต้องทำคือการสร้างตารางพารามิเตอร์ก่อนจากนั้นส่งผ่านฟังก์ชั่นการโทรนี้สำหรับการดำเนินการ
ขั้นตอนแรกคือการแสดงฟังก์ชั่นการแปลงเพราะเดิมเป็นประเภทวัตถุ:
local <unction> cb = local <uncdition> :: cast (args [0]);
ขั้นตอนที่สองคือการสร้างตารางพารามิเตอร์ (อาร์เรย์):
local <alues> argv [argc] = {local <value> :: new (string :: new ("Hello World"))};
การโทรครั้งสุดท้ายไปยังซีรี่ส์ฟังก์ชั่น
โทร CB และส่งพารามิเตอร์ใน:
cb-> โทร (บริบท :: getCurrent ()-> global (), 1, argv);
พารามิเตอร์แรกที่นี่บริบทที่นี่ :: getCurrent ()-> global () หมายถึงการได้รับฟังก์ชั่นนี้ของบริบททั่วโลก; พารามิเตอร์ที่สองคือหมายเลขในตารางพารามิเตอร์ (หลังจากทั้งหมดแม้ว่าอาร์เรย์ของ node.js มีแอตทริบิวต์ความยาว แต่จริง ๆ แล้วระบบไม่ทราบความยาวของอาร์เรย์ใน C ++ และคุณต้องผ่านตัวเลขเพื่ออธิบายความยาวของอาร์เรย์); พารามิเตอร์สุดท้ายคือตารางพารามิเตอร์ที่เราเพิ่งสร้างขึ้น
ชุดไฟล์สุดท้ายบทสุดท้าย
ฉันเชื่อว่าทุกคนคุ้นเคยกับขั้นตอนนี้เพียงแค่เขียนฟังก์ชั่นจากนั้นใส่ลงในฟังก์ชั่นการส่งออกและในที่สุดก็ประกาศ
ฉันจะโพสต์รหัสหรือเพียงไปที่เอกสาร Node.js เพื่ออ่าน
การคัดลอกรหัสมีดังนี้:
#include <node.h>
ใช้เนมสเปซ V8;
จับ <AldE> RunCallback (Const อาร์กิวเมนต์ & Args)
-
ขอบเขตของ Handlescope;
local <unction> cb = local <uncdition> :: cast (args [0]);
const argc ที่ไม่ได้ลงนาม = 1;
local <alues> argv [argc] = {local <value> :: new (string :: new ("Hello World"))};
CB-> การโทร (บริบท :: getCurrent ()-> global (), argc, argv);
return scope.close (undefined ());
-
เป็นโมฆะ init (handle <jobick> ส่งออก, จัดการ <Ojrop> โมดูล)
-
โมดูล-> set (string :: newsymbol ("การส่งออก"),
functionTemplate :: ใหม่ (runCallback)-> getFunction ());
-
node_module (addon, init)
ทำได้ดี! ไปตามขั้นตอนสุดท้ายด้วยตัวเอง สำหรับการเรียกใช้ฟังก์ชั่นนี้ใน JS ฉันได้พูดถึงมันมาก่อน
พิเศษ
ฉันรู้สึกว่าบันทึกการศึกษาของฉันกำลังไม่ จำกัด มากขึ้นเรื่อย ๆ และต้องการทำลายพวกเขา ~
หยุดที่นี่วันนี้ ในระหว่างกระบวนการเขียนบันทึกการศึกษาฉันได้เพิ่มท่าทางของฉันอีกครั้งเช่นพารามิเตอร์ความหมายของฟังก์ชันการโทร
หากคุณคิดว่าบันทึกการศึกษาชุดนี้มีประโยชน์สำหรับคุณมาและมีช่วงเวลาที่ดีกับฉัน ~ σ> (〃°°°〃) ♡→