Node.js เป็นภาษาแบ็กเอนด์ที่เกิดขึ้นใหม่ที่ออกแบบมาเพื่อช่วยให้โปรแกรมเมอร์สร้างแอปพลิเคชันที่ปรับขนาดได้อย่างรวดเร็ว Node.js มีคุณสมบัติที่น่าสนใจมากมายและมีรายงานมากมายเกี่ยวกับเรื่องนี้ บทความนี้จะวิเคราะห์และหารือเกี่ยวกับคุณสมบัติของ Eventemitter สตรีมสไตล์การเข้ารหัสรูปแบบการเข้ารหัสรูปแบบการเข้ารหัสและอื่น ๆ เพื่อช่วยให้ผู้ใช้มีความเข้าใจที่ลึกซึ้งยิ่งขึ้นเกี่ยวกับ Node.js.
ในฐานะที่เป็นแพลตฟอร์มที่สร้างขึ้นบนรันไทม์ Chrome JavaScript ความเข้าใจที่เกี่ยวข้องของเราเกี่ยวกับ JavaScript ดูเหมือนจะใช้ได้กับแอปพลิเคชันโหนด หากไม่มีการขยายภาษาเพิ่มเติมหรือการดัดแปลงเราสามารถใช้ประสบการณ์การเขียนโปรแกรมส่วนหน้าในการเขียนโปรแกรมแบ็คเอนด์
Eventemitter (ผู้ส่งเหตุการณ์)
ก่อนอื่นคุณควรเข้าใจโมเดล Eventemitter มันสามารถส่งเหตุการณ์เช่นเดียวกับเหตุการณ์ที่จะให้ความสนใจกับผู้บริโภค เราสามารถคิดว่ามันเป็นส่วนขยายของรูปแบบการโทรกลับเป็นฟังก์ชันอะซิงโครนัส โดยเฉพาะอย่างยิ่ง Eventemitter จะมีข้อได้เปรียบมากขึ้นเมื่อจำเป็นต้องมีการเรียกกลับหลายครั้ง
ตัวอย่างเช่นผู้โทรส่งคำขอ "ไฟล์รายการ" ไปยังเซิร์ฟเวอร์ระยะไกล คุณอาจต้องการจัดกลุ่มผลลัพธ์ที่ส่งคืนและทำการโทรกลับสำหรับแต่ละกลุ่ม โมเดล Eventemitter ช่วยให้คุณสามารถส่งการเรียกกลับ "ไฟล์" ในแต่ละกลุ่มและดำเนินการประมวลผล "สิ้นสุด" เมื่อการดำเนินการทั้งหมดเสร็จสิ้น
เมื่อใช้ Eventemitter เพียงตั้งค่าเหตุการณ์และพารามิเตอร์ที่เกี่ยวข้อง
การคัดลอกรหัสมีดังนี้:
var eventemitter = ต้องการ ('เหตุการณ์') Eventemitter;
var util = ต้องการ ('util');
ฟังก์ชั่น myclass () {
if (! (อินสแตนซ์นี้ของ myClass)) ส่งคืน myClass ใหม่ ();
Eventemitter.call (นี่);
var self = this;
settimeout (ฟังก์ชั่น timeoutcb () {
Self.emit ('MyEvent', 'Hello World', 42);
}, 1,000);
-
util.inherits (myclass, eventemitter);
ตัวสร้าง MyClass สร้างทริกเกอร์เวลาด้วยการหน่วงเวลาทริกเกอร์ 1S และเหตุการณ์ทริกเกอร์ของ MyEvent ในการใช้กิจกรรมที่เกี่ยวข้องคุณต้องดำเนินการวิธี ON ():
การคัดลอกรหัสมีดังนี้:
var myobj = new myclass ();
var start = date.now ();
myobj.on ('myEvent', ฟังก์ชั่น myEventCB (str, num) {
console.log ('myevent triggered', str, num, date.now () - เริ่มต้น);
-
ควรสังเกตที่นี่ว่าถึงแม้ว่าเหตุการณ์ Eventemitter ที่สมัครเป็นเหตุการณ์แบบอะซิงโครนัสเมื่อเวลาทริกเกอร์การกระทำของผู้ฟังจะถูกซิงโครไนซ์ ดังนั้นหากเหตุการณ์ MyEvent ข้างต้นมีผู้ฟัง 10 คนผู้ฟังทุกคนจะถูกเรียกตามลำดับโดยไม่ต้องรอการวนรอบเหตุการณ์
หาก subclass ของ Eventemitter สร้างเหตุการณ์ EMIT ('ข้อผิดพลาด') แต่ไม่มีผู้ฟังที่สมัครสมาชิกคลาส Eventemitter Base จะทำการยกเว้นทำให้เกิดเหตุการณ์ Uncaughtexception ที่จะถูกเรียกใช้เมื่อวัตถุกระบวนการถูกดำเนินการ
เวอเรอร์
Verror เป็นส่วนขยายของข้อผิดพลาดคลาสพื้นฐานซึ่งช่วยให้เราสามารถกำหนดข้อความเอาต์พุตโดยใช้รูปแบบอักขระ printf
ลำธาร
หากมีไฟล์ขนาดใหญ่มากที่ต้องประมวลผลวิธีการในอุดมคติควรอ่านส่วนและเขียนชิ้นส่วน ไม่ว่าไฟล์จะใหญ่แค่ไหนมันจะถูกประมวลผลเสมอตราบเท่าที่เวลาอนุญาต สิ่งนี้ต้องการแนวคิดของการสตรีม สตรีมเป็นอีกรุ่นที่ใช้กันอย่างแพร่หลายในโหนดในโหนดการใช้งาน Eventemitter ให้อินเทอร์เฟซที่อ่านง่ายเขียนหรือเต็มรูปแบบ มันเป็นอินเทอร์เฟซนามธรรมและกิจกรรมการดำเนินการปกติที่มีให้รวมถึง: อ่านได้, เขียน, ระบาย, ข้อมูล, สิ้นสุดและปิด หากเราสามารถใช้ท่อเพื่อรวมเหตุการณ์เหล่านี้ได้อย่างมีประสิทธิภาพจะมีการโต้ตอบที่มีประสิทธิภาพมากขึ้น
โดยใช้. pipe () หมายเหตุสามารถสื่อสารกับแรงดันกลับผ่านไปป์ไลน์ ความดันย้อนกลับหมายถึง: เฉพาะผู้ที่สามารถเขียนได้หรือเฉพาะผู้ที่สามารถอ่านได้
ตัวอย่างเช่นตอนนี้เราส่งข้อมูลจาก stdin ไปยังไฟล์ท้องถิ่นและเซิร์ฟเวอร์ระยะไกล:
การคัดลอกรหัสมีดังนี้:
var fs = ต้องการ ('fs');
var net = ต้องการ ('net');
var localfile = fs.createwritestream ('localfile.tmp');
Net.Connect ('2555.255.255.255', 12345, ฟังก์ชั่น (ไคลเอนต์) {
process.stdin.pipe (ไคลเอนต์);
process.stdin.pipe (localfile);
-
และถ้าเราต้องการส่งข้อมูลไปยังไฟล์ท้องถิ่นและต้องการใช้ gunzip เพื่อบีบอัดสตรีมนี้เราสามารถทำได้:
การคัดลอกรหัสมีดังนี้:
var fs = ต้องการ ('fs');
var zlib = ต้องการ ('zlib');
process.stdin.pipe (zlib.creategunzip ()). ท่อ (fs.createwritestream ('localfile.tar'));
หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับสตรีมโปรดคลิกที่นี่
กระแสควบคุม (การควบคุมกระบวนการ)
เนื่องจาก JS มีแนวคิดการใช้งานเช่นวัตถุชั้นหนึ่งการปิด ฯลฯ จึงเป็นไปได้ที่จะกำหนดสิทธิ์การโทรกลับได้อย่างง่ายดาย สิ่งนี้สะดวกมากเมื่อสร้างต้นแบบและสามารถรวมการอนุญาตเชิงตรรกะตามความต้องการ แต่มันเป็นเรื่องง่ายที่จะใช้ฟังก์ชั่นในตัวที่เงอะงะ
ตัวอย่างเช่นเราต้องการอ่านชุดไฟล์ตามลำดับจากนั้นทำงาน:
การคัดลอกรหัสมีดังนี้:
fs.readfile ('firstfile', 'utf8', ฟังก์ชั่น firstcb (err, firstfile) {
Dosomething (FirstFile);
fs.ReadFile ('SecondFile', 'UTF8', ฟังก์ชั่น SecondCB (ERR, SecondFile) {
Dosomething (FileDfile);
fs.ReadFile ('thirdFile', 'UTF8', ฟังก์ชั่น thirdCB (ERR, FILLDFILE) {
Dosomething (FirldFile);
-
-
-
ปัญหาเกี่ยวกับรูปแบบนี้คือ:
1. ตรรกะของรหัสเหล่านี้กระจัดกระจายและไม่เป็นระเบียบและกระบวนการปฏิบัติการที่เกี่ยวข้องนั้นยากที่จะเข้าใจ
2. ไม่มีการจัดการข้อผิดพลาดหรือข้อยกเว้น
3. การรั่วไหลของหน่วยความจำปิดใน JS เป็นเรื่องธรรมดาและยากที่จะวินิจฉัยและตรวจจับ
หากเราต้องการดำเนินการชุดของการดำเนินการแบบอะซิงโครนัสในชุดอินพุตการใช้ไลบรารีควบคุมกระบวนการเป็นตัวเลือกที่ชาญฉลาด Vasync ใช้ที่นี่
Vasync เป็นห้องสมุดควบคุมกระบวนการที่มีความคิดมาจากการดำเนินงานแบบอะซิงโครนัส สิ่งที่ทำให้มันพิเศษคือช่วยให้ผู้บริโภคดูและสังเกตกระบวนการงานบางอย่าง ข้อมูลนี้มีประโยชน์มากสำหรับการศึกษากระบวนการของข้อผิดพลาดบางอย่าง
รูปแบบการเข้ารหัส (สไตล์การเขียนโปรแกรม)
รูปแบบการเขียนโปรแกรมเป็นหัวข้อที่ถกเถียงกันมากที่สุดเพราะมักจะเป็นแบบไม่เป็นทางการ ทุกคนมีความชอบของตัวเอง เป็นสิ่งสำคัญที่จะต้องหาสไตล์ที่เหมาะกับบุคคลและทีม มรดกดั้งเดิมบางอย่างอาจทำให้การพัฒนาโหนดเป็นสถานที่ที่ดีกว่า
1. ตั้งชื่อฟังก์ชัน
2. พยายามตั้งชื่อฟังก์ชั่นทั้งหมด
3. หลีกเลี่ยงการปิด
4. อย่ากำหนดฟังก์ชั่นอื่น ๆ ในฟังก์ชั่นที่แน่นอน สิ่งนี้จะช่วยลดอุบัติเหตุรั่วไหลของหน่วยความจำปิดที่ไม่คาดคิด
5. ฟังก์ชั่นมากขึ้นและเล็กลง
แม้ว่า V8 JIT จะเป็นเครื่องยนต์ที่ทรงพลัง แต่ฟังก์ชั่นที่เล็กกว่าและทินเนอร์จะรวมกับ V8 ได้ดีขึ้น นอกจากนี้หากฟังก์ชั่นของเรามีขนาดเล็กและยอดเยี่ยม (ประมาณ 100 บรรทัด) เราจะขอบคุณตัวเองเมื่ออ่านและดูแลรักษาตัวเอง
ตรวจสอบสไตล์แบบโปรแกรม: รักษาสไตล์ความสอดคล้องและใช้เครื่องมือตรวจสอบเพื่อปรับปรุง เรากำลังใช้ JSStyle
ผ้าสำลี (ตรวจสอบรหัส)
เครื่องมือผ้าสำลีสามารถทำการวิเคราะห์รหัสแบบคงที่โดยไม่ต้องรันตรวจสอบข้อผิดพลาดและความเสี่ยงที่อาจเกิดขึ้นเช่นคำสั่งเบรกที่หายไปในกรณีที่ Witch ผ้าสำลีไม่ได้เทียบเท่ากับการตรวจสอบสไตล์เท่านั้น แต่มีจุดมุ่งหมายในการวิเคราะห์ความเสี่ยงตามวัตถุประสงค์มากกว่าตัวเลือกสไตล์อัตนัย เราใช้ JavaScriptlint ซึ่งมีรายการตรวจสอบที่หลากหลาย
การบันทึก (การบันทึก)
เมื่อเรากำลังเขียนโปรแกรมและการเข้ารหัสเราต้องมีวิสัยทัศน์ระยะยาว โดยเฉพาะอย่างยิ่งพิจารณาเครื่องมือที่ใช้สำหรับการดีบัก ขั้นตอนแรกที่ยอดเยี่ยมคือการทำการบันทึกที่มีประสิทธิภาพ เราจำเป็นต้องระบุข้อมูลและดูสิ่งที่ได้รับความสนใจเป็นพิเศษในระหว่างการดีบักและสิ่งที่ใช้สำหรับการวิเคราะห์และการวิจัยที่รันไทม์ ขอแนะนำให้ใช้ Bunyan ซึ่งเป็นไลบรารีการบันทึก Node.js โดยตรงและรูปแบบเอาต์พุตข้อมูลคือ JSON สำหรับข้อมูลเพิ่มเติมโปรดคลิกที่นี่
เซิร์ฟเวอร์ไคลเอนต์
หากแอปพลิเคชันมีความสามารถในการประมวลผลแบบกระจายมันจะน่าสนใจยิ่งขึ้นในตลาด อินเทอร์เฟซที่คล้ายกันสามารถอธิบายได้โดยใช้ HTTP RESTFUL API หรือ TCP JSON ดั้งเดิม สิ่งนี้ช่วยให้นักพัฒนาสามารถรวมประสบการณ์บนโหนดกับสภาพแวดล้อมเครือข่ายแบบอะซิงโครนัสรวมถึงการใช้สตรีมกับระบบแบบกระจายและปรับขนาดได้
เครื่องมือทั่วไป:
1. RETIFY
พูดง่ายๆคือเครื่องมือสำหรับการสร้างบริการพักผ่อน ให้การสนับสนุนการดูและการดีบักที่ดีในขณะที่สนับสนุน Bunyan และ Dtrace
2. เร็ว
Fast เป็นเครื่องมือที่มีน้ำหนักเบาที่ใช้ TCP เพื่อประมวลผลข้อความ JSON มีการสนับสนุน DTRACE ซึ่งช่วยให้เราสามารถระบุคุณสมบัติประสิทธิภาพของไคลเอนต์เซิร์ฟเวอร์ได้อย่างรวดเร็ว
3. เวิร์กโฟลว์
เวิร์กโฟลว์ถูกสร้างขึ้นบน RESTIFY และสามารถกำหนดกระบวนการทางธุรกิจสำหรับชุดบริการระยะไกลและ APIs ตัวอย่างเช่น: สถานะข้อผิดพลาดการหมดเวลาการเชื่อมต่อการประมวลผลความแออัด ฯลฯ