モジュールの読み込みと実行はnode.jsに包まれているため、モジュールファイルの変数が閉鎖され、グローバル変数や他者との競合を汚染しません。
通常、フロントエンドモジュールは、他の競合を回避するために、モジュールコードを閉鎖に開発するモジュールです。
node.jsとフロントエンドに共通するモジュールをカプセル化する方法は、underscore.jsの実装を参照できます。これは、node.jsおよびフロントエンドに共通する関数関数モジュールです。コードを確認してください:
コードコピーは次のとおりです。
//以下で使用するために、アンダースコアオブジェクトへの安全な参照を作成します。
var _ = function(obj){
if(obj instanceof _)objを返します。
if(!(このinstanceof _))new _(obj)を返します。
this._wrapped = obj;
};
// ** node.js **のアンダースコアオブジェクトをエクスポートします
//古い `require()` apiの後方互換性。私たちがいるなら
//ブラウザ、文字列識別子を介してグローバルオブジェクトとして `_`を追加し、
//閉鎖コンパイラ「Advanced」モードの場合。
if(typeof exports!== 'undefined'){
if(typeof module!== 'undefined' && module.exports){
exports = module.exports = _;
}
exports._ = _;
} それ以外 {
root._ = _;
}
エクスポートが存在するかどうかを判断することにより、ローカル変数をエクスポートに割り当てることを決定します。ブラウザで、文字列識別子「_」がグローバルオブジェクトとして使用されます。完全な閉鎖は次のとおりです。
コードコピーは次のとおりです。
(関数() {
//ベースラインセットアップ
// ------------------
//ルートオブジェクト、ブラウザに「ウィンドウ」、またはサーバーに「エクスポート」を確立します。
var root = this;
//以下で使用するために、アンダースコアオブジェクトへの安全な参照を作成します。
var _ = function(obj){
if(obj instanceof _)objを返します。
if(!(このinstanceof _))new _(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モジュールの読み込みと互換性があります。
コードコピーは次のとおりです。
;(関数() {
/** PRE ES5環境で「未定義」の安全な参照として使用*/
var未定義;
/**値が言語タイプのオブジェクトのかどうかを判断するために使用*/
var objectTypes = {
'boolean':false、
「機能」:本当、
「オブジェクト」:本当、
'number':false、
'string':false、
「未定義」:偽
};
/**グローバルオブジェクトへの参照として使用*/
var root =(objectTypes [typeofウィンドウ] &&ウィンドウ)||これ;
/**無料変数を検出 `Exports`*/
var freexports = objectTypes [typeof exports] && exports &&!exports.nodetype && exports;
/**無料変数「モジュール」*/
var freemodule = objectTypes [typeof module] && module &&!module.nodetype && module;
/**人気のあるcommonjs拡張子 `module.exports`*/
var moduleexports = freemodule && freemodule.exports === freexports && freexports;
/*----------------------------------------------------------------------------*/
// lo-dashを公開します
var _ = runincontext();
// R.JSのような一部のAMDビルドオプティマザーは、次のような状態パターンを確認してください。
if(typeof define == 'function' && typeof define.amd == 'object' && define.amd){
// AMDローダーが存在する場合でも、グローバルオブジェクトにlo-dashを公開する
//ケースlo-dashはサードパーティのスクリプトによって注入され、
//モジュールとしてロードされます。グローバルな割り当ては、LO-DASHで戻ることができます
// `noconflict()`メソッドによるモジュール。
root._ = _;
//匿名モジュールとして定義するので、パスマッピングを介して、
//「アンダースコア」モジュールとして参照されています
定義(function(){
戻る _;
});
}
//ビルドオプティマイザーが「エクスポート」オブジェクトを追加した場合に「define」の後に「エクスポート」を確認します
else if(freexports && freemodule){
// node.jsまたはringojs
if(moduleexports){
(freemodule.exports = _)._ = _;
}
// narwhalまたはrhino -requireで
それ以外 {
freexports._ = _;
}
}
それ以外 {
//ブラウザまたはサイで
root._ = _;
}
} .call(this));
Moment.jsカプセル化の閉鎖のメインコードを見てみましょう。
コードコピーは次のとおりです。
(関数(未定義){
var Moment;
// nodejsを確認します
var hasmodule =(typeof module!== 'undefined' && module.exports);
/**********************************************
瞬間を公開します
*************************************/
関数makeglobal(deprecate){
var warned = false、local_moment = moment;
/ *グローバルエンダー:false */
if(typeof ender!== 'undefined'){
戻る;
}
//ここで、「これはブラウザの「ウィンドウ」、またはサーバー上の「グローバル」を意味します
//文字列識別子を介してグローバルオブジェクトとして「モーメント」を追加し、
//閉鎖コンパイラ「Advanced」モードの場合
if(deprecate){
this.moment = function(){
if(!警告&& console && console.warn){
警告= true;
console.warn(
「グローバルスコープを介してモーメントにアクセスする」 +
「非推奨、今後の削除されます」 +
"リリース。");
}
return local_moment.apply(null、arguments);
};
} それ以外 {
この['Moment'] = Moment;
}
}
// CommonJSモジュールが定義されています
if(hasmodule){
module.exports = moment;
makeglobal(true);
} else if(typeof define === "function" && define.amd){
定義( "モーメント"、function(要求、エクスポート、モジュール){
if(module.config()。noglobal!== true){
//ユーザーがnoglobalを提供した場合、彼はグローバルを知っています
makeglobal(module.config()。noglobal === undefined);
}
戻り瞬間;
});
} それ以外 {
makeglobal();
}
})。call(this);
上記の例からわかるように、node.jsとフロントエンドに共通するモジュールをカプセル化する場合、次のロジックを使用できます。
コードコピーは次のとおりです。
if(typeof exports!== "未定義"){
エクスポート。** = **;
} それ以外 {
これ。** = **;
}
つまり、エクスポートオブジェクトが存在する場合、ローカル変数はエクスポートオブジェクトにロードされ、存在しない場合、グローバルオブジェクトにロードされます。 ADM仕様の互換性が追加されている場合は、もう1つの文を追加して判断します。
コードコードを次のようにコピーします:if(typeof define === "function" && define.amd){}