2010/08/12

使い回したい機能をユニットスクリプトにする

大がかりなスクリプトをいくつか書いていると、前に書いた処理を使い回したくなることがあります。このような場合は、NILScriptにおけるライブラリである「ユニット」を作成しておいて、必要な場所で「require()」などで読み込んで使うようにすると良いでしょう。

ユニットスクリプトは、NILScriptの実行ファイルと同じディレクトリにある「lib」ディレクトリ内にディレクトリを作って、そこに作成します。
このディレクトリ内にあるディレクトリ名には「HTTP._test」のように、「.」に続いて謎の文字列が付加されていますが、これはユニットのバージョンを区別するものです。
「require("HTTP")」のようにバージョンの部分を省略して読み込んだ場合、辞書順で並び替えた時に一番後に来るバージョンのユニットが読み込まれます。バージョン部分も含めた名前を指定してrequire()を呼べば、任意のバージョンを使うことも可能です。
バージョンアップで仕様変更された時に、旧バージョンと新バージョンを共存させて使い分けたりするために、このような仕様が用意されています。
作成したユニットを公開するつもりが特になければ、バージョン部分は付けなくても構いません。

ユニットのディレクトリの中には、ユニットのバージョンを除く名前部分に拡張子「.ng」を付けたファイル名でスクリプトファイルを作成します。このスクリプトファイルには、ユニットの初期化を行う関数を記述します。
関数が呼び出される時のthisは、require()が返すUnitクラスのインスタンスオブジェクトです。基本的に、以下のようにしてクラスなどを定義し、ユニットのメンバとして公開します。クラスだけでなく、単なるオブジェクトや値、関数なども公開できます。

(function(){
 var MyClass=new Class({
 });
 this.MyClass=MyClass;
})

一旦varで変数に代入してからthisのメンバに代入しているのは、ユニットスクリプト内の処理からそのクラスを参照しやすくするためです。
クラスの定義方法については、NILScriptに同梱の「doc\base_class.txt」や、同梱のユニットスクリプトの実例を参照してください。

なお、ユニットスクリプトに記述された関数内では、「this.directory」でユニットスクリプトのあるディレクトリを表すDirectoryオブジェクトを参照できます。
これを使用することで、ユニットに同梱したファイルのフルパスを得たり、内容を読み込んだり出来ます。
例えば、「HTTPD」ユニットでは、スクリプトの最初の方で「var jQuery=this.directory.file('jquery.js').load();」として、ページ中に埋め込むjQueryのスクリプトを読み込んでいます。
File/Directoryオブジェクトの使い方については、NILScriptに同梱の「doc\base_io.txt」を参照してください。

0 件のコメント:

コメントを投稿