Babel的第6个版本改变了export default
的功能,特别是它与commonjs的require
之间的关系。
简而言之,在babel 5之前,require('module')
返回的是模块的默认输出,现在它总是返回包含模块所有导出的模块对象。
如果只想要默认值,则必须使用require('module').default
。
如此解释,这背后有非常好的原因,本问题的目的不是破坏或篡改这种行为。
然而,如果一个人正在构建一个库,他通常不想分发一个模块,而是想要分发他的库的导出值(例如,一个函数,无论内部使用什么模块系统)。
这可以通过webpack和使用commonjs或AMD时的output.library
配置很好地处理。由于早期的babel版本允许使用commonjs要求默认导出,因此babel也与这个机制兼容。但现在不再是这种情况:库现在始终提供es6模块对象。
这里有一个例子。
src/main.js
export default "my lib content";
webpack.config.js
var path = require("path");
var webpack = require("webpack");
module.exports = {
entry: {
lib: [ path.resolve(__dirname, "src/main.js") ],
},
output: {
path: path.join(__dirname, "dist"),
filename: "mylib-build.js",
library: 'myLib'
},
module: {
loaders: [
{
test: /\.js$/,
loader: "babel",
include: path.join(__dirname, "src"),
query: { presets: ['es2015'] }
}
]
}
};
test.html
<html>
<head></head>
<body>
<script src="dist/mylib-build.js"></script>
<!-- `myLib` will be attached to `window` -->
<script>
console.log(JSON.stringify(myLib)); // { default: "my lib content" }
</script>
</body>
</html>
这是一个非常简单的例子,但我显然希望导出"my lib content"
字符串而不是{ default: "my lib content" }
。
一种解决方案是创建一个 CommonJS 的导出源文件来执行转换:
module.exports = require('./main').default;
然而,我认为这个解决方案相当糟糕。应该能够在编译级别解决它,而不需要改变源代码。 有什么想法吗?
module.loaders [0] .loader
,自动添加了“-loader”部分)。尽管如此,我目前不使用.babelrc
,但我可以。但我认为所有设置都可以作为加载程序的参数进行设置。 - Quentin Roy