Definer.js-シンプルなモジュラーシステム

JavaScriptはこれらのモジュールを取得していませんが、私たちは即興を続けています。

したがって、モジュールの別の実装が定義者として生まれました



モジュラーシステムがない場合のこのモジュラーシステムの主なアイデア。 アプリケーションのソースコードは、それらの間の依存関係を持つモジュールに便利に分解され、モジュールについて何も知らない1つの自己完結型ファイルにアセンブルされます。



アイデアをよく理解するために、猫の例の下で単純なものから複雑なものまで。







オンラインストアの抽象的な製品ページindex.html



ご覧ください。

 <html> <head> <meta charset="utf-8"/> <title> -</title> <script src="jquery.js"></script> <script src="https://rawgithub.com/tenorok/definer/master/definer.js"></script> <script src="modules/cart.js"></script> <script src="modules/list.js"></script> </head> <body> <ul class="list"> <li class="item"> <span class="name"></span>, <span class="price">250</span> </li> <li class="item"> <span class="name"></span>, <span class="price">100</span> </li> <li class="item"> <span class="name"></span>, <span class="price">300</span> </li> </ul> </body> </html>
      
      







jQueryを使用して、モジュールのDOMおよびデファイナーを操作します。



商品を追加し、追加された商品の総コストを取得できるオンラインストアバスケットを実装するCart



モジュール:

 definer('Cart', function() { function Cart() { this.list = []; } Cart.prototype = { add: function(target) { var item = $(target); this.list.push({ name: item.find('.name').text(), price: +item.find('.price').text() }); }, sum: function() { return this.list.reduce(function(sum, item) { return sum + item.price; }, 0); } }; return Cart; });
      
      







訪問者とディレクトリとの対話を実装するCart



依存list



モジュール:

 definer('list', function(Cart) { var iCart = new Cart(); $(function() { $('.item').on('click', function(e) { iCart.add(e.currentTarget); console.log(iCart.sum()); }); }); });
      
      







結果は、製品をクリックして、追加された製品の合計値をコンソールで確認できるページです。 しかし、同時に、機能を2つの独立したモジュールに分割しました。



この例では、モジュールに移動できるグローバル変数がまだあります。これはjQueryです。



既存のモジュールの前にmodules/clean.js



ます:

 definer.clean('$');
      
      







これで、 $



変数はグローバルコンテキストにありません。

 console.log($); // undefined
      
      







モジュールでjQueryを引き続き使用するには、依存関係を追加します。

 definer('Cart', function($) { ... }); definer('list', function($, Cart) { ... });
      
      







組立



これですべての準備が整い、ソースを1つのファイルに収集できます。



モジュールビルダーをインストールします。

 npm install definer
      
      







modules



ディレクトリからすべてのモジュールをindex.js



ファイルに収集します。

 ./node_modules/.bin/definer -d modules/ index.js
      
      







これで、 index.html



jQueryとアセンブルされたファイルのみを含めるだけで十分です。

 <script src="jquery.js"></script> <script src="index.js"></script>
      
      







単調な定義でビルドする



開発を容易にするために、 うなり声のプラグインがあります 。 監視を設定してモジュールファイルを変更し、アセンブリを自動的に実行できます。



助成に必要なすべてをインストールします。

 npm install grunt grunt-cli grunt-contrib-watch grunt-definer
      
      







Gruntfile.js



ファイルをプロジェクトルートに追加します。

 module.exports = function(grunt) { grunt.initConfig({ watch: { scripts: { files: ['modules/*.js'], tasks: ['definer:all'] }, }, definer: { all: { target: 'index.js', directory: 'modules/' } } }); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-definer'); };
      
      







監視を開始します。

 ./node_modules/.bin/grunt watch
      
      







これで、アセンブリがバックグラウンドで自動的に実行され、モジュールファイルを変更し、ブラウザーでページを更新して結果を確認できます。



サードパーティのファイルを作成する



これで、jQueryとコンパイル済みモジュールの2つのファイルがページに接続されました。 jQueryをアセンブリに追加して、1つのファイルのみをページに添付できます。



これを行うには、 clean



オプションをgruntターゲットに追加します。

 definer: { all: { target: 'index.js', directory: 'modules/', clean: { $: 'jquery.js' } } }
      
      







これで、 index.html



には、アセンブルされたファイルを1つだけ含めるだけで十分です。

 <script src="index.js"></script>
      
      







Jsdoc



収集されたファイルに関する情報を含むJSDocを作成することができます。



これを行うには、 jsdoc



オプションをgruntターゲットに追加します。

 jsdoc: { "file": "    -", "copyright": "2014 Artem Kurbatov, tenorok.ru", "license": "MIT license", "version": "package.json", "date": true }
      
      







コレクターが同じ名前のフィールドの値を受け取るJSONファイルへの相対パスを示すことができます。



package.json



ファイルをプロジェクトのルートに配置します。

 { "version": "0.1.0" }
      
      







次のJSDocは、アセンブルされたファイルのモジュールの前に表示されます。

 /*! * @file     - * @copyright 2014 Artem Kurbatov, tenorok.ru * @license MIT license * @version 0.1.0 * @date 17 February 2014 */
      
      







合計





Definerが役立ちます:





定義者grunt-definerのドキュメントは、githubにあります。



All Articles