Je veux commencer à utiliser ES6 et utiliser grunt pour gérer mes fichiers. Voici la structure de mon projet jusqu'à présent:
Gruntfile.js
package.json
dist/
src/
index.es6
Et voici à quoi ressemble index.es6
:
import MapGL from 'react-map-gl';
const data = [];
const viewport = new Viewport();
Ces packages sont tous définis dans package.json
Et installés.
Comment transformer ce fichier ES6 en JavaScript ES5? À droite, je suis en mesure de le transformer en JavaScript, mais cela ne transforme pas du tout les instructions require
.
Voici mon Gruntfile actuel:
module.exports = function(grunt) {
require('load-grunt-tasks')(grunt);
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
concat: {
options: {
separator: ';'
},
dist: {
src: ['src/**/*.js'],
dest: 'dist/<%= pkg.name %>.js'
}
},
uglify: {
options: {
banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n'
},
dist: {
files: {
'dist/<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>']
}
}
},
jshint: {
files: ['src/index.js', 'test/index.js'],
options: {
reporterOutput: '',
esnext: true,
globals: {
console: true,
module: true,
document: true
}
}
},
babel: {
files: {
expand: true,
src: ['src/*.es6'],
ext: '-compiled.js'
},
options: {
sourceMap: true,
presets: ['babel-preset-es2015']
}
},
watch: {
files: ['<%= jshint.files %>'],
tasks: ['babel', 'jshint', 'concat']
}
});
grunt.registerTask('default', ['babel', 'jshint', 'concat', 'uglify']);
};
L'exécution de grunt
produit les fichiers suivants:
Gruntfile.js
package.json
dist/
myproject.js
src/
index.es6
index-compiled.js
index-compiled.map
Mais myproject.js
Contient la ligne var _reactMapGl = require('react-map-gl');
qui échoue dans le navigateur.
Oui, conformément à la recommandation @ Matthew Herbst , Browserify gérera les liaisons import
pour les modules ES6. Un package nommé babelify aidera également à gérer votre transformation babel browserify.
Les éléments suivants semblent bien fonctionner:
babel-cli
au lieu de babel
.Il est à noter que Babel a été remplacé par babel-cli à partir de babel 6 (voir leur blog pour plus d'informations à ce sujet ). Donc, tout d'abord, supprimez/désinstallez-le de votre package.json
(s'il existe!):
$ npm uninstall babel --save-dev
... et désinstaller grunt-babel :
$ npm uninstall grunt-babel --save-dev
Installez babel-cli et incluez également le préréglage babel pour tous les plugins es2015 :
$ npm install --save-dev babel-cli babel-preset-es2015
Ensuite, créez un fichier . Babelrc et enregistrez-le dans le répertoire racine de vos projets contenant le code suivant:
{
"presets": ["es2015"]
}
grunt-browserify
Ensuite, installez grunt-browserify et enregistrez-le dans votre package.json
:
$ npm install grunt-browserify --save-dev
babelify
Installez babelify pour gérer votre transformation babel browserify:
$ npm install babelify --save-dev
Gruntfile.js
Gruntfile.js
en supprimant la tâche babel
existante: // DELETE the following...
babel: {
files: {
expand: true,
src: ['src/*.es6'],
ext: '-compiled.js'
},
options: {
sourceMap: true,
presets: ['babel-preset-es2015']
}
},
browserify
suivante à la place: browserify: {
dist: {
files: {
// destination for transpiled js : source js
'dist/myproject.js': 'src/index.es6'
},
options: {
transform: [['babelify', { presets: "es2015" }]],
browserifyOptions: {
debug: true
}
}
}
}
grunt.registerTask
. Pour ça:grunt.registerTask('default', [
'jshint',
//'concat', <-- Probably don't need to concat the files, assuming index.es6 imports the necessary modules.
'browserify:dist',
'uglify'
]);
Il y a peut-être certains avantages à utiliser réagir aux préréglages en plus des préréglages es2015 - ce qui impliquerait de modifier les points 2, 3 et 7 ci-dessus en conséquence, cependant, je ne l'ai pas utilisé moi-même.
J'espère que cela t'aides!