Отладка связанного javascript в Visual Studio 2015

Я использую WebPack с этим простым конфигурационным файлом, чтобы связать свое приложение.

var path = require('path');

module.exports = {
    debug: true,
    devtool: 'source-map',

    context: path.join(__dirname, 'js'),
    entry: './main.js',
    output: {
        path: path.join(__dirname, 'Built'),
        filename: '[name].bundle.js'
    }
};

Это создает исходное сопоставление, которое я могу легко использовать для отладки исходных файлов javascript во всех популярных браузерах. Однако установка точки останова в Visual Studio и запуск проекта не работают, точки останова отключены, говоря: «Для этого документа не загружены символы». Я отлаживаю через IE11, где Visual Studio может сразу отлаживать простой javascript, но после объединения это больше не работает.

Есть признак того, что сопоставление источника работает, потому что я получаю вывод консоли Unsupported format of the sourcemap. Исходная карта, сгенерированная с использованием приведенной выше конфигурации, выглядит следующим образом.

{"version":3,"sources":["webpack:///webpack/bootstrap 2919a5f916c286b8e21a","webpack:///./main.js","webpack:///./structure_editor/content.js","webpack:///./structure_editor/test_bundle.js"],"names":[],"mappings":";AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;;;;;;ACVA,8C;;;;;;ACAA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,6B","file":"main.bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 2919a5f916c286b8e21a\n **/","document.write(require(\"./structure_editor/content.js\"));\r\nvar TestBundle = require(\"./structure_editor/test_bundle.js\");\r\n\r\nvar test = new TestBundle();\r\ntest.testMe();\r\n\r\n//var StructureEditor = require(\"./structure_editor/structure_editor.js\");\r\n\r\n//var editor = new StructureEditor(0x00FF00);\r\n\r\n//editor.run();\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./main.js\n ** module id = 0\n ** module chunks = 0\n **/","module.exports = \"It works from content.js.\";\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./structure_editor/content.js\n ** module id = 1\n ** module chunks = 0\n **/","var TestBundle = function () {\r\n    \r\n}\r\n\r\nTestBundle.prototype.testMe = function() {\r\n    var a = 10;\r\n    var b = 12;\r\n    var c = a + b;\r\n    document.write(c);\r\n};\r\n\r\nmodule.exports = TestBundle;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./structure_editor/test_bundle.js\n ** module id = 2\n ** module chunks = 0\n **/"],"sourceRoot":""}

Так что я могу понять, что этот формат может не поддерживаться из-за webpack:// (хотя IE его понимает). Однако, если бы я знал, как выглядит правильный формат для VS, я мог бы настроить webpack для создания такого формата.

Я прошу любые идеи, учебные пособия и т. д., чтобы заставить это работать.


person Raven    schedule 07.09.2015    source источник
comment
Запрашивать уроки не по теме   -  person Thomas Weller    schedule 08.09.2015
comment
@Thomas Это может быть не тот случай, когда, потратив два полных дня на поиск решения, не было найдено ничего работающего или полного. Однако где-то может быть статья, которая не привлекает особого внимания и может быть доведена до меня. Во всяком случае, тон последнего предложения должен означать, что я буду очень признателен за любую помощь.   -  person Raven    schedule 08.09.2015
comment
Я также столкнулся с той же проблемой. Я сделал пару попыток с VS'13, но безуспешно. Сейчас я использую отладчик в Chrome, но я был бы очень рад, если бы кто-то нашел решение.   -  person Eduard Lepner    schedule 17.09.2015
comment
Я смог заставить его работать с машинописным текстом, внедрив исходные карты в javascript github.com/macromaniac/exbundle   -  person dog    schedule 13.01.2017


Ответы (2)


У меня нет полного решения проблемы, но я немного сузил ее.

Прежде всего необходимо убедиться, что пути как к исходной карте, так и к исходным файлам доступны для Visual Studio. Я обнаружил, что некоторые из этих запросов получали страницу входа в качестве ответа. Я предоставил анонимный доступ к карте и файлам ts. Я пытался использовать абсолютные пути файловой системы для файлов ts, которые работали для Visual Studio, но браузеры, похоже, не очень этому обрадовались.

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

devtool: 'source-map'

Это означало бы замену строки выше чем-то вроде следующего.

