Ai-je besoin de js lorsque j'utilise babel?
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 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:
- Compilez le code ES6 avec babel, utilisez le format de module de votre choix
- Concaténez les modules compilés avec un chargeur de module OU utilisez un bundler qui parcourra les dépendances pour vous.
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 le babel-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é:
- Lit votre module ES6-7 à partir du système de fichiers
- Le plugin babel le compile vers ES6 en mémoire
- rollup analyse le code ES6 pour les importations et les exportations (à l'aide de l'analyseur acorn, compilé en rollup)
- il parcourt tout le graphe et crée un seul bundle (qui peut encore avoir des dépendances externes, et les exportations de l'entrée peuvent être exportées, dans un format de votre choix)
Exemple de build nodejs:
// setup by `npm i rollup rollup-plugin-babel babel-preset-es2015 babel-plugin-external-helpers --save-dev`
// build.js:
require("rollup").rollup({
entry: "./src/main.js",
plugins: [
require("rollup-plugin-babel")({
"presets": [["es2015", { "modules": false }]],
"plugins": ["external-helpers"]
})
]
}).then(bundle => {
var result = bundle.generate({
// output format - 'amd', 'cjs', 'es6', 'iife', 'umd'
format: 'iife'
});
require("fs").writeFileSync("./dist/bundle.js", result.code);
// sourceMaps are supported too!
}).then(null, err => console.error(err));
// setup by `npm i grunt grunt-rollup rollup-plugin-babel babel-preset-es2015 babel-plugin-external-helpers --save-dev`
// gruntfile.js
module.exports = function(grunt) {
grunt.loadNpmTasks("grunt-rollup");
grunt.initConfig({
"rollup": {
"options": {
"format": "iife",
"plugins": [
require("rollup-plugin-babel")({
"presets": [["es2015", { "modules": false }]],
"plugins": ["external-helpers"]
})
]
},
"dist": {
"files": {
"./dist/bundle.js": ["./src/main.js"]
}
}
}
});
}
Exemple de construction de gulp avec gulp-rollup
// setup by `npm i gulp gulp-rollup rollup-plugin-babel babel-preset-es2015 babel-plugin-external-helpers --save-dev`
// gulpfile.js
var gulp = require('gulp'),
rollup = require('gulp-rollup');
gulp.task('bundle', function() {
gulp.src('./src/**/*.js')
// transform the files here.
.pipe(rollup({
// any option supported by Rollup can be set here.
"format": "iife",
"plugins": [
require("rollup-plugin-babel")({
"presets": [["es2015", { "modules": false }]],
"plugins": ["external-helpers"]
})
],
entry: './src/main.js'
}))
.pipe(gulp.dest('./dist'));
});
Babel a un package soigné appelé babelify . Son utilisation est simple et directe:
$ npm install --save-dev babelify babel-preset-es2015 babel-preset-react
$ npm install -g browserify
$ browserify src/script.js -o bundle.js \
-t [ babelify --presets [ es2015 react ] ]
ou vous pouvez l'utiliser à partir de node.js:
$ npm install --save-dev browserify babelify babel-preset-es2015 babel-preset-react
...
var fs = require("fs");
var browserify = require("browserify");
browserify(["./src/script.js"])
.transform("babelify", {presets: ["es2015", "react"]})
.bundle()
.pipe(fs.createWriteStream("bundle.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:
// project structure
.
+-- src/
| +-- library/
| | \-- ModuleA.js
| +-- config.js
| \-- script.js
+-- dist/
\-- build.js
...
// build.js
var fs = require("fs");
var browserify = require("browserify");
browserify(["./src/script.js"])
.transform("babelify", {presets: ["es2015", "react"]})
.bundle()
.pipe(fs.createWriteStream("dist/bundle.js"));
// config.js
export default "Some config";
// ModuleA.js
import config from '../config';
export default "Some nice export: " + config;
// script.js
import ModuleA from './library/ModuleA';
console.log(ModuleA);
Pour compiler, exécutez simplement node build.js
dans la racine de votre projet.
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.
- Babel 5: utiliser l'
{ modules: 'amdStrict', ... }
option
- Babel 6: utilisez le
es2015-modules-amd
plugin
N'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:
var __modules = new Map();
function define(name, deps, factory) {
__modules.set(name, { n: name, d: deps, e: null, f: factory });
}
function require(name) {
const module = __modules.get(name);
if (!module.e) {
module.e = {};
module.f.apply(null, module.d.map(req));
}
return module.e;
function req(name) {
return name === 'exports' ? module.e : require(name);
}
}
À 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.
require
n'existe pas dans le navigateur, vous devez utiliser un outil de construction comme Require.js, Browserify ou Webpack.