Angular 2 - Ecrire son application avec JSPM & Babel
Cet article va se reposer sur l'application "superheroes" que j'avais écrit pour les articles suivants:
- Angular 2 - Part I - A new hope (or not) ?
- Angular 2 - Part II - Angular strikes back (or not) ?
- Angular 2 - Part III - Return of the Angular (or not) ?
- Angular 2 - Ecrire son application avec TypeScript
Dans le premier article de la série, nous étions parti sur JSPM & TypeScript qui est le plus poussé par les équipes Angular.
Personnellement, j'aime bien Babel. Ce dernier évolue très rapidement et possède de nombreux plugins permettant de gérer un grand nombre de fonctionnalités ES6 / ES7.
Du coup, au tout début, j'avais plutôt envie pour mon application de super-héros de l'utiliser. Le hic est qu'il y avait une incompatibilité entre JSPM et les plugins Babel. En effet, il n'était pas possible de charger les plugins Babel via JSPM.
Désormais, cela est corrigé depuis https://github.com/jspm/jspm-cli/releases/tag/0.17.0-beta.4. En effet, dorénavant, les loader des transpilers sont différents, notamment celui de Babel qui se reposent sur le plugin de SystemJs pour Babel. Cela afin de pouvoir mieux gérer les plugins Babel.
Le code à modifier
Bon, il va y avoir un peu de code à modifier. Pour ce faire, il faut tout d'abord modifier le service "app/services/superheroes" où l'annotation "@Injectable()" n'est pas présent, ce qui n'est pas conforme à Angular 2 (même si cela fonctionnait avec la version TypeScript !).
En revanche, c'est l'injection du service qui change. Au lieu d'utiliser l'annotation "@Inject" sur les paramètres du constructeur:
/** * @constructor * @param {SuperHeroesService} superHeroesService */constructor(@Inject(SuperHeroesService) superHeroesService) {
this.superHeroesService = superHeroesService;
}
Nous allons plutôt privilégié l'approche "type assertion" où le typage du paramètre servira pour l'injection:
/** * @constructor * @param {SuperHeroesService} superHeroesService */constructor(superHeroesService: SuperHeroesService) {
this.superHeroesService = superHeroesService;
}
JSPM & Babel
Là, ça va être un peu plus compliqué. Tout d'abord, installé la version de jspm qui permet de gérer mieux les plugins Babel:
> npm install -g jspm@0.17.0-beta.5
Ensuite, nous allons régénérer les fichiers de configuration de JSPM:
> jspm init
Là, nous allons avoir deux fichiers:
- jspm.browser.js
- jspm.config.js
Il faudra d'abord charger le fichier "jspm.browser.js" avant celui de "jspm.config.js".
Ensuite, nous allons modifier "jspm.browser.js" en:
- Modifiant la baseURL (en la mettant vide)
- En indiquant le fait que nous omettons l'extension des fichiers JavaScript lors de l'import
SystemJS.config({ baseURL: "", defaultJSExtensions: true, paths: { "github:*": "jspm_packages/github/*", "npm:*": "jspm_packages/npm/*", "angular2-superheroes-babel/": "app/" } });
Maintenant, nous allons installé l'ensemble des plugins / frameworks nécessaires à notre développement.
Tout d'abord ceux pour angular2:
> jspm install angular2 core-js css reflect-metadata npm:@reactivex/rxjs
Puis ceux pour babel:
> jspm install npm:angular2-annotations npm:babel-plugin-transform-class-properties npm:babel-plugin-transform-flow-strip-types
Et enfin, modifier le fichier "jspm.config.js" afin d'ajouter les options suivantes pour Babel via JSPM (la section "babelOptions"):
SystemJS.config({ packageConfigPaths: [ "npm:@*/*.json", "npm:*.json", "github:*/*.json" ], globalEvaluationScope: false, transpiler: "plugin-babel", babelOptions: { "stage": 0, "optional": [ "runtime", "optimisation.modules.system", "es7.decorators" ], "plugins": [ "babel-plugin-angular2-annotations", "babel-plugin-transform-decorators-legacy", "babel-plugin-transform-flow-strip-types", "babel-plugin-transform-class-properties" ] },
Et notre application fonctionnera :)
Commentaires
Enregistrer un commentaire