นับตั้งแต่ก่อตั้งขึ้นไม่มีใครเคยถือว่า JavaScript เป็นภาษาการเขียนโปรแกรม ใน Web 1.0 ERA ภาษาสคริปต์นี้ส่วนใหญ่ใช้สำหรับการตรวจสอบแบบฟอร์มและเอฟเฟกต์พิเศษหน้าเว็บ มันไม่ได้จนกว่า Web 2.0 ERA ที่วิศวกรส่วนหน้าใช้เพื่อปรับปรุงประสบการณ์การใช้งานของผู้ใช้บนหน้าเว็บอย่างมากซึ่ง JS มีคุณค่าอย่างกว้างขวาง เมื่อ JS กลายเป็นที่นิยมมากขึ้นเรื่อย ๆ มันผ่านการเปลี่ยนแปลงในไลบรารีเครื่องมือไลบรารีส่วนประกอบกรอบส่วนหน้าและแอปพลิเคชันส่วนหน้า JavaScript ขาดคุณสมบัติโดยเนื้อแท้: โมดูลและการเกิดขึ้นของข้อกำหนดของ CommonJS ทำขึ้นสำหรับข้อบกพร่องนี้ บทความนี้จะแนะนำข้อกำหนด CommonJS และกลไกโมดูลโหนด
ในภาษาระดับสูงอื่น ๆ Java มีไฟล์คลาส Python มีกลไกการนำเข้าและ PHP ได้รวมและต้องการ วิธีที่ JS แนะนำรหัสผ่านแท็ก <Script> ดูเหมือนยุ่ง ในอดีตผู้คนต้องใช้เนมสเปซและวิธีการอื่น ๆ เพื่อ จำกัด รหัส มันไม่ได้จนกว่าข้อกำหนดของ CommonJS จะปรากฏว่า JavaScript Front-end และ back-end สามารถบรรลุความสามัคคีที่ยิ่งใหญ่ได้ Node Borrows ข้อกำหนดโมดูลของ CommonJS เพื่อใช้ระบบโมดูลที่ใช้งานง่ายมาก
1. ข้อมูลจำเพาะโมดูล CommonJS
ข้อมูลจำเพาะโมดูล CommonJS แบ่งออกเป็น 3 ส่วน:
1). การอ้างอิงโมดูล: แนะนำ API ของโมดูลลงในบริบทปัจจุบันผ่านวิธีการที่ต้องการ () และส่งผ่านในตัวระบุโมดูลเช่น var math = ต้องการ ('คณิตศาสตร์');
2) คำจำกัดความของโมดูล: ส่งออกวิธีการหรือตัวแปรของโมดูลปัจจุบันผ่านวัตถุส่งออก นอกจากนี้ยังมีวัตถุโมดูลในโมดูลและการส่งออกเป็นแอตทริบิวต์ของโมดูล ในโหนดไฟล์เป็นโมดูลและ "ตัวแปรทั่วโลก" ในโมดูลนั้นมองไม่เห็นไปยังโลกภายนอก เฉพาะแอตทริบิวต์ที่ติดตั้งในการส่งออกเป็นสาธารณะเช่น exports.add = function () {}; exports.pi = 3.1415926;
3). Module ID: จริง ๆ แล้วมันเป็นพารามิเตอร์ที่ส่งผ่านไปยังต้องการ () ตัวอย่างเช่น 'คณิตศาสตร์' ที่กล่าวถึงข้างต้นมันจะต้องเป็นสตริงที่สอดคล้องกับระบบการตั้งชื่ออูฐหรือเส้นทางที่สัมพันธ์กันหรือสัมบูรณ์เริ่มต้นด้วย " ".. " มันไม่มีชื่อไฟล์เสริม ".js"
2. กระบวนการใช้งานโมดูลโหนด
ในโหนดโมดูลแบ่งออกเป็นสองประเภท: หนึ่งคือโมดูลหลักที่จัดทำโดยโหนดเองและอีกประเภทหนึ่งคือโมดูลไฟล์ที่เขียนโดยผู้ใช้เอง โมดูลหลักบางส่วนจะรวบรวมไว้ในไฟล์ไบนารีในระหว่างการรวบรวมซอร์สโค้ดโหนด เมื่อโหนดเริ่มต้นโมดูลหลักจะถูกโหลดลงในหน่วยความจำโดยตรงดังนั้นความเร็วในการโหลดจึงเร็วที่สุด โมดูลไฟล์ถูกโหลดแบบไดนามิกที่รันไทม์และต้องใช้สามขั้นตอน: การวิเคราะห์เส้นทางตำแหน่งไฟล์และการรวบรวมและการดำเนินการ โปรดทราบว่าแคชโหนดแนะนำโมดูลเพื่อลดค่าใช้จ่ายในระหว่างการแนะนำรองและใช้กลยุทธ์ที่ต้องการมากที่สุดสำหรับการโหลดรองของโมดูลเดียวกัน
2.1 การวิเคราะห์เส้นทาง
การวิเคราะห์เส้นทางส่วนใหญ่วิเคราะห์ตัวระบุโมดูลที่กล่าวถึงข้างต้นซึ่งส่วนใหญ่แบ่งออกเป็นหมวดหมู่ต่อไปนี้:
1) โมดูลหลักเช่น HTTP, FS, PATH และอื่น ๆ
2) โมดูลไฟล์พา ธ สัมพัทธ์เริ่มต้นด้วย หรือ .
3) โมดูลไฟล์ Path Absolute เริ่มต้นด้วย /
4) โมดูลไฟล์ที่กำหนดเองซึ่งอาจอยู่ในรูปแบบของไฟล์หรือแพ็คเกจ โหนดจะพยายามค้นหาไฟล์เป้าหมายทีละหนึ่งตามโมดูลพา ธ อาร์เรย์โมดูลพา ธ มักตามไดเรกทอรีปัจจุบันทีละขั้นตอนจนกระทั่งไดเรกทอรีรูทมองหาไดเรกทอรีที่ชื่อว่า Node_Modules ดังนั้นนี่เป็นวิธีที่ใช้เวลามากที่สุดในการค้นหา
2.2 ตำแหน่งไฟล์
จากการวิเคราะห์เส้นทางรายละเอียดต่อไปนี้จะต้องให้ความสนใจกับ:
1) การวิเคราะห์ส่วนขยายไฟล์: เนื่องจากข้อกำหนดของ CommonJS อนุญาตให้ตัวระบุโมดูลไม่ถูกกรอกข้อมูลโหนดจะพยายามตามลำดับของ. js, .json และ. node
2) การวิเคราะห์และแพคเกจไดเรกทอรี: หากไม่พบไฟล์ที่เกี่ยวข้องหลังจากการวิเคราะห์ส่วนขยายไฟล์ข้างต้น แต่ได้รับไดเรกทอรีโหนดจะถือว่าไดเรกทอรีเป็นแพ็คเกจ
2.3 การรวบรวมและดำเนินการ
หลังจากค้นหาไฟล์เฉพาะโหนดจะสร้างวัตถุโมดูลใหม่โหลดและรวบรวมตามเส้นทาง สำหรับส่วนขยายที่แตกต่างกันวิธีการโหลดนั้นแตกต่างกัน:
1) ไฟล์. JS: อ่านไฟล์แบบซิงโครนัสผ่านโมดูล FS และคอมไพล์และดำเนินการ
2) .node file: นี่คือไฟล์ส่วนขยายที่เขียนใน C/C ++, โหลดผ่านวิธี dlopen ()
3) ไฟล์. json: อ่านไฟล์แบบซิงโครนัสผ่านโมดูล FS และใช้ json.parse () เพื่อแยกวิเคราะห์และส่งคืนผลลัพธ์
4) ไฟล์ส่วนขยายอื่น ๆ : พวกเขาโหลดเป็นไฟล์. js
เรารู้ว่าแต่ละไฟล์โมดูลมีตัวแปรสามตัว: ต้องการการส่งออกและโมดูลตามค่าเริ่มต้น แม้ในเอกสารโหนด API เรารู้ว่าแต่ละโมดูลยังมีตัวแปรสองตัว: ชื่อไฟล์และชื่อ Dirname พวกเขามาจากไหน? โมดูลโหนดบรรลุผลอย่างไรว่า "ตัวแปรทั่วโลก" ที่ประกาศจะไม่ก่อให้เกิดมลพิษในโมดูลอื่น ๆ ? ในความเป็นจริงโหนดจะห่อเนื้อหาไฟล์ในตอนต้นและสิ้นสุดระหว่างการรวบรวมโมดูล JS นี่คือตัวอย่างของไฟล์ JS ที่ถูกห่อหุ้มด้วยหัวและหาง:
การคัดลอกรหัสมีดังนี้:
(ฟังก์ชั่น (การส่งออก, ต้องการ, โมดูล, __filename, __dirName) {
/* ตรงกลางเป็นเนื้อหาจริงของไฟล์ JS*/
var math = ต้องการ ('คณิตศาสตร์');
exports.area = ฟังก์ชั่น (รัศมี) {
Return Math.pi * Radius * Radius;
-
/* เนื้อหาจริงของไฟล์ JS สิ้นสุดลง*/
-
ด้วยวิธีนี้ไฟล์แต่ละโมดูลจะถูกแยกขอบเขตและตัวแปรเช่นต้องการการส่งออกโมดูล ฯลฯ จะถูกฉีดเข้าไปในบริบทของโมดูล นี่คือการใช้งานข้อกำหนดโมดูล CommonJS ของโหนด กระบวนการรวบรวมโมดูล C/C ++ และโมดูลโหนด Core นั้นค่อนข้างซับซ้อนดังนั้นฉันจะไม่ทำซ้ำอีก
3. สแต็กการโทรของโมดูล
มีความจำเป็นที่จะต้องชี้แจงความสัมพันธ์การโทรของโมดูลต่างๆในโหนดดังแสดงในรูปด้านล่าง:
โมดูลในตัวของ C/C ++ เป็นโมดูลระดับต่ำสุดและเป็นของโมดูลหลัก ส่วนใหญ่จะให้ APIs เพื่อเรียกโมดูลหลัก JavaScript และโมดูลไฟล์ JavaScript ของบุคคลที่สาม ในความเป็นจริงแทบจะไม่มีการติดต่อกับโมดูลดังกล่าว มีความรับผิดชอบหลักสองประการของโมดูลหลัก JavaScript: หนึ่งคือการทำหน้าที่เป็นเลเยอร์การห่อหุ้มและเลเยอร์การเชื่อมโยงของโมดูลในตัวของ C/C ++ สำหรับการเรียกโมดูลไฟล์และอื่น ๆ เป็นโมดูลการทำงานบริสุทธิ์ที่ไม่จำเป็นต้องจัดการกับเลเยอร์พื้นฐาน โมดูลไฟล์มักจะเขียนโดยบุคคลที่สามรวมถึงโมดูล JavaScript ทั่วไปและโมดูลส่วนขยาย C/C ++
4. แพ็คเกจและ NPM
4.1 โครงสร้างแพ็คเกจ
แพ็คเกจนี้เป็นไฟล์เก็บถาวร (โดยปกติคือ. zip หรือ. tar.gz) ซึ่งถูกบีบอัดและคืนสู่ไดเรกทอรีหลังจากการติดตั้ง ข้อมูลจำเพาะแพ็คเกจ CommonJS ประกอบด้วยสองส่วน: โครงสร้างแพ็คเกจและแพ็คเกจคำอธิบายไฟล์ โครงสร้างแพ็คเกจที่สอดคล้องกับข้อกำหนด CommonJS ควรมีไฟล์ต่อไปนี้:
1) .package.json: แพ็คเกจคำอธิบายไฟล์
2) .bin: ไดเรกทอรีที่เก็บไฟล์ไบนารีที่เรียกใช้งานได้
3) .LIB: ไดเรกทอรีที่เก็บรหัส JavaScript
4) .doc: ไดเรกทอรีที่จัดเก็บเอกสาร
5). -test: ไดเรกทอรีที่เก็บกรณีทดสอบหน่วย
4.2 แพ็คเกจคำอธิบายไฟล์
ไฟล์คำอธิบายแพ็คเกจเป็นไฟล์ JSON - package.json ซึ่งอยู่ในไดเรกทอรีรูทของแพ็คเกจเป็นส่วนสำคัญของแพ็คเกจและใช้เพื่ออธิบายข้อมูลภาพรวมของแพ็คเกจ พฤติกรรมทั้งหมดของ NPMs ที่จะกล่าวถึงในภายหลังเกี่ยวข้องอย่างใกล้ชิดกับฟิลด์ของไฟล์นี้ ด้านล่างเราจะใช้ไฟล์ package.json ของโครงการ Web Framework Express ที่รู้จักกันดีเป็นตัวอย่างเพื่อแสดงความหมายของฟิลด์ที่ใช้กันทั่วไป
1) .name: ชื่อแพ็คเกจ
2). คำอธิบาย: การแนะนำแพ็คเกจ
3) .Version: หมายเลขเวอร์ชันต้องปฏิบัติตาม "การควบคุมเวอร์ชันความหมาย" โปรดดูที่ http://semver.org/
4). การพึ่งพาอาศัยกัน: ใช้รายการแพ็คเกจที่แพ็คเกจปัจจุบันต้องพึ่งพา สถานที่ให้บริการนี้มีความสำคัญมาก NPM จะโหลดแพ็คเกจที่พึ่งพาผ่านคุณสมบัตินี้โดยอัตโนมัติ
5). Repositories: รายการสถานที่สำหรับโฮสติ้งซอร์สโค้ด
การใช้ฟิลด์อื่น ๆ สามารถส่งต่อไปยังแพ็คเกจ npm คำอธิบาย json คำอธิบาย
4.3 ฟังก์ชั่นทั่วไปของ NPM
NPM (Node Package Manager) หรือที่รู้จักกันทั่วไปว่าเป็นตัวจัดการแพ็คเกจโหนด ฟังก์ชั่นหลักของมันคือการจัดการแพ็คเกจโหนดรวมถึง: การติดตั้ง, ถอนการติดตั้ง, อัปเดต, ดู, ค้นหา, การเผยแพร่ ฯลฯ
4.3.1 การติดตั้งแพ็คเกจ NPM
การติดตั้งแพ็คเกจโหนดมีสองประเภท: การติดตั้งในท้องถิ่นและการติดตั้งทั่วโลก ความแตกต่างระหว่างทั้งสองมีดังนี้:
1). การติดตั้งในพื้นที่ NPM ติดตั้ง <Packagping-Name>: แพ็คเกจจะถูกดาวน์โหลดไปยังไดเรกทอรีปัจจุบันและสามารถใช้งานได้ในไดเรกทอรีปัจจุบันเท่านั้น
2). การติดตั้งทั่วโลก NPM ติดตั้ง -g <packagple-name>: แพ็คเกจจะถูกดาวน์โหลดไปยังไดเรกทอรีระบบเฉพาะและแพ็คเกจที่ติดตั้งสามารถใช้ในไดเรกทอรีทั้งหมด
4.3.2 การจัดการแพ็คเกจ NPM
ต่อไปนี้เป็นรายการของคำสั่งการจัดการแพ็คเกจที่ใช้กันทั่วไปโดยใช้ Grunt-CLI (เครื่องมือบรรทัดคำสั่ง Grunt) เป็นตัวอย่าง:
1) .npm ติดตั้ง: ติดตั้งแพ็คเกจทั้งหมดที่ประกาศโดยฟิลด์การพึ่งพาและฟิลด์ devdependencies ของไฟล์ package.json
2) .npm ติดตั้ง [email protected]: ติดตั้ง Grunt-Cli เวอร์ชันเฉพาะ
3) .npm ติดตั้ง Grunt-Contrib-Copy-Save: ติดตั้ง Grunt-Contrib-Copy และบันทึกการพึ่งพาไฟล์ package.json
4) .npm ถอนการติดตั้ง Grunt-cli: ถอนการติดตั้งแพ็คเกจ
5) .npm รายการ: ตรวจสอบว่ามีการติดตั้งแพ็คเกจใด
6) .npm เผยแพร่ <Folder>: เผยแพร่แพ็คเกจ