RequireJSと比較した従来の依存関係管理アプローチ

ハローワールド



Helios Kernelは、javascriptモジュール間の依存関係を管理するためのライブラリです。これは、他の言語や環境でよく見られる「クラシック」アプローチを実装し、include()関数を使用します。



この方法は他のアプローチとは簡単に異なります。依存関係はファイルの正確なパスによってモジュールの先頭にリストされ、モジュール本体にはモジュールの依存関係を読み込んだ後に実行されるコードが含まれます。



Helios KernelはKISSの原則に準拠しているため、依存関係管理ライブラリには現在期待されていない機能がいくつかあります。 Helios Kernelを使用する場合、異なるモジュールのパスの検索ルールを使用して設定を記述したり、特別なオブジェクトを介してライブラリ関数をエクスポートしたりする必要はありません。 しかし、このライブラリは、必要なモジュールを接続してコードを記述したかっただけで、新しい依存関係を指定するときにクールな機能を実行することなく作成されました。



Helios Kernelは、実行時の依存関係の動的な読み込み(および読み込み解除)をサポートし、ライブラリ自体とモジュール形式は、nodejsとブラウザー環境の間で互換性があります。つまり、モジュールは変更や変換なしで使用できます。



この記事では、従来のHelios KernelアプローチとRequireJSを使用した依存関係管理を比較し、Helios Kernelアプローチが複雑さの一部を回避する方法を示します。





はじめに


Helios Kernelには次の機能があります。







したがって、2つのモジュール間の関係の説明は次のとおりです。



ライブラリモジュールmyLibrary.js、いくつかの機能を宣言:



