การโหลดโมดูลและการดำเนินการถูกห่อหุ้มด้วย node.js เพื่อให้ตัวแปรในไฟล์โมดูลอยู่ในการปิดและจะไม่ทำให้ตัวแปรทั่วโลกและขัดแย้งกับผู้อื่น
โมดูลส่วนหน้ามักจะเป็นโมดูลที่เรานักพัฒนาวางรหัสโมดูลในการปิดเพื่อหลีกเลี่ยงความขัดแย้งกับผู้อื่น
วิธีการห่อหุ้มโมดูลที่พบได้ทั่วไปกับ node.js และ front-end เราสามารถอ้างถึงการใช้งานของ Underscore.js มันเป็นโมดูลฟังก์ชันการทำงานที่พบได้ทั่วไปกับ node.js และ front-end ตรวจสอบรหัส:
การคัดลอกรหัสมีดังนี้:
// สร้างการอ้างอิงที่ปลอดภัยไปยังวัตถุขีดล่างสำหรับใช้ด้านล่าง
var _ = ฟังก์ชั่น (obj) {
ถ้า (OBJ instanceof _) ส่งคืน OBJ;
if (! (อินสแตนซ์นี้ _)) ส่งคืนใหม่ _ (obj);
this._wrapped = obj;
-
// ส่งออกวัตถุขีดล่างสำหรับ ** node.js ** ด้วย
// เข้ากันได้กับความเข้ากันได้แบบเก่าสำหรับ `ต้องการ ()` api ถ้าเราอยู่ใน
// เบราว์เซอร์เพิ่ม `_` เป็นวัตถุทั่วโลกผ่านตัวระบุสตริง
// สำหรับการปิดคอมไพเลอร์ "โหมดขั้นสูง"
if (typeof exports! == 'undefined') {
if (typeof module! == 'undefined' && module.exports) {
การส่งออก = module.exports = _;
-
ส่งออก _ = _;
} อื่น {
root._ = _;
-
ตัดสินใจที่จะกำหนดตัวแปรท้องถิ่น _ เพื่อส่งออกโดยการตัดสินว่ามีการส่งออกหรือไม่ซึ่งสามารถย้อนหลังเข้ากันได้กับ reged เก่า () API หากอยู่ในเบราว์เซอร์ตัวระบุสตริง "_" จะถูกใช้เป็นวัตถุทั่วโลก การปิดที่สมบูรณ์มีดังนี้:
การคัดลอกรหัสมีดังนี้:
(การทำงาน() {
// การตั้งค่าพื้นฐาน
-
// สร้างวัตถุรูท `หน้าต่าง 'ในเบราว์เซอร์หรือ` การส่งออก' บนเซิร์ฟเวอร์
var root = this;
// สร้างการอ้างอิงที่ปลอดภัยไปยังวัตถุขีดล่างสำหรับใช้ด้านล่าง
var _ = ฟังก์ชั่น (obj) {
ถ้า (OBJ instanceof _) ส่งคืน OBJ;
if (! (อินสแตนซ์นี้ _)) ส่งคืนใหม่ _ (obj);
this._wrapped = obj;
-
// ส่งออกวัตถุขีดล่างสำหรับ ** node.js ** ด้วย
// เข้ากันได้กับความเข้ากันได้แบบเก่าสำหรับ `ต้องการ ()` api ถ้าเราอยู่ใน
// เบราว์เซอร์เพิ่ม `_` เป็นวัตถุทั่วโลกผ่านตัวระบุสตริง
// สำหรับการปิดคอมไพเลอร์ "โหมดขั้นสูง"
if (typeof exports! == 'undefined') {
if (typeof module! == 'undefined' && module.exports) {
การส่งออก = module.exports = _;
-
ส่งออก _ = _;
} อื่น {
root._ = _;
-
}). การโทร (นี้);
การปิดถูกสร้างขึ้นผ่านนิยามฟังก์ชั่นและการโทร (นี่) คือการเรียกใช้ฟังก์ชันภายใต้วัตถุนี้เพื่อหลีกเลี่ยงตัวแปรภายในที่ปนเปื้อนเข้าสู่ขอบเขตส่วนกลาง ในเบราว์เซอร์สิ่งนี้ชี้ไปที่วัตถุทั่วโลก (วัตถุหน้าต่าง) การกำหนดตัวแปร "_" ให้กับรูท "_" ไปยังรูท "_" สำหรับการโทรภายนอก
lo-dash คล้ายกับ underscore.js ยังใช้โซลูชันที่คล้ายกัน แต่เข้ากันได้กับการโหลดโมดูล AMD:
การคัดลอกรหัสมีดังนี้:
;(การทำงาน() {
/** ใช้เป็นข้อมูลอ้างอิงที่ปลอดภัยสำหรับ `undefined` ในสภาพแวดล้อม pre ES5*//
var undefined;
/** ใช้เพื่อตรวจสอบว่าค่าเป็นของวัตถุประเภทภาษา*/
var objectTypes = {
'บูลีน': เท็จ
'ฟังก์ชั่น': จริง
'วัตถุ': จริง
'หมายเลข': เท็จ
'สตริง': เท็จ
'ไม่ได้กำหนด': เท็จ
-
/** ใช้เป็นข้อมูลอ้างอิงไปยังวัตถุทั่วโลก*//
var root = (ObjectTypes [หน้าต่าง typeof] && หน้าต่าง) || นี้;
/** ตรวจจับตัวแปรฟรี `exports`*/
var freeExports = ObjectTypes [typeof exports] && Exports &&! exports.nodeType && Exports;
/** ตรวจจับตัวแปรฟรี `module`*/
var freemodule = ObjectTypes [module typeof] && โมดูล &&! module.nodeType && โมดูล;
/** ตรวจจับส่วนขยาย Commonjs ที่เป็นที่นิยม `module.exports`*//
var moduleExports = freemodule && freemodule.exports === freeExports && freeExports;
-
// เปิดเผย lo-dash
var _ = runinContext ();
// AMD Build Optimizers เช่น R.JS ตรวจสอบรูปแบบเงื่อนไขดังต่อไปนี้:
if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
// เปิดเผย lo-dash ไปยังวัตถุทั่วโลกแม้ว่าจะมีตัวโหลด AMD อยู่ใน
// case lo-dash ถูกฉีดด้วยสคริปต์บุคคลที่สามและไม่ได้ตั้งใจจะเป็น
// โหลดเป็นโมดูล การมอบหมายทั่วโลกสามารถเปลี่ยนกลับได้ใน lo-dash
// โมดูลโดยวิธี `noconflict ()`
root._ = _;
// กำหนดเป็นโมดูลที่ไม่ระบุชื่อดังนั้นผ่านการแมปเส้นทางก็สามารถเป็นได้
// อ้างอิงเป็นโมดูล "ขีดล่าง"
กำหนด (ฟังก์ชัน () {
กลับ _;
-
-
// ตรวจสอบ `การส่งออก 'หลังจาก` define` ในกรณีที่เครื่องมือเพิ่มประสิทธิภาพการสร้างเพิ่มวัตถุ `การส่งออก'
อื่นถ้า (freeexports && freemodule) {
// ใน node.js หรือ ringojs
if (moduleexports) {
(freemodule.exports = _) ._ = _;
-
// ใน Narwhal หรือ Rhino -require
อื่น {
freeexports._ = _;
-
-
อื่น {
// ในเบราว์เซอร์หรือแรด
root._ = _;
-
} .CALL (นี่));
ลองมาดูรหัสหลักของช่วงเวลาการปิดการห่อหุ้ม js:
การคัดลอกรหัสมีดังนี้:
(ฟังก์ชั่น (ไม่ได้กำหนด) {
ช่วงเวลา var;
// ตรวจสอบ nodejs
var hasmodule = (โมดูล typeof! == 'undefined' && module.exports);
-
ช่วงเวลาที่เปิดเผย
-
ฟังก์ชั่น makeglobal (ไร้เดียงสา) {
var warned = false, local_moment = moment;
/ *Global Ender: False */
if (typeof ender! == 'undefined') {
กลับ;
-
// ที่นี่ `นี่หมายถึง` window 'ในเบราว์เซอร์หรือ `global` บนเซิร์ฟเวอร์
// เพิ่ม `moment` เป็นวัตถุส่วนกลางผ่านตัวระบุสตริง
// สำหรับการปิดคอมไพเลอร์ "โหมดขั้นสูง"
if (ไร้เดียงสา) {
this.moment = function () {
ถ้า (! เตือน && คอนโซล && console.warn) {
เตือน = จริง;
console.warn (
"การเข้าถึงช่วงเวลาผ่านขอบเขตทั่วโลกคือ" +
"เลิกใช้แล้วและจะถูกลบออกใน" +
"ปล่อย.");
-
ส่งคืน local_moment.apply (null, อาร์กิวเมนต์);
-
} อื่น {
['moment'] = ช่วงเวลา;
-
-
// โมดูล CommonJS ถูกกำหนดไว้
ถ้า (hasmodule) {
module.exports = moment;
Makeglobal (จริง);
} อื่นถ้า (typeof define === "function" && define.amd) {
กำหนด ("ช่วงเวลา", ฟังก์ชั่น (ต้องการ, ส่งออก, โมดูล) {
if (module.config (). noglobal! == true) {
// หากผู้ใช้ให้ Noglobal เขาตระหนักถึงระดับโลก
Makeglobal (module.config (). noglobal === undefined);
-
ช่วงเวลากลับ;
-
} อื่น {
Makeglobal ();
-
}). การโทร (นี้);
ดังที่เห็นได้จากตัวอย่างข้างต้นเมื่อห่อหุ้มโมดูลที่พบได้ทั่วไปกับ node.js และ front-end สามารถใช้ตรรกะต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
if (typeof exports! == "undefined") {
การส่งออก ** = **;
} อื่น {
นี่ ** = **;
-
นั่นคือถ้าวัตถุส่งออกมีอยู่ตัวแปรท้องถิ่นจะถูกโหลดบนวัตถุส่งออกและหากไม่มีอยู่มันจะถูกโหลดบนวัตถุทั่วโลก หากมีการเพิ่มความเข้ากันได้ของข้อกำหนด ADM ให้เพิ่มอีกหนึ่งประโยคเพื่อตัดสิน:
คัดลอกรหัสรหัสดังต่อไปนี้: if (typeof define === "function" && define.amd) {}