Загрузка и выполнение модуля обернуты в node.js, так что переменные в файле модуля находятся в закрытии и не будут загрязнять глобальные переменные и конфликтовать с другими.
Фронтовые модули, как правило,-это те, которые мы, разработчики, помещаем код модуля в закрытие, чтобы избежать конфликтов с другими.
Как инкапсулировать модули, которые являются общими для Node.js и Front-Cond, мы можем обратиться к реализации underscore.js. Это функциональный функциональный модуль, который является общим для Node.js и Front-Tend. Проверьте код:
Кода -копия выглядит следующим образом:
// Создать безопасную ссылку на объект подчеркивания для использования ниже.
var _ = function (obj) {
if (obj ancessionof _) вернуть obj;
if (! (Этот экземпляр _)) вернуть новый _ (obj);
this._Wrapped = obj;
};
// экспортировать объект подчеркивания для ** node.js **, с
// Западная совместимость для старого `require ()` api. Если мы находимся
// браузер добавьте `_` как глобальный объект через идентификатор строки,
// Для закрытия компилятора "Advanced" режима.
if (typeof exports! == 'undefined') {
if (typeof module! == 'undefined' && module.exports) {
exports = module.exports = _;
}
exports._ = _;
} еще {
root._ = _;
}
Решите назначить локальную variable_ для экспорта, оценив, существует ли экспорт, что обратно совместим со старым API () (). Если в браузере, идентификатор строки «_» используется в качестве глобального объекта; Полное закрытие следующего:
Кода -копия выглядит следующим образом:
(function () {
// Базовая установка
// ----------------
// Установить корневой объект, `window` в браузере или` exports` на сервере.
var root = это;
// Создать безопасную ссылку на объект подчеркивания для использования ниже.
var _ = function (obj) {
if (obj ancessionof _) вернуть obj;
if (! (Этот экземпляр _)) вернуть новый _ (obj);
this._Wrapped = obj;
};
// экспортировать объект подчеркивания для ** node.js **, с
// Западная совместимость для старого `require ()` api. Если мы находимся
// браузер добавьте `_` как глобальный объект через идентификатор строки,
// Для закрытия компилятора "Advanced" режима.
if (typeof exports! == 'undefined') {
if (typeof module! == 'undefined' && module.exports) {
exports = module.exports = _;
}
exports._ = _;
} еще {
root._ = _;
}
}). Call (this);
Закрытие строится через определение функции, и вызов (это) предназначен для вызова функции в соответствии с этим объектом, чтобы избежать внутренних переменных, загрязняющихся в глобальном объеме. В браузере это указывает на глобальный объект (объект окна), назначая переменную «_» глобальному объекту «root._» для внешних вызовов.
Lo-Dash, аналогичный underscore.js, также использует аналогичное решение, но совместим с загрузкой модуля AMD:
Кода -копия выглядит следующим образом:
; (function () {
/** Используется в качестве безопасной ссылки для `undefined` в средах Pre Es5*/
var не определен;
/** используется для определения того, имеют ли значения объект типа языка*/
var objectTypes = {
«логический»: ложь,
'функция': true,
'объект': true,
«номер»: ложь,
'String': false,
«Неопределенный»: ложь
};
/** используется в качестве ссылки на глобальный объект*/
var root = (objectTypes [typeof window] && window) || этот;
/** Обнаружение бесплатной переменной `exports`*/
var freeExports = objectTypes [typeof exports] && exports &&! exports.nodeType && exports;
/** Обнаружение бесплатной переменной `module`*/
var freemodule = objectTypes [typeof module] && module &&! module.nodetype && module;
/** Обнаружение популярного расширения CommonJS `module.exports`*/
var moduleExports = freemodule && freemodule.exports === freeexports && freeexports;
/*----------------------------------------------------------------------*//
// выставить Ло-Даш
var _ = runincontext ();
// Некоторые оптимизаторы AMD построения, такие как R.JS, проверьте на наличие шаблонов условий, например, следующее:
if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
// выставьте LO-DASH Глобальному объекту, даже если в AMD находится загрузчик AMD в
// Дело Lo-Dash вводили сторонним сценарием и не предназначался для
// загружен как модуль. Глобальное задание может быть возвращено в Lo-Dash
// модуль по его методу `noconflict ()`.
root._ = _;
// определить как анонимный модуль, так что через картирование пути это может быть
// ссылается как модуль «подчеркивания»
определить (function () {
возвращаться _;
});
}
// Проверьте на `exports` после` define` в случае, если оптимизатор сборки добавляет объект `exports`
else if (freeexports && freemodule) {
// в node.js или ringojs
if (modulexports) {
(freemodule.exports = _) ._ = _;
}
// в Narwhal или Rhino -Require
еще {
FreeExports._ = _;
}
}
еще {
// в браузере или носорога
root._ = _;
}
} .call (this));
Давайте посмотрим на основной код момента.
Кода -копия выглядит следующим образом:
(функция (неопределенная) {
var момент;
// Проверка на Nodejs
var hasmodule = (typeof module! == 'undefined' && module.exports);
/***********************************************
Разоблачение момента
*****************************************/
Функция MakeGlobal (Opercate) {
var предупреждает = false, local_moment = moment;
/ *Global Ender: false */
if (typeof ender! == 'undefined') {
возвращаться;
}
// Здесь «это» означает «window» в браузере или `global 'на сервере
// Добавить `moment` как глобальный объект через идентификатор строки,
// для закрытия компилятора "Advanced"
if (compecate) {
this.moment = function () {
if (! предупреждает && console && console.warn) {
предупреждение = правда;
Консоль.warn (
«Доступ к моменту через глобальную область - +
"Установится и будет удален в предстоящем" +
"выпускать.");
}
return local_moment.apply (null, аргументы);
};
} еще {
это ['moment'] = момент;
}
}
// определяется модуль CommonJS
if (hasmodule) {
module.exports = moment;
Makeglobal (True);
} else if (typeof define === "function" && define.amd) {
определить («момент», функция (требуется, экспорт, модуль) {
if (module.config (). noglobal! == true) {
// Если пользователь предоставил noglobal, он знает о глобальном
Makeglobal (module.config (). noglobal === не определен);
}
Вернуть момент;
});
} еще {
MakeGlobal ();
}
}). Call (this);
Как видно из приведенных выше примеров, когда инкапсулирующие модули, которые являются общими для Node.js и Front-End, можно использовать следующую логику:
Кода -копия выглядит следующим образом:
if (typeof exports! == "undefined") {
экспорт. ** = **;
} еще {
это. ** = **;
}
То есть, если объект экспорта существует, локальная переменная загружается на объект Exports, и если он не существует, она загружается на глобальный объект. Если добавлена совместимость спецификации ADM, добавьте еще одно предложение к суду:
Скопируйте код кода следующим образом: if (typeof define === "function" && define.amd) {}