 社会には、公式目的でグローバル変数を使用することに対する偏見がまだあるという印象があります。 この点で、すべての疑念を取り除き、JavaScript開発のモジュール性と柔軟性を必要とするすべての人に役立つ例で、いくつかの明確化を提供したいと思います 。 私は以下のすべてのアイデアのソースを追跡することはできませんが、私はそれらの著者であるふりをするのではなく、創造的な一般化についてのみです。 また、あらゆる場合のモジュールを決定するための1つの普遍的なパターンに対する主張を拒否します。これは決して起こり得ないことを誰もが理解してくれることを願っています。 これはすべて、RequireJS、CommonJS、およびmodule.exportsを介したnode.jsでのモジュールの形成方法とは大きく異なりますが、 狂信や偏見なしにタスクにアプローチする場合、これらのパターンはそれぞれ独自の場所を持っています。
 社会には、公式目的でグローバル変数を使用することに対する偏見がまだあるという印象があります。 この点で、すべての疑念を取り除き、JavaScript開発のモジュール性と柔軟性を必要とするすべての人に役立つ例で、いくつかの明確化を提供したいと思います 。 私は以下のすべてのアイデアのソースを追跡することはできませんが、私はそれらの著者であるふりをするのではなく、創造的な一般化についてのみです。 また、あらゆる場合のモジュールを決定するための1つの普遍的なパターンに対する主張を拒否します。これは決して起こり得ないことを誰もが理解してくれることを願っています。 これはすべて、RequireJS、CommonJS、およびmodule.exportsを介したnode.jsでのモジュールの形成方法とは大きく異なりますが、 狂信や偏見なしにタスクにアプローチする場合、これらのパターンはそれぞれ独自の場所を持っています。 
      特徴
- プライベートおよびパブリックのメソッドとプロパティのサポート。
- このパターンは、 サーバー側のJavaScriptとクライアント側のJavaScriptの両方に適用できます 。 Require.js(AMD)のように、クライアントとサーバーの両方のJSモジュールを動的にロードできます。
- 異なるモジュールのコードを含む複数のファイルを1つのファイルに接着することができます。これにより、ブラウザーのjsロードを最適化し、1つのファイルに縮小して接着することができます。 非同期モジュール定義(AMD)とCommonJSには、「1つのモジュール-1つのファイル」というイデオロギーがあることに注意してください。 ただし、1つのファイルに結合する手段はありますが、結合すると、モジュールの非同期ロードの基本的な意味が失われます。
- 1つのモジュールのコードを複数のファイルに分割し、それらを順次ダウンロードして相互に補完することができます。 これは、たとえば、定数、構成を別々のファイルに入れる場合に便利です。
- 複数のファイルに分割されているため、拡張可能な機能を備えたモジュールを作成できます 。 モジュールを作成し、特定の場合にのみ必要な機能を取り出し、条件ごとにロードします。
- いくつかの異なるサブモジュールで同じメソッドを定義することにより、 インターフェースと実装を作成することができます 。 これについては、例を使用して詳細に説明する必要があります。ブラウザのリポジトリ(localstorage、WebSQL、IndexedDB)にツリーのようなデータの構造を保存する必要があり、それらのインターフェイスは同じであり、ロジック部分は同じである必要があります。 treeStorage.js、treeStorage.localstorage.js、treeStorage.websql.js、treeStorage.indexeddb.jsを作成します
- ロードされたメソッドとプロパティの一部をラッパーメソッドに非表示にしてオプションで呼び出すか、ラップされたメソッドで複数の実装を一度にロードしてそれらを切り替えることにより、条件ごとに異なる名前のラッパーを作成できます。
- Impressの場合 、モジュールがグローバルネームスペースに分類され、各ハンドラーで個別に接続する必要なく、すべてのハンドラーからアクセスできることが重要です。
コード
// File: global.js //     if (typeof(window) != 'undefined') window.global = window; Function.prototype.override = function(fn) { var superFunction = this; return function() { this.inherited = superFunction; return fn.apply(this, arguments); } }
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      // File: moduleName.js //    moduleName (,    ) (function(moduleName) { //     console.log(' moduleName'); moduleName.publicProperty = '  '; var privateProperty = '  '; moduleName.publicMethod = function() { console.log(' publicMethod  moduleName'); }; moduleName.toBeOverridden = function() { console.log('   toBeOverriden   moduleName ( )'); }; var privateMethod = function() { console.log('  privateMethod  moduleName'); }; } (global.moduleName = global.moduleName || {}));
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
       // File: moduleName.implementationName.js //    moduleName  ,      (function(moduleName) { //        console.log(' implementationName'); //      //       // moduleName.publicProperty = '  '; //      //        // var privateProperty = '   '; moduleName.publicMethod = function() { //      //       console.log('  '); }; var privateMethod = function() { console.log('   '); }; //    "Function.override" // moduleName.toBeOverridden = moduleName.toBeOverridden.override(function() { console.log(' : moduleName.toBeOverridden'); this.inherited(); //     }); //   ,     //  -         // moduleName.wrapperName = function() { //      console.log('   '); moduleName.publicMethod = moduleName.publicMethod.override(function() { console.log(' : moduleName.publicMethod'); }); }; } (global.moduleName = global.moduleName || {}));
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
       // File: test.js require('./global.js'); require('./moduleName.js'); require('./moduleName.implementationName.js'); moduleName.wrapperName(); moduleName.publicMethod();
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      Impressでのこのテンプレートの適用方法
1.杭打ち: impress.jsからレンダリングされたimpress.constants.js
2. サブモジュール : db.mongodb.jsはdb.jsを拡張します
3.すべてのImpressハンドラーは個別のファイルにあるため、ハンドラーにrequireを記述する必要はありません。 ただし、ハンドラー自体は、node.jsの通常のメソッドを使用して定義されます。 module.exportsを介して。
例:
 module.exports = function(req, res, callback) { res.context.data = []; db.impress.sessions.find({}).toArray(function(err, nodes) { res.context.data = nodes; callback(); }); }
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      参照資料
Githubのロシア語と英語のコメント付きGlobal.js: github.com/tshemsedinov/global.js
GithubのImpress: https : //github.com/tshemsedinov/impress
npmで印象づける: https : //npmjs.org/package/impress
PS。 私は、プライベートメソッドにエラーを発見したtblasvに深く感謝しています。