
特徴
- プライベートおよびパブリックのメソッドとプロパティのサポート。
- このパターンは、 サーバー側の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に深く感謝しています。