単一の名前空間を利用するように JavaScript ライブラリをリファクタリング中です。約 200 のモジュールがあり、以前は jQuery プラグインとして、またはグローバル オブジェクト (悪い) に登録されていました。以前の調剤では、Intellisense を機能させるために、各モジュール (Intellisense が必要なモジュール) のモジュール参照を追加しました。
/// <reference path="" />
すべてのモジュールファイルの先頭に。
以前の調剤についてのすべては、欠陥があり、壊れやすく、エレガントではありませんでした.
新しい調剤でそれを修正したいと思っています。このリファクタリングの主な目標の 1 つは、新しい開発者がライブラリでの作業を簡単に開始できるようにすることであり、Intellisense は大きなメリットをもたらします。
現在、すべての *.js ファイルを単一の nameSpace-vsdoc.js ファイルに連結しています。すべてのクラスのすべてのメソッドは、vsdoc 構文を使用して文書化されています。すべてのモジュールは、単一の vsdoc 参照を使用します。これは問題なく動作しますが、扱いにくいです。Intellisense は以前よりも 300% よく機能しますが、まだ十分な精度ではありません。私のxmlドキュメントの多くが欠けており、少し複雑なオブジェクトでさえも返すメソッド/クラスにうまく再帰しません。
YUI Doc は、JsDoc 構文からドキュメントを作成する方法を提供しますが、それは Intellisense には役立ちません。深い魂のグーグルは、サードパーティのソリューションを明らかにすることに失敗しました.
よりインテリセンス インテリジェントな方法で VsDocs を生成するツールはありますか?
アップデート:
広範な検討、テスト、段階的なリファクタリングを経て、この jsFiddle のような基本的な名前空間ができました。
これにより、名前空間に必要なメソッドを登録する自己実行関数で疎結合モジュールを作成できます。すべてのモジュールは次で始まります。
/// <reference path="~/js/NameSpace-vsdoc.js" />
VS 2010 ビルド イベントに添付した単純な Perl スクリプトを使用して、この vsdoc を生成します。
use strict;
my $dir = $ARGV[0];
my $destfile = "$dir\\js\\NameSpace-vsdoc.js";
unlink($destfile);
my $js = "";
$js .= extractFile("$dir\\js\\_first-vsdoc.js");
$js .= extractFile("$dir\\js\\NameSpace.js");
$js .= extract("$dir\\js\\modules");
#Add additional directories as needed
$js .= extractFile("$dir\\js\\_last-vsdoc.js");
open(VSDOC, "> $destfile") or die("Cannot open vsdoc file: $destfile ; $!");
print VSDOC $js;
close(VSDOC);
sub extract
{
my $ret = "";
my $path = $_[0];
opendir(JSDIR, $path) or die("Cannot open js directory: $path ; $!");
while((my $filename = readdir(JSDIR)))
{
if($filename =~ /.*\.js$/ &&
$filename !~ /-vsdoc/ &&
$filename !~ /_first/ &&
$filename !~ /_last/ &&
$filename !~ /.min\.js/)
{
$ret .= extractFile("$path\\$filename");
}
}
closedir(JSDIR);
return $ret;
}
sub extractFile
{
my $ret = "";
my $filename = $_[0];
open(JSFILE, "$filename") or die("Cannot open js file: $filename ; $!");
while((my $line = <JSFILE>))
{
if($line !~ m/-vsdoc\.js/ )
{
$ret .= $line;
}
}
close(JSFILE);
return $ret;
}
printf("Finished generating NameSpace vsdoc.\n");
_first-vsdoc.js および _last-vsdoc.js ファイルは、コンテンツ全体を自己実行関数にラップします。次に、必要に応じて、結果の vsdoc を Closure Compiler、YUI Compressor、および Uglify に渡します。
このプロセスは以前よりもはるかにうまく機能しますが、まだ欠点がないわけではありません。
ゼロから始めて、NameSpace-vsdoc.js を参照する NewModule.js で、適切な Intellisense を取得します。
Ns.register() //visible
Ns.controls.register() //visible
Ns.actions.register() //visible
ただし、 NewModule.js を次のように定義する (およびコンパイルする) と:
(function _alertClosure() {
Ns.register('alert', function alert(someText) {
///insert proper vsdoc style comment
});
}());
次の場合、適切な Intellisense が得られません。
Ns.alert() //no Intellisense help
サブ名前空間でうまく機能するため、これは困惑しています。私はこれを行うことを余儀なくされています:
Ns.alert = Ns.alert || Ns.register('alert', function ....
コンパイルすると、突然 (明らかに) Intellisense が期待どおりに動作します。
Intellisense は、jQuery の vsdoc (このプロセスを構築する際に私が詳しく調べたものです) を使用してチェーンされたメソッドで動作し、jQuery はy.x = y.x || new x()
それを実現するためのトリックに頼りません。
構造的な観点から、jQuery の vsdoc と私自身の vsdoc の間に認識できる唯一の識別可能な違いは、jQuery が名前空間全体を同じクロージャー内にアセンブルすることです。名前空間と各モジュールは、個別のクロージャでラップされています。それに比べて、私の vsdoc は自己実行関数の長い文字列のように見えます。
クロージャー/モジュール パターンを放棄することに関連するリスクが多すぎます。また、仮説を単独でテストすることは困難です。ライブラリが小さい場合、Intellisense は適切に機能するため、何千もの "Javascript Intellisense Message: C:\\js\NameSpace-vsdoc.js(40:16) : Object required" エラーを生成できません。
アイデア?