在玩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
thing.js
class Thing {
}
export default Thing;
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' }
]
}
};
答案 0 :(得分:20)
tl; dr: Babel不一定保留变量名称。
如果我们从
查看代码generatedimport Thing from './Thing.js';
debugger;
console.log(new Thing());
即:
'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']());
我们发现Things
确实没有定义。所以Chrome是正确的。
答案 1 :(得分:0)
在某些调试方案中,将导入的变量分配给本地作用域中的新变量可能就足够了。例如:
import Thing from './Thing.js';
const testThing = Thing;
debugger; // although Thing will not be defined, testThing will be defined
console.log(new Thing());
这不能解决当前的核心问题,但是在某些情况下可以作为调试的解决方法。