JavaScriptライブラリをリファクタリングして1つの名前空間を利用しようとしています。私たちは以前はjQueryプラグインとして登録されていた〜200個のモジュールを持っていました。過去の摂理では、インテリセンス作業を取得するために、私はすべてのモジュールファイルの先頭にVisual Studio VsDoc for JavaScriptライブラリを自動生成する
/// <reference path="" />
として(私はインテリセンスを望んでいるから)各モジュールのモジュールの参照を追加しました。
前回の世代については、すべてが欠陥があり、壊れやすく、控えめであった。
私は新しい支配下でそれを修正したいと考えています。このリファクタリングの主な目的の1つは、新しい開発者がライブラリで作業を開始できるようにすることです。Intellisenseは大きな利点があります。
現在、すべての* .jsファイルを1つのnameSpace-vsdoc.jsファイルに連結しています。すべてのクラスのすべてのメソッドは、vsdoc構文を使用して文書化されています。すべてのモジュールは、単一のvsdocリファレンスを使用します。これは正常に動作しますが、不器用です。 Intellisenseはこれまでよりも300%改善されていますが、まだ十分正確ではありません。私のXML文書はたくさんありませんし、やや複雑なオブジェクトを返すメソッドやクラスにはうまくいきません。
YUI Docは、JsDoc構文からドキュメントを作成する方法を提供していますが、Intellisenseには役立ちません。深刻なソウル・グーグル・グーグルは、第三者による解決策を明らかにしていない。
さらにIntellisenseインテリジェントな方法でVsDocsを生成するツールはありますか?
UPDATE:
いくつかの大規模な思考、テストとインクリメンタルリファクタリングの後、私はlooks like this jsFiddle基本的な名前空間を持っています。
これにより、自己実行機能で疎結合モジュールを作成することができます。自己実行機能では、名前空間に目的のメソッドを登録します。
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と:私はVS 2010のビルドイベントにアタッチしましたシンプルなPerlスクリプト、このvsdocを生成
/// <reference path="~/js/NameSpace-vsdoc.js" />
:で、モジュールのすべてが始まります_last-vsdoc.jsファイルは、コンテンツ全体を自己実行機能でラップします。私は、結果として得られるvsdocを必要に応じてClosure Compiler、YUI Compressor、Uglifyに渡します。
このプロセスは以前よりもはるかに優れていますが、それでも欠陥のないわけではありません。ゼロからスタート
、名前空間vsdoc.jsを参照NewModule.jsで、私は適切なインテリセンスを得る:しかし
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
});
}());
それが動作するので、厄介である
Ns.alert() //no Intellisense help
がね:
私はのための適切なインテリセンスを得ることはありませんoサブネームスペース上。私はこれをする必要があります:
Ns.alert = Ns.alert || Ns.register('alert', function ....
突然(明らかに)Intellisenseは期待通りに動作します。
インテリセンスは、jQueryのvsdoc(これは私がこのプロセスを構築する際に綿密に研究した)を使用して連鎖したメソッドで動作し、jQueryはそれを実現するためにy.x = y.x || new x()
トリッキーに頼らない。だからここ
が改訂質問です:構造的な観点から、私はjQueryのvsdocと自分の間に知覚することができる唯一の識別可能な違いは、jQueryの同じクロージャ内の名前空間全体を組み立てることです。私の名前空間と各モジュールは個々のクロージャで囲まれています。これと比較して、私のvsdocは、自己実行機能の長い文字列のように見えます。
閉包/モジュールパターンを推し進めすぎると、リスクが大きすぎます。この仮説を孤立して検証することは困難です。 Intellisenseは、ライブラリが小さく、したがって数千の "Javascript Intellisenseメッセージ:C:¥¥js¥NameSpace-vsdoc.js(40:16):Object required"エラーを生成できない場合にうまく機能します。
アイデア?
私はこれがあなたが探しているものではないことを知っていますが、ReSharper 6を試しましたか?それは、vsdocを必要とせずに非常に素晴らしいJavaScriptインテリセンスをサポートしています。新しい開発者のライセンスを購入し、ソースコードだけでなくvsdocsも維持する必要があるかもしれません。 –
@Ilya Volodin、ReSharperは素晴らしいです。それが提供するJavaScript Intellisenseの機能拡張は素晴らしいです。しかし、実際には、VisualStudioが仮想標準に準拠したブラウザで何をしようとしているのかだけです。 VSがJS Intellisenseをまったく提供するためには、JSエンジン(通常はIE)を使用してコードを実行する必要があります。 ReSharper _does_はこれを大幅に改善します。しかし、これは問題ではありません。 RSの有無に関わらず、jQueryには、Intellisenseを$( '#node')で取得することができます。children()。children() - これはvsdoc(afaik)に関連している必要があります。何かが欠けている。 – Christopher