Ich experimentiere mit ES6 und ich benutze Schluck, um zu bauen und Babel, um zu ES5 zu transpilieren. Die Ausgabe wird nicht im Knoten ausgeführt, sondern nur mit einer .htm-Datei mit einem Tag verknüpft. Ich denke, ich muss hinzufügen
<script src='require.js'></script>
oder etwas ähnliches.
Ich versuche zu importieren / exportieren.
////////////////scripts.js
import {Circle} from 'shapes';
c = new Circle(4);
console.log(c.area());
/////////////////shapes.js
export class Circle {
circle(radius) {
this.radius = radius;
}
area() {
return this.radius * this.radius * Math.PI;
}
}
Fehler ist
Uncaught ReferenceError: require is not defined
Bezieht sich darauf (nach .pipe (babel ()) in gulp)
var _shapes = require('shapes');
javascript
ecmascript-6
Jason
quelle
quelle
require
der Browser nicht vorhanden ist, müssen Sie ein Build-Tool wie Require.js, Browserify oder Webpack verwenden.require
Funktion (wiederum nichts mit require.js zu tun). Allerdings können Sie Babel sagen Module etwas zu konvertieren sonst , zB AMD oder UMD, die dann mit require.js funktionieren würde. In beiden Fällen benötigen Sie ein System zum Laden von Modulen in den Browser, da der Browser (noch) nicht standardmäßig eines bereitstellt.Antworten:
Möglicherweise benötigen Sie einen Modullader, dies ist jedoch nicht erforderlich. RequireJS. Sie haben mehrere Möglichkeiten. Das Folgende hilft Ihnen beim Einstieg.
rollup.js mit rollup-plugin-babel
Rollup ist ein JavaScript-Modulbündler der nächsten Generation. Es versteht ES2015-Module von Haus aus und erstellt ein Bundle, für dessen Betrieb kein Modullader erforderlich ist. Nicht verwendete Exporte werden von der Ausgabe abgeschnitten, dies wird als Baumschütteln bezeichnet.
Jetzt empfehle ich persönlich die Verwendung von rollupjs, da es die klarste Ausgabe erzeugt und einfach einzurichten ist. Die Antwort erhält jedoch einen anderen Aspekt. Alle anderen Ansätze machen Folgendes:
Mit rollupjs funktionieren die Dinge nicht wirklich so. Hier ist Rollup der erste Schritt anstelle von Babel. Standardmäßig werden nur ES6-Module verstanden. Sie müssen ein Eingabemodul angeben, dessen Abhängigkeiten durchlaufen und verkettet werden. Da ES6 mehrere benannte Exporte in einem Modul zulässt, ist rollupjs intelligent genug, um nicht verwendete Exporte zu entfernen und so die Bundle-Größe zu verringern. Leider versteht der Parser von rollupjs-s die> ES6-Syntax nicht, sodass ES7-Module kompiliert werden müssen, bevor sie vom Rollup analysiert werden. Die Kompilierung sollte jedoch keine Auswirkungen auf die ES6-Importe haben. Dies erfolgt mithilfe des
rollup-plugin-babel
Plugins mit derbabel-preset-es2015-rollup
Voreinstellung (diese Voreinstellung ist dieselbe wie die es2015, mit Ausnahme des Modultransformators und des Plugins für externe Helfer). Das Rollup führt bei korrekter Einrichtung Folgendes mit Ihren Modulen aus:Beispiel für den Build von nodejs:
Beispiel Grunz Build mit Grunz-Rollup
Beispiel für einen Gulp-Build mit Gulp-Rollup
Babelify + Browserify
Babel hat ein ordentliches Paket namens babelify . Die Verwendung ist einfach und unkompliziert:
oder Sie können es von node.js verwenden:
Dadurch wird Ihr Code sofort transpiliert und verkettet. Browserify's
.bundle
wird einen netten kleinen CommonJS-Loader enthalten und Ihre transpilierten Module in Funktionen organisieren. Sie können sogar relative Importe haben.Beispiel:
Zum Kompilieren einfach
node build.js
in Ihrem Projektstamm ausführen .Babel + WebPack
Kompilieren Sie Ihren gesamten Code mit babel. Ich empfehle Ihnen, den amd-Modultransformator (
babel-plugin-transform-es2015-modules-amd
in Babel 6 genannt) zu verwenden. Danach bündeln Sie Ihre kompilierten Quellen mit WebPack.WebPack 2 ist da! Es versteht native ES6-Module und führt (oder simuliert) das Schütteln von Bäumen mithilfe der in Babili integrierten Eliminierung von totem Code durch. Im Moment (September 2016) würde ich immer noch vorschlagen, Rollup mit Babel zu verwenden, obwohl sich meine Meinung mit der ersten Version von WebPack 2 ändern könnte. Sie können Ihre Meinung gerne in den Kommentaren diskutieren.
Benutzerdefinierte Kompilierungspipeline
Manchmal möchten Sie mehr Kontrolle über den Kompilierungsprozess haben. Sie können Ihre eigene Pipeline folgendermaßen implementieren:
Zuerst müssen Sie babel für die Verwendung von amd-Modulen konfigurieren. Standardmäßig transpiliert babel in CommonJS-Module, was im Browser etwas kompliziert zu handhaben ist, obwohl browserify es schafft, sie auf nette Weise zu handhaben.
{ modules: 'amdStrict', ... }
Option verwendenes2015-modules-amd
PluginVergessen Sie nicht, die
moduleIds: true
Option zu aktivieren.Überprüfen Sie den transpilierten Code auf generierte Modulnamen. Oft gibt es Abweichungen zwischen definierten und erforderlichen Modulen. Siehe sourceRoot und moduleRoot .
Schließlich müssen Sie eine Art Modullader haben, aber es ist nicht unbedingt erforderlich. Es gibt Mandeln , eine winzige Unterlegscheibe, die gut funktioniert. Sie können sogar Ihre eigenen implementieren:
Am Ende können Sie einfach den Loader-Shim und die kompilierten Module miteinander verketten und darauf ein uglify ausführen.
Babels Boilerplate-Code wird in jedem Modul dupliziert
Standardmäßig kompilieren die meisten der oben genannten Methoden jedes Modul mit babel einzeln und verketten sie dann miteinander. Das macht babelify auch. Wenn Sie sich jedoch den kompilierten Code ansehen, sehen Sie, dass Babel am Anfang jeder Datei eine Menge Boilerplate einfügt. Die meisten davon werden in allen Dateien dupliziert.
Um dies zu verhindern, können Sie das
babel-plugin-transform-runtime
Plugin verwenden.quelle
Barebones Webpack 2
1) Wenn dies Ihr Stammverzeichnis ist:
index.html
scripts.js
Formen.js
2) Knoten installiert Knoten
3) Führen Sie den folgenden Befehl in Ihrem Terminal aus:
5) Führen Sie in Ihrem Stammverzeichnis Folgendes aus:
Sie sollten jetzt eine Datei namens bundle.js in Ihrem Stammverzeichnis haben, die die Datei ist, die Ihre index.html verbraucht. Dies ist eine minimalistische Bündelungsfunktion von Webpack. Sie können erfahren Sie mehr hier
quelle
require
ist im Browser nicht vorhanden, daher wird dieser Fehler erwartet. Sie müssen so etwas wie require.js oder Browserify verwenden.quelle