Im expérimentant avec ES6, et Im utilisant gulp pour construire et babel pour transpiler vers ES5. La sortie n'est pas exécutée dans node, mais simplement liée à partir d'un fichier .htm avec une balise. Je pense que je dois ajouter
<script src='require.js'></script>
ou quelque chose comme ça.
J'essaye d'importer / exporter.
////////////////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;
}
}
L'erreur est
Uncaught ReferenceError: require is not defined
Fait référence à ceci (après .pipe (babel ()) dans gulp)
var _shapes = require('shapes');
javascript
ecmascript-6
Jason
la source
la source
require
n'existe pas dans le navigateur, vous devez utiliser un outil de construction comme Require.js, Browserify ou Webpack.require
fonction (encore une fois, rien à voir avec require.js). Cependant, vous pouvez dire à Babel de convertir les modules en autre chose , par exemple AMD ou UMD, qui fonctionnerait alors avec require.js. Dans tous les cas, vous avez besoin d'un système pour charger les modules dans le navigateur, car le navigateur n'en fournit pas (encore) par défaut.Réponses:
Vous aurez peut-être besoin d'un chargeur de module, mais ce n'est pas nécessaire RequireJS. Vous avez plusieurs options. Ce qui suit vous aidera à démarrer.
rollup.js avec rollup-plugin-babel
Rollup est un bundler de modules JavaScript de nouvelle génération. Il comprend nativement les modules ES2015 et produira un bundle qui ne nécessite aucun chargeur de module pour fonctionner. Les exportations inutilisées seront supprimées de la sortie, c'est ce qu'on appelle le tremblement d'arbre.
Maintenant, je recommande personnellement d'utiliser rollupjs, car il produit le résultat le plus clair et est facile à configurer, cependant, cela donne un aspect différent à la réponse. Toutes les autres approches font ce qui suit:
Avec rollupjs, les choses ne fonctionnent pas vraiment de cette façon. Ici, le rollup est la première étape, au lieu de babel. Il ne comprend que les modules ES6 par défaut. Vous devez donner un module d'entrée dont les dépendances seront parcourues et concaténées. Comme ES6 autorise plusieurs exportations nommées dans un module, rollupjs est suffisamment intelligent pour supprimer les exportations inutilisées, réduisant ainsi la taille du bundle. Malheureusement, l'analyseur rollupjs-s ne comprend pas la syntaxe> ES6, donc les modules ES7 doivent être compilés avant que le rollup ne les analyse, mais la compilation ne devrait pas affecter les importations ES6. Cela se fait en utilisant le
rollup-plugin-babel
plugin avec lebabel-preset-es2015-rollup
preset (ce preset est le même que celui d'es2015, sauf le module transformer et le plugin external-helpers). Donc, le rollup fera ce qui suit avec vos modules s'il est correctement configuré:Exemple de build nodejs:
Exemple de construction de grunt avec grunt-rollup
Exemple de construction de gulp avec gulp-rollup
Babelify + Browserify
Babel a un package soigné appelé babelify . Son utilisation est simple et directe:
ou vous pouvez l'utiliser à partir de node.js:
Cela transpilera et concaténera votre code à la fois. Browserify
.bundle
comprendra un joli petit chargeur CommonJS, et organisera vos modules transpilés en fonctions. Vous pouvez même avoir des importations relatives.Exemple:
Pour compiler, exécutez simplement
node build.js
dans la racine de votre projet.Babel + WebPack
Compilez tout votre code en utilisant babel. Je vous recommande d'utiliser le transformateur de module amd (appelé
babel-plugin-transform-es2015-modules-amd
dans babel 6). Après cela, regroupez vos sources compilées avec WebPack.WebPack 2 est sorti! Il comprend les modules ES6 natifs et effectuera (ou plutôt simulera) le tremblement d'arbres en utilisant l' élimination intégrée du code mort de babili -s. Pour l'instant (septembre 2016), je suggérerais toujours d'utiliser le rollup avec babel, bien que mon opinion puisse changer avec la première version de WebPack 2. N'hésitez pas à discuter de vos opinions dans les commentaires.
Pipeline de compilation personnalisé
Parfois, vous souhaitez avoir plus de contrôle sur le processus de compilation. Vous pouvez implémenter votre propre pipeline comme ceci:
Tout d'abord, vous devez configurer babel pour utiliser les modules amd. Par défaut, babel transpile en modules CommonJS, ce qui est un peu compliqué à gérer dans le navigateur, bien que browserify parvienne à les gérer de manière agréable.
{ modules: 'amdStrict', ... }
optiones2015-modules-amd
pluginN'oubliez pas d'activer l'
moduleIds: true
option.Vérifiez le code transpilé pour les noms de modules générés, il y a souvent des incohérences entre les modules définis et requis. Voir sourceRoot et moduleRoot .
Enfin, vous devez avoir une sorte de chargeur de module, mais ce n'est pas nécessaire. Il y a des amandes , une minuscule cale qui fonctionne bien. Vous pouvez même implémenter le vôtre:
À la fin, vous pouvez simplement concaténer le shim du chargeur et les modules compilés ensemble, et exécuter un uglify sur cela.
Le code standard de Babel est dupliqué dans chaque module
Par défaut, la plupart des méthodes ci-dessus compilent chaque module avec babel individuellement, puis les concaténent ensemble. C'est ce que fait aussi babelify. Mais si vous regardez le code compilé, vous voyez que babel insère beaucoup de passe-partout au début de chaque fichier, la plupart d'entre eux sont dupliqués dans tous les fichiers.
Pour éviter cela, vous pouvez utiliser le
babel-plugin-transform-runtime
plugin.la source
barebones webpack 2
1) S'il s'agit de votre répertoire racine:
index.html
scripts.js
formes.js
2) ont installé noeud noeud
3) exécutez la commande suivante dans votre terminal:
5) dans votre répertoire racine, exécutez ce qui suit:
Vous devriez maintenant avoir un fichier appelé bundle.js dans votre répertoire racine qui sera le fichier que votre index.html consommera. Il s'agit d'une fonctionnalité de regroupement minimaliste de webpack. Vous pouvez en savoir plus ici
la source
require
n'existe pas dans le navigateur, cette erreur est donc attendue. Vous devez utiliser quelque chose comme require.js ou Browserify.la source