모듈로드 및 실행은 모듈 파일의 변수가 폐쇄되어 전역 변수를 오염시키지 않도록 Node.js로 래핑됩니다.
프론트 엔드 모듈은 일반적으로 개발자가 다른 모듈과의 충돌을 피하기 위해 개발자가 모듈 코드를 폐쇄하는 것입니다.
Node.js 및 프론트 엔드에 공통적 인 모듈을 캡슐화하는 방법 indercore.js의 구현을 참조 할 수 있습니다. Node.js 및 프론트 엔드에 공통적 인 기능적 기능 모듈입니다. 코드 확인 :
코드 사본은 다음과 같습니다.
// 아래에서 사용할 밑줄 객체에 대한 안전한 참조를 만듭니다.
var _ = 함수 (obj) {
if (obj instanceof _) return obj;
if (! (이 인스턴스 _)) new _ (obj)를 반환합니다.
this._wrapped = obj;
};
// ** node.js **와 함께 밑줄 객체를 내보내십시오
// 이전`require ()`api에 대한 후진 호환성. 우리가 있다면
// 브라우저, 문자열 식별자를 통해 글로벌 개체로`_`를 추가하십시오.
// 클로저 컴파일러 "고급"모드 용.
if (typeof exports! == 'undefined') {
if (typeof module! == 'undefined'&& module.exports) {
Exports = module.exports = _;
}
내보내기 ._ = _;
} 또 다른 {
root._ = _;
}
내보내기가 존재하는지 판단하여 로컬 변수 _을 내보내기에 할당하기로 결정합니다. 브라우저에서 문자열 식별자 "_"가 전역 객체로 사용됩니다. 완전한 폐쇄는 다음과 같습니다.
코드 사본은 다음과 같습니다.
(기능() {
// 기준선 설정
// ---------------
// 브라우저에서 루트 객체,`window '또는 서버에서'내보내기 '를 설정합니다.
var root = this;
// 아래에서 사용할 밑줄 객체에 대한 안전한 참조를 만듭니다.
var _ = 함수 (obj) {
if (obj instanceof _) return obj;
if (! (이 인스턴스 _)) new _ (obj)를 반환합니다.
this._wrapped = obj;
};
// ** node.js **와 함께 밑줄 객체를 내보내십시오
// 이전`require ()`api에 대한 후진 호환성. 우리가 있다면
// 브라우저, 문자열 식별자를 통해 글로벌 개체로`_`를 추가하십시오.
// 클로저 컴파일러 "고급"모드 용.
if (typeof exports! == 'undefined') {
if (typeof module! == 'undefined'&& module.exports) {
Exports = module.exports = _;
}
내보내기 ._ = _;
} 또 다른 {
root._ = _;
}
}). 전화 (this);
클로저는 기능 정의를 통해 구축되며, 전화 (this)는이 객체의 함수를 호출하여 내부 변수가 전역 범위로 오염되는 것을 피하는 것입니다. 브라우저에서 이것은 외부 호출에 대해 "_"변수를 전역 객체 "root._"에 할당하는 글로벌 객체 (창 객체)를 가리 킵니다.
Underscore.js와 유사한 Lo-Dash는 유사한 솔루션을 사용하지만 AMD 모듈로드와 호환됩니다.
코드 사본은 다음과 같습니다.
;(기능() {
/** Pre ES5 환경에서 'undefined'에 대한 안전한 참조로 사용*/
var 정의;
/** 값이 언어 유형 객체인지 결정하는 데 사용됩니다*/
var objectTypes = {
'부울': 거짓,
'기능': 사실,
'개체': 사실,
'번호': 거짓,
'문자열': 거짓,
'정의되지 않은': 거짓
};
/** 글로벌 객체에 대한 참조로 사용*/
var root = (ObjectTypes [typeof Window] && 창) || 이것;
/** 무료 변수 감지`exports`*/
var freeExports = ObjectTypes [typeof Exports] && 내보내기 &&! Exports.NodeType && 내보내기;
/** 무료 변수 감지`module '*/
var freemodule = ObjectTypes [typeof module] && module &&! module.nodetype && module;
/** 인기있는 commonjs 확장자 감지`module.exports`*/
var moduleeexports = freemodule && freemodule.exports === freeExports && freeExports;
/*-------------------------------------------------------------------------------*/.
// LO-DASH를 노출시킵니다
var _ = runinconText ();
// R.JS와 같은 일부 AMD 빌드 최적화기는 다음과 같은 조건 패턴을 확인합니다.
if (typeof define == 'function'&& typeof define.amd == 'object'&& define.amd) {
// AMD 로더가있는 경우에도 글로벌 객체에 LO-DASH를 노출시킵니다.
// Case Lo-Dash는 타사 스크립트에 의해 주입되었으며 의도되지 않았습니다.
// 모듈로로드되었습니다. 글로벌 할당은 로마에서 되돌릴 수 있습니다
//`noconflict ()`메소드의 모듈.
root._ = _;
// 익명 모듈로 정의하여 경로 매핑을 통해
// "밑줄"모듈로 참조되었습니다
define (function () {
반품 _;
});
}
// 빌드 최적화기가`exports '객체를 추가하는 경우'정의 '후'내보내기 '를 확인하십시오.
else if (freeExports && freemodule) {
// node.js 또는 ringojs에서
if (moduleeexports) {
(freemodule.exports = _) ._ = _;
}
// Narghal 또는 Rhino require에서
또 다른 {
FreeExports._ = _;
}
}
또 다른 {
// 브라우저 또는 코뿔소에서
root._ = _;
}
} .call (this));
주요 모멘트 코드를 살펴 보겠습니다 .JS 캡슐화 폐쇄 :
코드 사본은 다음과 같습니다.
(함수 (정의되지 않은) {
var 순간;
// nodejs를 확인하십시오
var hasmodule = (typeof module! == 'undefined'&& module.exports);
/********************************************************************************************* 누군가
노출 순간
*************************************/
함수 makeglobal (더 이상) {
var 경고 = false, local_moment = moment;
/ *글로벌 엔더 : 거짓 */
if (ender typeof! == 'undefined') {
반품;
}
// 여기,`this '는 브라우저의'창 '을 의미하거나 서버의'글로벌 '을 의미합니다.
// 문자열 식별자를 통해 'Moment'를 글로벌 개체로 추가하십시오.
// 클로저 컴파일러 "고급"모드 용
if (감가 상승) {
this.moment = function () {
if (! warned && console && console.warn) {
경고 = 참으로;
Console.warn (
"글로벌 범위를 통해 순간에 액세스하는 것은" +입니다
"감가 상각되고 다가오는 다가오는" +
"풀어 주다.");
}
Local_Moment.Apply (null, arguments)를 반환합니다.
};
} 또 다른 {
이 [ '순간'] = 순간;
}
}
// commonjs 모듈이 정의되어 있습니다
if (hasmodule) {
module.exports = 모멘트;
makeglobal (true);
} else if (typeof define === "function"&& define.amd) {
정의 ( "모멘트", 함수 (요구, 내보내기, 모듈) {
if (module.config (). noglobal! == true) {
// 사용자가 Noglobal을 제공 한 경우, 그는 글로벌을 알고 있습니다.
makeglobal (module.config (). noglobal === 정의되지 않은);
}
돌아 오는 순간;
});
} 또 다른 {
makeglobal ();
}
}). 전화 (this);
위의 예에서 알 수 있듯이 Node.js 및 프론트 엔드에 공통적 인 모듈을 캡슐화 할 때 다음 논리를 사용할 수 있습니다.
코드 사본은 다음과 같습니다.
if (typeof exports! == "undefined") {
수출. ** = **;
} 또 다른 {
이것은 ** = **;
}
즉, 내보내기 객체가 존재하면 로컬 변수가 내보내기 객체에로드되며 존재하지 않으면 글로벌 오브젝트에로드됩니다. ADM 사양의 호환성이 추가되면 판단에 하나 더 문장을 추가하십시오.
다음과 같이 코드 코드를 복사하십시오. if (typeof define === "function"&& define.amd) {}