В предыдущей заметке я рассматривал существующие решения «псевдо-компиляции» яваскрипта и интеграции этих решений в asp.net проекты.
В итоге не найдя ничего идеального и решив, что собственный велосипед здесь не помешает, я и написал утилиту под названием jsvalidator. Найти её можно на codeplex, там же есть и краткое описание установки и конфигурирования. Данная заметка, по сути, будет переводом «официальной документации» собственного же сочинения :)
Если коротко, то jsvalidator это build-step с json-like конфигурационным файлом, проверяющая яваскрипт с помощью java-библиотеки google closure. Из этого следует и первое требование — для работы утилиты необходима установленная на компьютере java (с java.exe добавленным в системные пути (system PATH)).
После интеграции утилиты на каждый билд в вашей Visual Studio будет нечто вроде:
(в данном случае утилита сообщает нам о необъявленной переменной asd, по двойному клику на ошибке откроется js-файл на строчке с ошибкой, как мы и привыкли).
Для работы JsValidator’a необходимо установить java и добавить java.exe в системный PATH.
Для интеграции jsvalidator’a в проект достаточно установить nuget-пакет JsValidator. Если вы не используете нугет, то можно все шаги, которые пакет сделает автоматически, проделать вручную:
- Скачать бинарники библиотеки и распаковать например в папку $(SolutionDir)/JsValidatorBin.
- Создать конфигурационный файл в ASP.Net проекте (например, в Scripts/jsvalidator/config.js). В простейшем случае он может выглядеть так:
{ "inputs": [ "../_test.js" ] }
Путь к файлу _test.js может быть заменен на путь к любому js-файлу вашего проекта (или папке с js-файлами). Все пути должны указываться относительно расположения конфигурационного файла config.js.
- Добавить JsValidator как post-build-event (Project/Properties/Build events/Post-build event command line) к вашему asp.net проекту. Строка post-build-event’a может выглядеть так:
"$(SolutionDir)JsValidatorBin\jsvalidator.exe" "$(ProjectDir)Scripts\jsvalidator\config.js"
(если вы распаковывали jsvalidator в пути отличные от примеров, то пути нужно будет исправить)
- Вот и всё! Скомпилируйте ваш проект и убедитесь, что в ваших яваскриптах ошибок нет :)
Выше я привел пример простейшего конфигурационного файла, состоящего из одной строчки. Реальные конфиги не намного сложнее. Вот пример одного из них:
{ inputs: [ "../../Scripts/zw_Runtime.js", "../../Scripts/UC/", "../../Scripts/jquery.common.js"], externs: ["//jquery-1.7.js"], IgnoreAllWarnings: "true", Warnings: [".* is never defined"] }
Расшифрую, за что отвечает каждый из параметров:
- inputs (массив строк). Специфицирует пути к файлам/папкам для проверки. Самая простая, очевидная и нужная опция :)
- externs (массив строк). Специфицирует внешние библиотеки, необходимые для валидации (jquery, mootols, и.т.д.). Аналог параметра externs в google closure. У гугла есть ряд «документированных» версий популярных библиотек, подготовленных к подключению в качестве внешних. Библиотеки из этого источника могут быть использованы с помощью префикса «//». В примере выше мы говорим, что в наших файлах возможно использование библиотеки jquery версии 1.7.
- IgnoreAllWarnings (bool). «true» или «false» (по умолчанию — «false»). Во время компиляции closure compiler находит в js коде ошибки и предупреждения. При выставлении флага в true все предупреждения будут игнорироваться (и не будут отображаться в VS в секции warnings). Обычно, «предупреждений» достаточно много, и я обычно выставляю значение флага в true, предварительно конвертировав нужные мне «предупреждения» в «ошибки» (с использованием опции Warnings)
- Warnings (массив строк). Список регекспов; подходящие под регексп «предупреждения» переводятся в статус «ошибок».
Есть еще некоторые опции, которые не упомянуты в примере, но могут оказаться полезными:
- TreatNoJavaAsWarning (bool). Значения «true» или «false» (по умолчанию — «false», то есть при отсутствии на компьютере установленной Java будет сгенерирована ошибка)
- IgnoreWarnings (массив строк). Список регекспов, подходящие под регексп «предупреждения» отметаются.
Есть и некоторые другие параметры, которые зеркалируют параметры closure compiler’a. Изменение этих параметров обычно не требуется, они описаны детальнее на странице проекта (CompilationLevel, WarningLevel, Ccargs).
Для упрощения использования в ближайшее время планирую собрать nuget-пакет.
Upd.: пакет собран — https://nuget.org/packages/JsValidator/
[/code]
(если вы распаковывали jsvalidator в пути отличные от примеров, то пути нужно будет исправить)