Статьи

Отладка JavaScript с использованием кросс-браузерных исходных карт

Как разработчик JavaScript, я уверен, что вы уже попали в этот сценарий: что-то не так с рабочей версией вашего кода, и отладка его непосредственно с рабочего сервера — это кошмар просто потому, что он был минимизирован или был скомпилирован из другого языка, такого как TypeScript или CoffeeScript.

Хорошие новости? Последние версии браузеров могут помочь вам решить эту проблему с помощью исходных карт. В этом уроке я покажу вам, как найти исходные карты во всех браузерах и получить максимальную отдачу от тех нескольких минут, которые вы должны отлаживать.

Согласно замечательной статье « Введение в JavaScript Source Maps» , карта «источник» — это « способ сопоставить объединенный / свернутый файл обратно с непостроенным состоянием . Когда вы создаете для производства, наряду с минимизацией и объединением ваших файлов JavaScript, вы генерируете исходную карту, которая содержит информацию о ваших исходных файлах ».

Пожалуйста, не стесняйтесь сначала прочитать статью Райана Седдона , так как в ней подробно рассказывается, как работает исходная карта. Затем вы узнаете, что исходная карта использует промежуточный файл, который выполняет сравнение между рабочей версией вашего кода и его исходным состоянием разработки. Формат этого файла описан здесь: Source Map Revision 3 Proposal .

Теперь, чтобы проиллюстрировать это, я расскажу о том, как мы в настоящее время работаем при разработке нашей среды с открытым исходным кодом WebGLBabylon.js . Это написано на TypeScript . Но принципы останутся прежними, если вы используете простой сжатый / минимизированный JavaScript или другие языки, такие как CoffeeScript.

Давайте теперь поиграем с магией исходных карт прямо в браузерах.

Недавно я реализовал поддержку API Gamepad в нашем игровом движке . Давайте использовать его код для этого урока.

В этой статье я использую следующие браузеры:

Перейдите по этому адресу: http://david.blob.core.windows.net/babylonjs/gamepad/index.html, и вы получите эту страницу:

Тестовая страница GamePad

Подключите контроллер Xbox 360 или Xbox One к USB-порту компьютера. Нажмите кнопку A , чтобы активировать геймпад и поиграть с ним:

Тестовая страница GamePad Общие свойства

Но не волнуйтесь, вам не понадобится контроллер геймпада, чтобы следовать этому уроку .

Примечание. Компилятор TypeScript автоматически создает исходную карту для вас. Если вы хотите сгенерировать исходную карту при создании минимизированной версии кода, я бы порекомендовал использовать UglifyJS2 .

Для этой статьи я даже смешал оба. Я минимизировал JS, сгенерированный TypeScript, и сохранил исходное отображение без изменений, используя эту командную строку:

1
uglifyjs testgamepad.js -o testgamepad.min.js —source-map testgamepad.min.js.map —in-source-map testgamepad.js.map

После загрузки тестовой страницы GamePad нажмите F12 в IE11.

Вы увидите, что источник HTML ссылается на два файла JavaScript: babylon.gamepads.js в начале страницы и testgamepad.min.js в самом конце. Первый файл исходит из нашего фреймворка на GitHub , а второй — простой пример, показывающий, как его использовать.

Нажмите на кнопку отладчика (или Control-3 ), а затем нажмите на значок папки.

Вы увидите, что IE11 предлагает два файла для отладки: babylon.gamepads.ts и testgamepad.min.js .

Экран отладчика в Internet Explorer

Давайте начнем с рассмотрения случая babylon.gamepads.ts . Почему IE показывает это вместо версии .js, выполняемой браузером?

Это благодаря механизму карты источника. В конце файла babylon.gamepads.js вы можете найти эту конкретную строку:

1
//# sourceMappingURL=babylon.gamepads.js.map

Откройте babylon.gamepads.js.map, чтобы понять, как это работает:

1
2
3
4
5
{ «version»: 3,
   «file»: «babylon.gamepads.js»,
   «sourceRoot»: «»,
   «sources»: [ «babylon.gamepads.ts» ],
   «names»: [ «BABYLON», «BABYLON.Gamepads», … ] }

Читая этот файл JSON, IE11 знает, что он должен отображать « babylon.gamepads. ts »до« babylon.gamepads. JS ». Вот почему он прямо предлагает отлаживать исходный код TypeScript вместо скомпилированной версии JS.

Откройте babylon.gamepad.ts в консоли IE11 F12, и вы увидите что-то, чего вы, возможно, никогда раньше не видели, какой-нибудь язык TypeScript:

babylongamepadts в консоли IE11 F12, показывающий язык TypeScript

Вы можете отлаживать его, как вы привыкли к отладке JS-кода, даже если это скомпилированная версия JavaScript, выполняемая в настоящее время браузером.