config.plugins.push(new webpack.SourceMapDevToolPlugin({
    filename: '[file].map',
    moduleFilenameTemplate: "[resource-path]",
    fallbackModuleFilenameTemplate: "[resource-path]?[hash]"
}));

Обратите внимание на макрос [absolute-resource-path], который приводит к путям файловой системы, которые Visual Studio может использовать для доступа к файлам, не загружая их через веб-сайт. Они выводятся в свойстве sources с обратной косой чертой, экранированной второй обратной косой чертой (например, C:\Projects\...). Как я уже отмечал выше, это сломало отладку в браузерах.

Кроме того, макрос [resource-path] разрешается во время отладки, как если бы он относился к папке, содержащей исходные карты. Это было неправильно для моей установки. Я добавил префикс и использовал что-то похожее на следующее, чтобы разобраться в этом.

"../../app/[resource-path]"

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

  • Сгенерированный столбец
  • Исходный файл, в котором он появился
  • Исходный номер строки
  • Исходный столбец
  • И при наличии оригинального названия.

Я обнаружил, что если я удалю любые короткие сегменты с концов строк, Visual Studio сможет обработать карту, и я смогу установить точки останова и т. д. в исходных файлах (файлы Typescript, которые были преобразованы в javascript, который затем был объединен в моем случае).

Чтобы удалить короткие сегменты, я использовал следующий ручной процесс в Visual Studio для каждого из файлов карты. Обратите внимание, что мне было легче интерпретировать файлы после того, как я отформатировал их, щелкнув правой кнопкой мыши в теле документа и выбрав «Форматировать документ» в контекстном меню.

  • Выполните операцию замены с включенными регулярными выражениями. Используйте следующее выражение в поле поиска и $1 в качестве значения для замены.

    ,\s*[^\s\";]{1,3}?(;|\")

введите здесь описание изображения

Это заменит любые сегменты, которые содержат только 1, 2 или 3 символа в конце строк.

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

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

    static void Main(string[] args)
    {
        var sourceMapFolder = new DirectoryInfo(args[0]);

        foreach (var sourceMapFile in sourceMapFolder.EnumerateFiles("*.map"))
        {
            var sourceMapFilePath = sourceMapFile.FullName;

            var regex = new Regex(",\\s*[^\\s\\\";]{1,3}?(;|\\\")");

            var oldContent = File.ReadAllText(sourceMapFilePath);

            var newContent = regex.Replace(oldContent, "$1");

            File.WriteAllText(sourceMapFilePath, newContent);
        }
    }

Я не уверен, является ли это Webpack, который не должен генерировать сегменты, или Visual Studio, которая должна их обрабатывать.

Обновление: я создал Ошибка на сайте Connect для Visual Studio, посвященная этой проблеме.

person Scott Munro    schedule 05.10.2015
comment
Очень красиво и тщательно, я попробую это, когда у меня будет свободное время. - person Raven; 06.10.2015
comment
@Scott Итак, теперь вы полностью можете отлаживать TypeScript, связанный с веб-пакетом, в Visual Studio 2015? Я собираюсь попробовать то, что у вас есть, и посмотреть, смогу ли я получить это дальше - person Mark Pieszak - Trilon.io; 12.05.2016
comment
@MarkPieszak Да. Отлаживаем в VS2015 без проблем. Вы также можете проверить плагин webpack от joevbruno. Я еще не пробовал, но похоже, что он должен решать эти проблемы. github.com/joevbruno/vs-fix-sourcemaps - person Scott Munro; 12.05.2016
comment
Ничего себе, я собираюсь попробовать это сегодня днем ​​и вернуться к вам. Спасибо за помощь, Скотт :) - person Mark Pieszak - Trilon.io; 12.05.2016

Я нашел решение для вашей проблемы.

В webpack.config.js добавьте этот плагин

plugins: [
  new webpack.SourceMapDevToolPlugin(
    sourceMapFilename, null,
    "[absolute-resource-path]", "[absolute-resource-path]")
]

sourceMapFilename должно быть именем вашего пакета.
Вы также можете использовать тег [name], если используете несколько точек входа.

удалите это из вашего webpack.config.js

devtool: 'source-map'

Теперь, когда вы начинаете отладку в VS с помощью Internet Explorer, вы должны использовать точки останова, которые вы установили в своих файлах .ts.

источник: https://github.com/webpack/webpack/issues/238

Надеюсь это поможет.

person datoml    schedule 28.09.2015