Babel Die 6. Version ändert die Funktionsweise von export default
und insbesondere die Beziehung zu commonjs require
.Stellen Sie sicher, dass der Webpack-Bibliotheksausgang mit babel6 kompatibel ist
Zusammenfassend, während bis babel5, require('module')
wo geben den Standard-Export des Moduls, gibt es jetzt immer das Modul-Objekt, das alle Exporte des Moduls enthält. Wenn nur der Standard gewünscht wird, muss er/sie require('module').default
verwenden. As explained here, there is very good reasons behind this und das Ziel dieser Frage ist nicht, dieses Verhalten zu brechen oder zu hacken.
Wenn jedoch eine Bibliothek erstellt wird, möchte er normalerweise kein Modul verteilen, sondern den Exportwert seiner Bibliothek (z. B. eine Funktion, welches Modulsystem auch immer intern verwendet wird). Dies wird gut durch webpack und die output.library
Konfiguration bei Verwendung commonjs oder AMD behandelt. Da frühere Babel-Versionen den Standardexport mit commonjs ermöglichen, war babel auch mit diesem Mechanismus kompatibel. Dies ist jedoch nicht mehr der Fall: Die Bibliothek stellt nun immer ein es6-Modulobjekt zur Verfügung.
Hier ist ein Beispiel.
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>
Dies ist ein sehr simpl Das Beispiel, aber ich möchte natürlich den Export von Mylib die Zeichenfolge "my lib content"
statt { default: "my lib content" }
sein.
Eine Lösung könnte sein, eine Export-Quelldatei in Commonjs zu erstellen, um die Transformation auszuführen:
module.exports = require('./main').default;
jedoch finde ich diese Lösung ziemlich schlecht. Man sollte es auf der Kompilierungsebene lösen können, ohne den Quellcode zu ändern. Irgendeine Idee?
* * Nicht ganz sicher, welche Art von Antwort Sie erwarten. Wenn Sie denken, dass dies eine Kompilierungsoption sein sollte, sollten Sie dies den Entwicklern vorschlagen. –
Die Konfiguration des Webpacks ist ziemlich leistungsstark. Es gibt viele verschiedene Plugins und viele verschiedene Parameter für alle Lader. –
Wenn Sie beispielsweise nur den Standardexport verwenden, könnte er [babel-plugin-transform-es2015-modules-commonjs] (http://babeljs.io/docs/plugins/transform-es2015-modules-commonjs/) und verwenden wandle alle seine es6-Pakete in commonjs um. –