init = function() { //  ()   myLibrary = {}; //   myLibrary.writeHello = function() { console.log("Hello World!"); } }
      
      







そして、このライブラリを接続して使用するモジュール:



 include("path/to/myLibrary.js"); init = function() { //        myLibrary.writeHello(); }
      
      







ここでは、ライブラリオブジェクトを「エクスポート」するために、最初のモジュールのグローバル変数myLibraryの定義が使用されます。 グローバルオブジェクトにはどこからでもアクセスできるため、このメソッドは「間違っている」と見なされます。 しかし、例として最も明白なので、ここで使用します。 Helios Kernelは、モジュール間でのオブジェクトの転送方法に制限を課していません。任意のコードをinit関数内に含めることができます。 そこに含めて、「エクスポートされたオブジェクト」のみを返すファクトリ関数を定義できます。



ただし、モジュールのローカル変数のみを決定する必要がある場合は、これにinit()関数のスコープを使用できます。



次に、Helios Kernelを使用すると、RequireJSよりもコードが簡単になる例を示します。



モジュールの説明


依存関係を持つモジュールの説明の形式は次のようになります。



RequireJS Heliosカーネル
 define( //  ['fooLibrary', 'barLibrary'], function( foo, bar ){ //  foo.doSomething(); } );
      
      





 //  include("path/to/fooLibrary.js"); include("path/to/barLibrary.js"); init = function() { //  foo.doSomething(); }
      
      









RequireJSで使用されるライブラリオブジェクトをエクスポートする方法では、依存関係の名前を2回(一度は依存関係が存在するモジュールの名前、2回目)-この依存関係をエクスポートする引数の名前を指定する必要があります。



これにより、さらに依存関係がある場合にRequireJSモジュールが読みやすくなります。



RequireJS Heliosカーネル
 define( [ 'dep1', 'dep2', 'dep3', 'dep4', 'dep5', 'dep6', 'dep7' ], function ( dep1, dep2, dep3, dep4, dep5, dep6, dep7) { // ... } );
      
      





 include("deps/dep1.js"); include("deps/dep2.js"); include("deps/dep3.js"); include("deps/dep4.js"); include("deps/dep5.js"); include("deps/dep6.js"); include("deps/dep7.js"); include("deps/dep8.js"); init = function() { // ... }
      
      









このようなコードを簡素化するために、RequireJSは依存関係を記述する別の方法であるCommmonJSをさらに考案しました 。 この手法を使用すると、依存関係を次のように説明できます。



 define( [ 'dep1', 'dep2', 'dep3', 'dep4', 'dep5', 'dep6', 'dep7' ], function (require) { var dep1 = require('dep1'), dep2 = require('dep2'), dep3 = require('dep3'), dep4 = require('dep4'), dep5 = require('dep5'), dep6 = require('dep6'), dep7 = require('dep7'); // ... } });
      
      







このようなレコードを使用すると、フォーマットが少し簡単になり、読みやすくなりますが、ここでも依存関係の名前を数回言及する必要があります。 さらに、この構文糖は、依存関係にアクセスする別の方法の形で別の複雑さを追加します。



Helios Kernelはこれをすべて回避します。 追加の依存関係には、include()を使用した言及が1つだけ必要です。



アセンブリモジュールの作成


プロジェクトの多くの部分でしばしば一緒に使用されるいくつかのモジュールがあると仮定します。 または、複数のパーツで構成されるライブラリがあり、これらすべてのパーツを一度に取得する必要があります。 複数のモジュールを取得する最も簡単な方法は、必要なときに毎回それらをすべて明示的に接続することです。



ただし、大規模なプロジェクトは、不要なコードを複製しないようにモジュールに分割されます。 したがって、残りを接続する1つの共通モジュールを作成できます。



ただし、RequireJSの場合、必要な依存関係をエクスポートし、エクスポートされた汎用モジュールのオブジェクトを介してそれらを「転送」する必要があります。



Helios Kernelの場合、依存関係をリストするだけで十分です。



RequireJS Heliosカーネル
 define( 'depCommon', [ 'dep1', 'dep2', 'dep3' ], function( dep1, dep2, dep3 ) { return { dep1 : dep1, dep2 : dep2, dep3 : dep3 } } );
      
      





 include('deps/dep1.js'); include('deps/dep2.js'); include('deps/dep3.js');
      
      









Helios Kernel形式で記述された一般的なモジュールの場合、init()関数を記述する必要さえありません。 また、読みやすさも簡素化されます-このモジュールのコードを調べると、アクションを実行せず、追加のモジュールのみを接続していることがすぐにわかります。



ただし、RequireJSを使用する一般的なモジュールの場合は、エクスポートのすべてのケースを書き換える必要もあります。 以前の個々のエクスポートされたパーツをdep1、dep2、...としてアドレス指定する必要があった場合、depCommon.dep1、depCommon.dep2、...に置き換える必要があります。



使いやすい通常のJavaScriptライブラリ


スクリプトタグを使用してhtmlページに接続されることになっているライブラリについて話しています。



Helios Kernelモジュールの形式は、init()関数に任意のコードを含めることができるため、通常のライブラリに非常に似ています。 したがって、通常のライブラリをモジュールに変換するには、init()関数の定義でラップするだけで十分です。その後、include()を使用して接続できます。



RequireJSの場合、モジュールが定義済みのオブジェクトをエクスポートする必要があり、リファクタリングを行う必要があるため、ライブラリをモジュールに変換することははるかに困難です。 代わりに、 shim属性を使用して構成内のモジュールを記述することが提案されています。 ただし、そのようなアプローチでさえ問題につながる可能性があります



Webとnodejs間の簡単な移植


nodejs環境のサーバーでRequireJSモジュールを使用するには、 r.jsライブラリを使用できます。これにより、そのようなモジュールをnodejsに接続できます。



に、nodeが使用するCommonJSモジュール形式で記述されたプロジェクトは、 browserifyを使用してWebライブラリに変換できます。 ただし、これはモジュールではなく、スクリプトタグ(またはRequireJSのshim config)で接続された大きなバンドルになります。



Helios Kernelは、両方のプラットフォームでモジュールが変更および変換されることなく機能するため、このタスクを簡素化します。



ウェブサイト: http : //asvd.github.io/helios-kernel/

コード: https : //github.com/asvd/helios-kernel/releases/download/v0.9.5/helios-kernel-0.9.5.tar.gz

Github: https : //github.com/asvd/helios-kernel



All Articles