Во время отладки переход через асинхронные функции приводит к тому, что точки останова переходят в строку объявления функции

#javascript #webpack #async-await #babeljs #core-js

Вопрос:

В настоящее время я пытаюсь отладить свой упакованный пакет Webpack. Для улучшения совместимости я использую плагин babel и corejs, чтобы сделать возможным использование функций async/await. Я также использую 'eval-source-map' исходную карту для отладки своего кода в DevTools. Проблема возникает в Firefox и Chrome DevTools.

Я хочу установить точку останова в асинхронной функции и хочу перешагнуть через ее строки. Я устанавливаю точку останова вот так:

установка точки останова

До сих пор все работало нормально. Моя точка останова распознана, и я могу приостановить выполнение кода. Теперь я нажимаю «Перейти», чтобы выполнить DOM.getInput() функцию и передать ее результат в переменную. Эта функция является нормальной синхронной функцией. Это происходит: визуализация того, что происходит при нажатии

После нажатия кнопки «Перешагнуть» точка останова переходит в строку объявления функции, при продолжении многократного нажатия кнопки «Перешагнуть» точка останова остается в течение первых нескольких шагов в строке объявления функции и внезапно заканчивается переходом через файлы node_module. Стек вызовов указывает, что эти файлы в некоторой степени вызываются из _asyncToGenerator . Я предполагаю, что это как-то связано с преобразованием асинхронных функций с помощью Babel.

Кроме того, при возникновении ошибок в асинхронных функциях часто путается стек вызовов, см. Следующее сообщение об ошибке:

сообщение об ошибке с испорченным стеком вызовов

Это происходит, хотя я правильно определил исходную карту.

Из-за этого я начал гуглить, если у кого-то была такая же проблема, и нашел эту проблему на GitHub. В принципе, у ОП по этому вопросу была та же проблема, что и у меня. Он написал следующее: «Фактическое поведение — точки останова переходят в строку объявления функции». Кто-то прокомментировал, что использование следующей конфигурации для Babel решит проблему:

 {
"env": {
"development": {
"sourceMaps": true,
"retainLines": true
}
},
"presets": [
"es2015"
]
}
 

I believe, only these settings are necessary:

 "env": {
"development": {
"sourceMaps": true,
"retainLines": true
}
 

However, I want to configure my Babel settings in the Webpack configuration file, not in a .babelrc . I probably should add them somewhere in the options object of the Babel loader, but how do I include them there, without removing my old settings? My current webpack.config.js looks like this:

 const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: './src/index.js',
  devtool: 'eval-source-map',
  mode: 'development',
  output: {
    filename: 'main.js',
    path: path.resolve(__dirname, 'dist'),
  },

  devServer: {
    client: {
      overlay: false,
    },

    static: {
      directory: path.join(__dirname, 'dist'),
    },

    port: 9000,
    hot: 'only',
  },

  module: {
      rules: [
            {
             test: /.css$/i,
             use: ['style-loader', 'css-loader'],
            },
            {
            test: /.(png|svg|jpg|jpeg|gif)$/i,
            type: 'asset/resource',
            },
            {
            test: /.(woff|woff2|eot|ttf|otf)$/i,
            type: 'asset/resource',
            },
            {
            test: /.(webm)$/i,
            type: 'asset/resource',
            },
            {
             test: /.html$/i,
             loader: 'html-loader',
            },
            {
             test: /.m?js$/,
             exclude: /(node_modules|bower_components)/,
             use: {
               loader: 'babel-loader',
               options: {
                 presets: [['@babel/preset-env', {useBuiltIns: 'usage', corejs: 3}]]
                }
            },
          },
      ],
  },

  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html',
    })
  ],
};
 

Однако, если кто-то знает лучшую попытку исправить это, пожалуйста, просто скажите мне, я с удовольствием попробую!