# Aller plus loin
# Transpiler les fonctions async
Parcel fait énormément de choses sans configuration. Néanmoins, pour transpiler les fonctions async (opens new window), il faut donner à babel (opens new window) (utilisé sous le capot par parcel) quelques plugins et informations supplémentaires.
Créer un fichier .babelrc
dans le dossier client
avec ce contenu
{
"presets": [
"@babel/preset-env"
],
"plugins": [
["@babel/plugin-transform-runtime", {
"regenerator": true
}]
]
}
Avec un restart de parcel avec la commande parcel index.html
, on s'aperçoit qu'il installe les modules nécessaires. En effet, dès que l'app aura redémarré, le fichier package.json
a maintenant 2 nouvelles dépendances de dev : @babel/core
et @babel/plugin-transform-runtime
. Penser à valider ces modifications du package.json
et celles de package-lock.json
(c-à-d faire un commit avec ces modifications dans le dépôt git).
Maintenant, il est possible d'utiliser les fonctions async dans le code sans crainte d'erreur.
# Linter le code JavaScript
# Pourquoi utiliser un linter
Afin d'avoir des conventions de code respectées et identiques dans tous les fichiers, et de se faire aider dans notre éditeur favori par des alertes quand on écrit du code potentiellement source d'erreurs, il est bienvenu de se faire aider par un outil : un linter. En JavaScript, celui que tout le monde utilise aujourd'hui est eslint (opens new window).
D'autre part, une des conventions les plus utilisées est StandardJS (opens new window). C'est celle que nous allons utiliser ici.
# Utiliser eslint
Installer en premier lieu eslint (opens new window) :
npm i -D eslint
Puis installer tout le nécessaire pour gérer StandardJS par eslint :
npm i -D eslint-config-standard eslint-plugin-standard eslint-plugin-promise eslint-plugin-import eslint-plugin-node
Enfin, voici un fichier de configuration pour eslint :
module.exports = {
root: true,
env: {
node: true,
browser: true,
},
extends: ["standard"],
rules: {
// Seule règle que je n'aime pas dans StandardJS et que je surcharge
"comma-dangle": [2, "always-multiline"],
},
};
Enregistrer ce contenu dans .eslintrc.js
, dans le dossier client
.
# Utiliser un proxy en mode dev
Souvent, on veut utiliser parcel
en mode dev, mais accéder à une API REST qui tourne en local sur un autre port. Comme il s'agit d'un autre port, pour y accéder en mode dev, il faudrait que le serveur renvoie des en-têtes CORS (opens new window), et gérer le client API différemment en mode dev et en mode prod... Bref, pas pratique.
La solution est de configurer parcel avec un proxy (opens new window). Pour cela, créer un fichier proxy.js
dans le dossier client
avec ce contenu :
const Bundler = require("parcel-bundler") // parcel, évidemment
const express = require("express") // express est un framework web pour node. Cf. https://expressjs.com/
const { createProxyMiddleware } = require("http-proxy-middleware") // Un module qui permet de faire proxy
const app = express() // Création d'une app express
app.use( // Quelle que soit la méthode HTTP (GET, POST, PUT, DELETE, PATCH, OPTIONS, HEAD, etc.)...
createProxyMiddleware( // ...créer un proxy...
'/api', // qui, pour toutes les routes qui commencent par '/api',...
{
target: 'http://localhost:3000' // ...fera passe-plat au serveur qui tourne sur localhost sur le port 3000
}
)
)
const bundler = new Bundler( // Instanciation d'un bundler parcel
'./index.html', // ou bien './src/index.html' si vous avez mis ce fichier dans un dossier 'src'
{ cache: false }
)
app.use(bundler.middleware()) // Utiliser le bundler parcel créé
const port = Number(process.env.PORT || 1234) //
app.listen(port) // On écoute sur un port particulier (1234 par défaut)
console.log(
`Proxy-enabled parcel server listening on http://localhost:${port}` // Afficher dans la console l'URL à consulter pour dev
)
Ensuite, modifier le script start
du package.json
de façon à lancer non plus parcel index.html
, mais node proxy.js
:
(...)
"start": "node proxy.js",
(...)
Puis, lancer le serveur de l'API (a priori npm run dev
dans le dossier server
), et "lancer" parcel
comme avant :
$ npm start
> esilv-scratch@1.0.0 start /Users/stan/dev/projects/esilv/esilv-websocket-vue/client
> node proxy.js
[HPM] Proxy created: /api -> http://localhost:3000
⠋ Building...Proxy-enabled parcel server listening on http://localhost:1234
✨ Built in 5.18s.
Notes : - Si le serveur de l'API n'est pas lancé avant ce proxy, parcel
ne fonctionnera pas correctement. - Si le port 1234 est déjà occupé, cela ne fonctionnera pas correctement
Si le serveur de l'API gère les WebSockets (opens new window), ajouter une configuration idoine sur le proxy. Par exemple, si c'est socket.io (opens new window) qui est utilisé, rajouter ceci avant la ligne const bundler = new Bundler('./index.html', {
:
app.use(
createProxyMiddleware(
"/socket.io", // La route pour socket.io
{
target: "http://localhost:3000",
ws: true // Faire passe-plat aussi pour les WebSockets
}
)
);
Au lancement (toujours après avoir lancé le serveur de l'API), vous aurez donc :
$ npm start
> esilv-scratch@1.0.0 start /Users/stan/dev/projects/esilv/esilv-websocket-vue/client
> node proxy.js
[HPM] Proxy created: /api -> http://localhost:3000
[HPM] Proxy created: /socket.io -> http://localhost:3000
⠋ Building...Proxy-enabled parcel server listening on http://localhost:1234
✨ Built in 5.18s.
[HPM] Upgrading to WebSocket
Bravo d'avoir lu jusqu'ici !!! Vous êtes un·e pro de parcel, maintenant !