Babel 6-я версия изменяет работу export default
и, в частности, ее связь с commonjs require
.
Подводя итог, пока до babel5, require('module')
, где предоставляется экспорт по умолчанию модуля, он теперь всегда возвращает объект модуля, содержащий все экспортные данные модуля.
Если требуется только по умолчанию, он должен использовать require('module').default
.
Как объясняется здесь, для этого есть очень веские причины, и цель этого вопроса заключается не в том, чтобы сломать или взломать это поведение.
Однако, если вы создаете библиотеку, он обычно не хочет распространять модуль, а значение экспорта его библиотеки (например, функция, независимо от того, какая система модулей используется внутри).
Это хорошо рассмотрено webpack и конфигурацией output.library
при использовании commonjs или AMD. Поскольку предыдущие версии 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>
Это очень простой пример, но я, очевидно, хочу, чтобы экспорт mylib был строкой "my lib content"
вместо { default: "my lib content" }
.
Одним из решений может быть создание исходного файла экспорта в commonjs для выполнения преобразования:
module.exports = require('./main').default;
Однако я нахожу это решение довольно плохим. Нужно уметь решать его на уровне компиляции без изменения исходного кода. Любая идея?