Автогенерация Visual Studio VsDoc для библиотеки JavaScript

Я нахожусь в процессе рефакторинга моей библиотеки JavaScript для использования единого пространства имен. У нас есть ~200 модулей, которые ранее были зарегистрированы как плагины jQuery или как глобальный объект (плохо). В прошлом разрешении, чтобы заставить Intellisense работать, я добавил ссылки на модули для каждого модуля (из которого я хотел Intellisense) как

/// <reference path="" />

в начало каждого файла модуля.

Все в предыдущем устроении было порочным, хрупким и не элегантным.

Я надеюсь исправить это в новом устроении. Одна из основных целей этого рефакторинга состоит в том, чтобы облегчить начинающим разработчикам работу в библиотеке, и Intellisense имеет большую выгоду.

В настоящее время я объединяю все файлы *.js в один файл nameSpace-vsdoc.js. Каждый метод каждого класса документируется с использованием синтаксиса vsdoc. Каждый модуль использует эту единственную ссылку vsdoc. Это работает хорошо, но это неуклюже. Intellisense работает на 300% лучше, чем раньше, но все еще недостаточно точен. Он пропускает большую часть моей XML-документации и не очень хорошо подходит для методов / классов, которые возвращают даже немного сложные объекты.

YUI Doc предлагает способ создания документации из синтаксиса JsDoc, но это не помогает с Intellisense. Глубокий поиск в душе не смог выявить каких-либо сторонних решений.

Существуют ли какие-либо инструменты для создания VsDocs более интеллигентным способом?

ОБНОВИТЬ:

После долгих размышлений, тестирования и пошагового рефакторинга у меня появилось простое пространство имен, похожее на это jsFiddle.

Это позволяет мне свободно писать пару модулей в самозапускающихся функциях, которые регистрируют нужные методы в пространстве имен. Все модули начинаются с:

/// <reference path="~/js/NameSpace-vsdoc.js" />

Я генерирую этот vsdoc с помощью простого сценария Perl, который я прикрепил к событию сборки 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 по мере необходимости / необходимости.

Этот процесс работает намного лучше, чем раньше, но все же он не лишен недостатков.

Начиная с нуля, в NewModule.js, который ссылается на NameSpace-vsdoc.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 работает с цепочечными методами с использованием vsdoc jQuery (который я тщательно изучал при построении этого процесса), а jQuery не прибегает к y.x = y.x || new x() обман, чтобы это произошло.

Итак, вот пересмотренный вопрос: со структурной точки зрения единственное заметное различие, которое я могу ощутить между vsdoc и jQuery от jQuery, заключается в том, что jQuery собирает все пространство имен внутри одного и того же замыкания. Мое пространство имен и каждый из моих модулей заключены в отдельные замыкания. Для сравнения, мой vsdoc выглядит как длинная строка самовыполняющихся функций.

Просто слишком большой риск связан с отказом от шаблона замыкания / модуля; и это трудно проверить гипотезу в изоляции. Intellisense хорошо работает, когда библиотека мала и поэтому не может генерировать тысячи ошибок "Сообщение Javascript Intellisense: C:\\js\NameSpace-vsdoc.js(40:16): Требуется объект".

Идеи?

1 ответ

Я согласен с @Илья Володин. ReSharper - отличный инструмент для визуальной студии. Я пользуюсь им только месяц и без этого не могу.

Это не отвечает на ваш вопрос, но было бы очень полезно для вас.

Вот хорошее резюме, которое можно найти на официальном сайте:

"ReSharper - это известный инструмент для повышения продуктивности, благодаря которому Microsoft Visual Studio IDE становится намного лучше. Тысячи разработчиков. NET во всем мире задаются вопросом, как они когда-либо жили без проверок кода ReSharper, автоматизированного рефакторинга, быстрой доставки и помощи при написании кода".

Другие вопросы по тегам