Closed. This question needs to be more focused。它当前不接受答案。












想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。

2年前关闭。



Improve this question




我正在重构JavaScript库以利用单个 namespace 。我们有约200个模块,这些模块先前已将自己注册为jQuery插件或在全局对象上(错误)。在过去的版本中,为了使Intellisense正常工作,我为每个模块(我想要Intellisense)添加了模块引用,作为
/// <reference path="" />

到每个模块文件的顶部。

关于先前分配的所有内容都是有缺陷,脆弱和不雅观的。

我希望在新的版本中解决该问题。重构的主要目标之一是使新开发人员可以轻松地开始在库中工作,而Intellisense则具有极大的优势。

当前,我正在将所有* .js文件串联到单个nameSpace-vsdoc.js文件中。每个类的每个方法都使用vsdoc语法记录。每个模块都使用单个vsdoc引用。可以,但是很笨拙。 Intellisense的效果比以前提高了300%,但仍然不够准确。它错过了很多我的xml文档,并且无法很好地递归到返回稍微复杂的对象的方法/类中。

YUI Doc提供了一种从JsDoc语法构建文档的方法,但这对Intellisense没有帮助。深入的灵魂搜索未能揭示任何第三方解决方案。

是否有任何工具可以以更智能的方式生成VsDocs?

更新:

经过一番思考,测试和增量重构,我有了一个基本的命名空间looks like this jsFiddle

这使我能够在自执行函数中编写松散耦合的模块,这些函数在 namespace 中注册所需的方法。所有模块均以:
/// <reference path="~/js/NameSpace-vsdoc.js" />

我使用一个简单的Perl脚本生成了这个vsdoc,该脚本已附加到VS 2010构建事件中:
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()技巧来实现它。

这是经过修订的问题:从结构的 Angular 来看,我可以理解的jQuery的vsdoc与我自己的之间唯一可识别的区别是jQuery在同一闭包内组装了整个命名空间。我的命名空间和每个模块都包装在单独的闭包中。相比之下,我的vsdoc看起来像一长串的自执行函数。

放弃闭包/模块模式会带来太多风险;而且很难单独检验该假设。当库较小时,Intellisense可以很好地工作,因此无法生成数千个“JavaScript Intellisense消息:C:\\ js \ NameSpace-vsdoc.js(40:16):需要对象”错误。

有想法吗?

最佳答案

我同意@Ilya Volodin。
ReSharper是Visual Studio的绝佳工具。
我只用了一个月,就离不开它。

这不能回答您的问题,但是对您很有用。

这是一个很好的摘要,可以在官方网站上找到:

“ReSharper是一个著名的产品工具,使Microsoft Visual Studio IDE变得更好。世界各地成千上万的.NET开发人员想知道他们如何过着没有ReSharper的代码检查,自动重构,快速交付和编码帮助的生活。”

10-06 07:16