Установите точку останова в строке 17 и нажмите F5 в окне браузера. Вы сможете отладить версию конструктора TypeScript:

Строка 17 выделена в отладчике

Перейдите к строке 20, наведите на нее курсор и разверните ее, чтобы убедиться, что для gamepadEventSupported установлено значение true :

Подведите курсор мыши к строке 20 и разверните ее, чтобы убедиться, что для gamepadEventSupported установлено значение true

Загрузите ту же страницу: http://david.blob.core.windows.net/babylonjs/gamepad/index.html и нажмите F12 в Chrome или Control-Shift-I в Opera.

Страница инструментов разработчика Chrome

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

Включена опция включения исходных карт JavaScript

Chrome и Opera позволяют просматривать выполненный код babylon.gamepads.js , но если вы попытаетесь установить точку останова в версии JavaScript, она не будет отображаться. Вместо этого он будет установлен в исходном коде, сопоставленном с этой версией: babylon.gamepads.ts .

Например, попробуйте установить точку останова в строке 18 JavaScript-файла babylon.gamepads.js, и вы увидите, что она будет установлена ​​в строке 17 файла TypeScript babylon.gamepads.ts :

строка 17 файла TypeScript babylongamepadsts

Конечно, вы также можете установить соответствующие точки останова непосредственно в исходном коде TypeScript, как это было в IE11.

Нажмите F5 в окне браузера, где находится наша демонстрационная страница, и вы сможете отлаживать мой код TypeScript. Перейдите к строке 20 и наведите курсор на переменную this.gamepadEventSupported . Должно отображаться true :

thisgamepadEventSupported переменная, отображающая true

Загрузите ту же страницу: http://david.blob.core.windows.net/babylonjs/gamepad/index.html и нажмите Control-Shift-S, чтобы открыть собственный отладчик (не используйте F12 / Firebug, потому что он не не поддерживает исходные карты).

Убедитесь, что опция Показать оригинальные источники отмечена:

Опция Показать оригинальные источники отмечена

Установите обычную точку останова в строке 17 и перезагрузите страницу, чтобы перейти в код. Firefox не поддерживает наведение мыши на исходный код. Перейдите к строке 20 и разверните объект this в правой панели, чтобы убедиться, что gamepadEventSupported имеет значение true.

Линия 20

До сих пор мы отлаживали только код babylon.gamepads.js с использованием источника babylon.gamepads.ts . Но как насчет этого уменьшенного файла JavaScript testgamepad.min.js ?

Первое решение состоит в том, чтобы предварительно оптимизировать код. Работает с IE11, Chrome, Opera и Firefox.

В IE11 нажмите кнопку Pretty print или нажмите Control-Shift-P :

Красивая кнопка печати в IE11

В Chrome / Opera нажмите кнопку {} :

В ChromeOpera нажмите кнопку

В Firefox нажмите также кнопку {} :

В Firefox нажмите кнопку

Это намного лучше, но все же не так хорошо, как было с исходной картой. Чтобы иметь возможность пойти дальше, мы добавили новую функцию в обновлении IE11 от августа 2014 года . Вы можете загрузить исходную карту, даже если вы удалили ее из файла .js.

Представьте, что вы хотите запретить кому-либо легко отлаживать производственный код вашего веб-приложения с помощью карты исходного кода, но вы все еще хотите это делать? Просто удалите строку sourceMappingURL из вашего файла .js.

Используя Internet Explorer 11, вы все равно можете использовать исходную карту, загрузив свой локальный .map и связанный исходный код. Для этого щелкните правой кнопкой мыши вкладку testgamepad.min.js и нажмите « Выбрать исходную карту» :

щелкните правой кнопкой мыши на вкладке testgamepadminjs и нажмите Выбрать исходную карту.

Загрузите их здесь: http://david.blob.core.windows.net/babylonjs/gamepad/testgamepad.zip .

Разархивируйте его в выбранном вами каталоге и перейдите к нему, чтобы выбрать правильный файл .map :

Диалоговое окно "Открыть файл карты"

И теперь исходный код может быть снова отлажен:

Экран отладчика F12 в IE

Обратите внимание, что вкладка была переименована в testgamepad.ts и что первые переменные теперь набираются, когда мы показываем некоторый TypeScript.

Круто, не правда ли?

Эта статья является частью серии технологий веб-разработки от Microsoft. Мы рады поделиться с вами Microsoft Edge и новым механизмом рендеринга EdgeHTML . Получите бесплатные виртуальные машины или проведите удаленное тестирование на устройстве Mac, iOS, Android или Windows @ http://dev.modern.ie/ .

Изучите JavaScript: полное руководство

Мы создали полное руководство, которое поможет вам изучить JavaScript , независимо от того, начинаете ли вы как веб-разработчик или хотите изучать более сложные темы.