自动生成Visual Studio VsDoc for JavaScript库
我正在重构JavaScript库以利用单个名称空间。我们有大约200个模块,它们以前注册为jQuery插件或在全局对象(bad)上。在过去的豁免中,为了让Intellisense正常工作,我为每个模块(我想要Intellisense的模块)添加了模块引用,作为 但是,当我将NewModule.js定义为(并编译)时: 我没有获得适当的智能感知:自动生成Visual Studio VsDoc for JavaScript库,javascript,visual-studio,documentation,intellisense,vsdoc,Javascript,Visual Studio,Documentation,Intellisense,Vsdoc,我正在重构JavaScript库以利用单个名称空间。我们有大约200个模块,它们以前注册为jQuery插件或在全局对象(bad)上。在过去的豁免中,为了让Intellisense正常工作,我为每个模块(我想要Intellisense的模块)添加了模块引用,作为 但是,当我将NewModule.js定义为(并编译)时: 我没有获得适当的智能感知: Ns.alert() //no Intellisense help 这是令人困惑的,因为它在子名称空间上工作得非常好。我被迫这样做: Ns.alert
Ns.alert() //no Intellisense help
这是令人困惑的,因为它在子名称空间上工作得非常好。我被迫这样做:
Ns.alert = Ns.alert || Ns.register('alert', function ....
编译后,Intellisense突然(显然)按预期工作
Intellisense使用jQuery的vsdoc(我在构建这个过程中仔细研究了vsdoc)与链式方法一起工作,而jQuery没有使用y.x=y.x | | new x()
技巧来实现它
因此,这里有一个修改后的问题:从结构的角度来看,我能感觉到jQuery的vsdoc和我自己的vsdoc之间唯一明显的区别是jQuery在同一个闭包中组装了整个名称空间。我的命名空间和每个模块都包装在单独的闭包中。相比之下,我的vsdoc看起来像一个长串的自执行函数
与放弃关闭/模块模式相关的风险太大;而且很难单独检验这个假设。当库很小时,Intellisense工作正常,因此无法生成数千个“Javascript Intellisense消息:C:\\js\NameSpace vsdoc.js(40:16):需要对象”错误
想法?我同意@Ilya Volodin。 ReSharper是VisualStudio的一个很好的工具。 我只用了一个月,我不能没有它 这并不能回答您的问题,但它对您非常有用 以下是一个很好的总结,可以在官方网站上找到:
“ReSharper是一个著名的高效工具,它使Microsoft Visual Studio IDE变得更好。全球成千上万的.NET开发人员都想知道,如果没有ReSharper的代码检查、自动重构、快速发布和编码帮助,他们是如何生活的。”我知道这不是你想要的,但是你试过ReSharper6吗?它有一个非常好的JavaScript intellisense支持,而不需要vsdoc。也许为新开发人员购买许可证会更容易,然后不仅要维护源代码,还要维护vsdocs?@Ilya Volodin,ReSharper真是太棒了。它提供的JavaScript Intellisense的增强非常棒;然而,它实际上只是在做VisualStudio试图在符合标准的虚拟浏览器中做的事情。为了让VS提供JS Intellisense,它必须使用JS引擎(通常是IE引擎)错误地执行代码。ReSharper确实大大改进了这一点;但这不是问题所在。同样,对于jQuery,无论是否使用RS,我都可以在$('#node').children().children()上获得链式Intellisense——这必须与他们的vsdoc(afaik)相关,但我仍然缺少一些东西;但是,它本身并不能解决这个问题。我们目前使用的是Resharper 7,它不包括用于命名空间脚本文件的intellisense。如果您有一个名为
AppName.Customer.Address
的文件Address.js
,并且它有一个方法ValidateCustomerAddress()
,例如在另一个名为命名空间的文件中调用stringhasnonnumbers()
,名为Util.js
名称空间为AppName.Common.Util
则intellisense将找不到AppName.Common.Util.StringHasnonNumber()
,因为它不在AppName.Customer.Address
名称空间的范围内。添加///reference…
,Resharper可以为您提供命名空间文件的intellisense。仅供参考,Resharper将我的Visual Studio实例拖慢了一段时间,不值得这么做。
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");
Ns.register() //visible
Ns.controls.register() //visible
Ns.actions.register() //visible
(function _alertClosure() {
Ns.register('alert', function alert(someText) {
///insert proper vsdoc style comment
});
}());
Ns.alert() //no Intellisense help
Ns.alert = Ns.alert || Ns.register('alert', function ....