Node.js module.exports เทียบกับการส่งออก

คืออะไรวิธีใช้และวิธีไม่ใช้

(โปรดทราบว่าบทความนี้เขียนขึ้นหลังจากการเผยแพร่ Node.js 6.1.0)

TL; ดร

  • คิดว่า module.exports เป็นตัวแปรที่ได้รับกลับมาจาก require () มันเป็นวัตถุว่างเปล่าโดยค่าเริ่มต้นและสามารถเปลี่ยนเป็นอะไรก็ได้
  • การส่งออก? “ ส่งออก” เองก็ไม่มีวันกลับ!เป็นเพียงการอ้างอิงถึง module.exports; ตัวแปรอำนวยความสะดวกเพื่อช่วยให้ผู้เขียนโมดูลเขียนโค้ดน้อยลง การทำงานกับคุณสมบัตินั้นปลอดภัยและแนะนำ
exports.method = function() {…} 
vs.
module.exports.method = function() {…}

ตัวอย่างโมดูลง่ายๆ

ขั้นแรกเราต้องมีตัวอย่างโค้ดเบส เริ่มต้นด้วยเครื่องคิดเลขง่ายๆ:

การใช้งาน:

ห่อหุ้มโมดูล

Node.js จะรวมโมดูลที่ต้องการ () - ed ไว้ภายในทั้งหมดในตัวห่อฟังก์ชัน:

วัตถุโมดูล

ตัวแปร“ โมดูล ” คือวัตถุที่แสดงถึงโมดูลปัจจุบัน มันเป็นท้องถิ่นเพื่อแต่ละโมดูลและมันยังมีความเป็นส่วนตัว (เฉพาะสามารถเข้าถึงได้จากรหัสโมดูล):

Module.exports

  • เป็นการอ้างอิงวัตถุที่ได้รับกลับมาจากการเรียก require ()
  • มันถูกสร้างขึ้นโดยอัตโนมัติโดย Node.js
  • เป็นเพียงการอ้างอิงถึงวัตถุ JavaScript ธรรมดา
  • นอกจากนี้ยังว่างเปล่าโดยค่าเริ่มต้น (รหัสของเราแนบเมธอด“ add ()” ไว้ด้วย)

มีสองวิธีที่เราสามารถใช้ module.exports:

  1. แนบวิธีการสาธารณะเข้ากับมัน (เหมือนที่เราทำในตัวอย่างเครื่องคิดเลข)
  2. แทนที่มันด้วยวัตถุที่กำหนดเองหรือฟังก์ชั่นของเรา

แทนที่มันทำไม? เมื่อแทนที่เราสามารถส่งคืนอินสแตนซ์ของคลาสอื่น ๆ ได้ตามอำเภอใจ นี่คือตัวอย่างที่เขียนใน ES2015:

ด้านบน "เครื่องคิดเลขฐาน" จะส่งออกคลาส

มาขยายคลาส "เครื่องคิดเลข" และส่งออกอินสแตนซ์ในครั้งนี้:

การใช้งาน:

ส่งออกนามแฝง

  • “ การส่งออก” เป็นเพียงตัวแปรอำนวยความสะดวกเพื่อให้ผู้เขียนโมดูลสามารถเขียนโค้ดได้น้อยลง
  • การทำงานกับคุณสมบัตินั้นปลอดภัยและแนะนำ

    (เช่น: exports.add = function …)

  • การส่งออกจะไม่ถูกส่งกลับโดย require () (module.exports is!)

ตัวอย่างที่ดีและไม่ดีมีดังนี้

หมายเหตุ:เป็นเรื่องปกติที่จะแทนที่ module.exports ด้วยฟังก์ชันหรือวัตถุที่กำหนดเอง หากเราทำเช่นนั้น แต่ยังคงต้องการใช้ชวเลข "การส่งออก" ต่อไป จากนั้น "ส่งออก" จะต้องชี้ไปที่ออบเจ็กต์ที่กำหนดเองใหม่ของเราอีกครั้ง (ทำในโค้ดด้านบนที่บรรทัด 12):

exports = module.exports = {}
exports.method = function() {...}

สรุป

ตัวแปรที่ชื่อการเอ็กซ์พอร์ตที่ไม่ได้ถูกเอ็กซ์พอร์ตทั้งหมดสร้างความสับสนโดยเฉพาะอย่างยิ่งสำหรับผู้มาใหม่ใน Node.js แม้แต่เอกสารอย่างเป็นทางการก็มีความแปลกเล็กน้อยเช่นกัน:

เพื่อเป็นแนวทางหากความสัมพันธ์ระหว่างการเอ็กซ์พอร์ตและ module.exports ดูเหมือนวิเศษสำหรับคุณให้ละเว้นการเอ็กซ์พอร์ตและใช้เฉพาะ module.exports

สิ่งที่ฉันใช้คือรหัสไม่ใช่เวทมนตร์ นักพัฒนาควรแสวงหาความเข้าใจที่ลึกซึ้งยิ่งขึ้นเกี่ยวกับแพลตฟอร์มและภาษาที่พวกเขาใช้ โดยทำเช่นนั้น; โปรแกรมเมอร์ได้รับความเชื่อมั่นและความรู้อันมีค่าซึ่งจะส่งผลในเชิงบวกต่อคุณภาพของโค้ดสถาปัตยกรรมระบบและผลผลิต

ขอบคุณที่อ่านโพสต์ของฉัน ข้อเสนอแนะและความคิดยินดีต้อนรับเสมอในส่วนความคิดเห็น

lazlojuly

บทความที่เกี่ยวข้อง:

  • Node.js module singletons หรือไม่

แหล่งที่มา:

  • เอกสาร Node.js บนโมดูล

ชำระเงินชุดบล็อกใหม่ของฉันเกี่ยวกับการทดสอบหน่วยหน่วย:

จะเริ่มต้นกับการทดสอบหน่วยได้อย่างไร? ส่วนที่ 1

ฉันเดาว่าพวกเราหลายคนอาจเกี่ยวข้องกับสถานการณ์ที่ปรากฎด้านบน

สถานที่ที่การทดสอบหน่วยถือเป็นงานที่น่าเบื่อ medium.com