调试器期间未定义ES6模块导入

Sal*_*lar 21 javascript-debugger ecmascript-6 webpack babeljs

在玩Babel和Webpack的时候,我偶然发现了一些非常奇怪的行为.

我向我扔了一个调试器, main.js看看我是否正确导入,但Chrome的控制台一直在大喊我试图导入的模块没有定义.我尝试控制台记录相同的模块,我看到它打印到我的控制台.

是什么赋予了?我已粘贴下面的相关代码段:

main.js

import Thing from './Thing.js';

debugger // if you type Thing into the console, it is not defined

console.log(new Thing()); // if you let the script finish running, this works
Run Code Online (Sandbox Code Playgroud)

thing.js

class Thing {
}

export default Thing;
Run Code Online (Sandbox Code Playgroud)

webpack.config.js

var path = require('path');
module.exports = {
    entry: './js/main.js',
    output: {
        path: __dirname,
        filename: 'bundle.js'
    },
    module: {
        loaders: [
            { test: path.join(__dirname, 'js'), loader: 'babel-loader' }
        ]
    }
};
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 22

tl; dr: Babel不一定保留变量名称.


如果我们看一下代码生成

import Thing from './Thing.js';

debugger;

console.log(new Thing());
Run Code Online (Sandbox Code Playgroud)

即:

'use strict';

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }

var _ThingJs = require('./Thing.js');

var _ThingJs2 = _interopRequireDefault(_ThingJs);

debugger;

console.log(new _ThingJs2['default']());
Run Code Online (Sandbox Code Playgroud)

我们看到Things确实没有定义.所以Chrome是正确的.

  • 使调试器无用是一个相当大的IMO,我发现很难相信Babel会允许这样做 (18认同)