يتم تحميل تحميل الوحدة والتنفيذ في node.js بحيث تكون المتغيرات في ملف الوحدة في إغلاق ولن تلوث المتغيرات العالمية والتعارض مع الآخرين.
الوحدات النمطية الأمامية هي عادةً تلك التي نضع مطورها رمز الوحدة النمطية في إغلاق لتجنب النزاعات مع الآخرين.
كيفية تغليف الوحدات النمطية الشائعة في node.js والواجهة الأمامية ، يمكننا الرجوع إلى تنفيذ السفلية. إنها وحدة وظيفة وظيفية شائعة في Node.js والواجهة الأمامية. تحقق من الرمز:
نسخة الكود كما يلي:
// قم بإنشاء مرجع آمن للكائن السفلي للاستخدام أدناه.
var _ = function (obj) {
إذا (OBJ مثيل _) إرجاع OBJ ؛
if (! (هذا مثيل _)) إرجاع جديد _ (obj) ؛
this._wrapped = obj ؛
} ؛
// تصدير الكائن السفلي لـ ** node.js ** ،
// توافق متخلف لـ API القديم () `` API. إذا كنا في
// المتصفح ، أضف `_` ككائن عالمي عبر معرف سلسلة ،
// لوضع المترجم "المتقدم".
if (typeof orports! == 'undefined') {
if (typeof module! == 'undefined' && module.exports) {
الصادرات = module.exports = _ ؛
}
exports._ = _ ؛
} آخر {
root._ = _ ؛
}
قرر تعيين متغير محلي للتصدير عن طريق الحكم على ما إذا كانت الصادرات موجودة ، وهو متوافق مع الخلف مع API المطلوبة (). إذا كان في المتصفح ، يتم استخدام معرف السلسلة "_" ككائن عالمي ؛ الإغلاق الكامل على النحو التالي:
نسخة الكود كما يلي:
(وظيفة() {
// إعداد خط الأساس
// ----------------
// إنشاء كائن الجذر ، "نافذة" في المتصفح ، أو "الصادرات" على الخادم.
var root = this ؛
// قم بإنشاء مرجع آمن للكائن السفلي للاستخدام أدناه.
var _ = function (obj) {
إذا (OBJ مثيل _) إرجاع OBJ ؛
if (! (هذا مثيل _)) إرجاع جديد _ (obj) ؛
this._wrapped = obj ؛
} ؛
// تصدير الكائن السفلي لـ ** node.js ** ،
// توافق متخلف لـ API القديم () `` API. إذا كنا في
// المتصفح ، أضف `_` ككائن عالمي عبر معرف سلسلة ،
// لوضع المترجم "المتقدم".
if (typeof orports! == 'undefined') {
if (typeof module! == 'undefined' && module.exports) {
الصادرات = module.exports = _ ؛
}
exports._ = _ ؛
} آخر {
root._ = _ ؛
}
}). الاتصال (هذا) ؛
تم تصميم الإغلاق من خلال تعريف الوظيفة ، والاستدعاء (هذا) هو استدعاء الوظيفة ضمن هذا الكائن لتجنب المتغيرات الداخلية تلوث النطاق العالمي. في المتصفح ، يشير هذا إلى كائن عالمي (كائن نافذة) ، وتعيين المتغير "_" إلى الكائن العالمي "root._" للمكالمات الخارجية.
يستخدم Lo-Dash ، على غرار Underscore.js ، أيضًا حلًا مشابهًا ، ولكنه متوافق مع تحميل وحدة AMD:
نسخة الكود كما يلي:
؛(وظيفة() {
/** يستخدم كمرجع آمن لـ "غير محدد" في بيئات ما قبل ES5*/
var غير محدد ؛
/** تستخدم لتحديد ما إذا كانت القيم من كائن نوع اللغة*/
var ObjectTypes = {
'Boolean': false ،
'وظيفة': صحيح ،
"كائن": صحيح ،
'الرقم': خطأ ،
'سلسلة': خطأ ،
"غير محدد": خطأ
} ؛
/** يستخدم كمرجع للكائن العالمي*/
var root = (ObjectTypes [typeof window] && window) || هذا؛
/** اكتشف متغيرًا مجانيًا "صادرات"*/
var freexports = ObjectTypes [typeof orports] && orports &&! exports.nodeType && orports ؛
/** اكتشف متغيرًا مجانيًا `module`*/
var freemodule = objectTypes [typeof module] && module &&! module.nodeType && module ؛
/** اكتشف امتداد Commonjs الشهير `module.exports`*/
var moduleexports = freemodule && freemodule.exports === freexports && exports ؛
/*----------------------------------------------------------------------*/
// فضح lo-dash
var _ = runincontext () ؛
// بعض مُحسّنات بناء AMD ، مثل R.JS ، تحقق من أنماط الحالة مثل ما يلي:
if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
// فضح lo-dash للكائن العالمي حتى عند وجود محمل AMD في
// تم حقن Case lo-dash بواسطة نص طرف ثالث وليس المقصود منه أن يكون
// تم تحميله كوحدة. يمكن إعادة المهمة العالمية في الدس
// الوحدة النمطية بواسطة طريقة noconflict () `.
root._ = _ ؛
// تعرف على أنه وحدة مجهولة ، من خلال تعيين المسار ، يمكن أن يكون
// المشار إليها كوحدة "تحت السطح"
define (function () {
يعود _؛
}) ؛
}
// تحقق من "الصادرات" بعد "تعريف" في حالة إضافة كائن "صادرات"
آخر إذا (freexports && freemodule) {
// في node.js أو ringojs
if (moduleexports) {
(freemodule.esports = _) ._ = _ ؛
}
// في Narwhal أو Rhino -require
آخر {
freeExports._ = _ ؛
}
}
آخر {
// في متصفح أو وحيد القرن
root._ = _ ؛
}
} .Call (هذا)) ؛
دعنا نلقي نظرة على الكود الرئيسي للحظة. إغلاق تغليف js:
نسخة الكود كما يلي:
(وظيفة (غير محددة) {
var لحظة
// تحقق من nodejs
var hasmodule = (typeof module! == 'undefined' && module.exports) ؛
/********************************************************
فضح لحظة
***************************************/
وظيفة makeglobal (deprecate) {
var arned = false ، local_moment = moment ؛
/ *ender العالمي: خطأ */
if (typeof ender! == 'undefined') {
يعود؛
}
// هنا ، "هذا" يعني "نافذة" في المتصفح ، أو "عالمي" على الخادم
// أضف "لحظة" ككائن عالمي عبر معرف سلسلة ،
// لوضع برنامج التحويل البرمجي "المتقدم"
if (creprecate) {
this.moment = function () {
if (! تحذير && console && console.warn) {
حذر = صحيح ؛
console.warn (
"الوصول إلى اللحظة من خلال النطاق العالمي" +
"تم إهماله ، وسيتم إزالته في قادم" +
"يطلق.")؛
}
إرجاع local_moment.apply (null ، الحجج) ؛
} ؛
} آخر {
هذا ["اللحظة"] = لحظة ؛
}
}
// يتم تعريف وحدة CommonJS
إذا (hasmodule) {
module.exports = لحظة ؛
makeglobal (صحيح) ؛
} آخر إذا (typeof define === "function" && define.amd) {
تعريف ("لحظة" ، وظيفة (تتطلب ، الصادرات ، الوحدة) {
if (module.config (). noglobal! == true) {
// إذا قدم المستخدم noglobal ، فهو على دراية بالعالم العالمي
makeglobal (module.config (). noglobal === undefined) ؛
}
لحظة العودة
}) ؛
} آخر {
makeglobal () ؛
}
}). الاتصال (هذا) ؛
كما يتضح من الأمثلة المذكورة أعلاه ، عند تغليف الوحدات النمطية الشائعة في Node.js والواجهة الأمامية ، يمكن استخدام المنطق التالي:
نسخة الكود كما يلي:
if (typeof orports! == "غير محدد") {
الصادرات. ** = ** ؛
} آخر {
هذا. ** = ** ؛
}
أي إذا كان كائن التصدير موجودًا ، يتم تحميل المتغير المحلي على كائن التصدير ، وإذا لم يكن موجودًا ، يتم تحميله على الكائن العالمي. إذا تمت إضافة توافق مواصفات القبول ، فأضف جملة أخرى للحكم:
انسخ رمز الرمز كما يلي: if (typeof define === "function" && define.amd) {}