Skip to content

Commit

Permalink
Nouveau chapitre : nouveautés et changements dans Node.js (#394)
Browse files Browse the repository at this point in the history
Nouveau chapitre : nouveautés et changements dans Node.js
  • Loading branch information
Thomas Parisot authored May 27, 2019
2 parents 1079973 + 968986a commit 8e09c19
Show file tree
Hide file tree
Showing 8 changed files with 194 additions and 11 deletions.
8 changes: 7 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ des *outils en ligne de commande*.
| ✅ | **[Créer une application web][ch07]** | _ça marche comment HTTP ?_ | [issues][ch07-issues]
| ✅ | **[Créer un outil en ligne de commande][ch08]** | _ça marche comment du code métier dans le terminal ?_ | [issues][ch08-issues]
| ✅ | **[Créer une application frontend][ch09]** | _ça marche comment les modules Node dans les navigateurs web ?_ | [issues][ch09-issues]
| ✅ | Annexe : **[Sélection de modules npm][a01]** | _quel(s) module(s) npm choisir ou découvrir ?_ | [issues][appendix-issues]
| ✅ | Annexe A : **[Sélection de modules npm][a01]** | _quel(s) module(s) npm choisir ou découvrir ?_ | [issues][appendix-issues]
| ✅ | Annexe B : **[Nouveautés et changements dans Node.js][a02]** | _qu'est-ce je dois prendre en compte dans cette nouvelle version ?_ | [issues][appendix-issues]

# Lire l'ouvrage

Expand Down Expand Up @@ -157,6 +158,7 @@ $ npm test
| Chapitre 8 | ![][ch08-deps] | ![][ch08-security]
| Chapitre 9 | ![][ch09-deps] | ![][ch09-security]
| Annexe A | ![][a01-deps] | ![][a01-security]
| Annexe B | ![][a02-deps] | ![][a02-security]

## Génération des épreuves

Expand Down Expand Up @@ -263,3 +265,7 @@ Les exemples de code sont placés sous la [licence MIT][].
[appendix-issues]: https://github.com/oncletom/nodebook/labels/:book:%20chapitre:annexes
[a01-deps]: https://david-dm.org/oncletom/nodebook/status.svg?path=appendix-a
[a01-security]: https://snyk.io/test/github/oncletom/nodebook/badge.svg?targetFile=appendix-a/package.json
[a02]: appendix-a/index.adoc
[appendix-issues]: https://github.com/oncletom/nodebook/labels/:book:%20chapitre:annexes
[a02-deps]: https://david-dm.org/oncletom/nodebook/status.svg?path=appendix-b
[a02-security]: https://snyk.io/test/github/oncletom/nodebook/badge.svg?targetFile=appendix-b/package.json
12 changes: 6 additions & 6 deletions appendix-a/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

147 changes: 147 additions & 0 deletions appendix-b/index.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
:appendix-number: B
:chapterId: appendix-b
:sectnums:
:nodeCurrentVersion: v12
:npmCurrentVersion: v6
:revdate: {docdate}
:sourceDir: ./examples
:imagesdir: {indir}
ifdef::env[]
:imagesdir: .
endif::[]

[appendix]
= Nouveautés et changements dans Node.js

include::../docs/web-header.adoc[]

Cet ouvrage traite de l'état de l'art d'ECMAScript et des modules Node
tels que nous pouvons les utiliser dans Node {nodeCurrentVersion}.
Certaines évolutions du langage et nouveautés de la plate-forme sont utiles
pour gagner en confort de développement.

Cette annexe a pour but de vous aider à comprendre les changements techniques
entre les versions majeures de Node, pour que vous puissiez les prendre en compte.
Les changements politiques et organisationnels sont documentés dans
le <<../chapter-01/index.adoc#,chapitre 1>>.

== Node.js v12

La version 12 de Node est sortie le 23 avril 2019.
V8 est mis à niveau en version{nbsp}``7.4``.

J'ai été particulièrement ravi de bénéficier des changements suivants :

Modules ESM sans l'option `--experimental-modules`::
Nous nous rapprochons de plus en plus de modules interopérables entre Node
et les navigateurs Web, sans outillage supplémentaire.
La syntaxe `import`/`export` fonctionne nativement si notre script est
préfixé par `.mjs` (au lieu de `.js`) ou si l'entrée `"type": "module",`
est présente dans le fichier `package.json`.
Amélioration de l'internationalisation native (`Intl`)::
Nous pouvons calculer des dates relatives (exemple : "`il y a 2 jours`")
dans plusieurs langues avec `Intl.RelativeTimeFormat()`.
L'écriture de listes de mots (exemple : "`Un, deux et trois.`") est facilitée
avec l'apparition de `Intl.ListFormat()`.
Itérations asynchrones sur les objets `Stream`::
La combinaison du concept de <<../chapter-04/index.adoc#stream,flux de données>>
et des <<../chapter-04/index.adoc#events,événements>> n'est ni évidente
ni intuitive. +
La lecture asynchrone d'un flux de données avec
<<../chapter-03/index.adoc#async-await,`async`/`await`>> simplifie la donne.

Certains aspects de Node ont gagné en rapidité (`process.cwd()`, assertions,
lecture de fichiers avec `fs.readFile()`, le _parsing_ de nos scripts).
D'autres changements sont moins visibles mais contribuent néanmoins
à notre confort de travail :

Mises à jour de sécurité::
Support du chiffrement TLSv1.3 pour un support des connexions sécurisées
améliorées, plus rapides et moins gourmandes en ressources.
Remplacement du parseur HTTP::
La base de code qui interprète les requêtes HTTP entrantes a été entièrement
remplacée par un parseur deux fois plus rapide{nbsp}:{nbsp}``llhttp``
([URL]#https://llhttp.org#).
Introduction des diagnostics d'erreur::
L'option `--experimental-report` active un rapport d'erreur dans un fichier
JSON en cas de plantage applicatif.
Ce fichier reste malgré tout lisible par un humain
Je pense qu'un écosystème d'outillage va se développer pour rendre ces rapports
davantage lisibles et exploitables pour déceler plus finement des bugs applicatifs.

[NOTE]
.[RemarquePreTitre]#Documentation# Liste exhaustive des changements
====
Voici une liste de liens pour mieux comprendre ce qui se cache sous le capot
de Node v12 :
- [URL]#https://v8.dev/blog/v8-release-74#
- [URL]#https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V12.md#
- [URL]#https://wiki.openssl.org/index.php/TLS1.3#
====


== Node.js v10

La version 10 de Node est sortie le 24 avril 2018.
V8 est mis à niveau en version{nbsp}``6.6``.

J'ai été content de passer à cette version de Node pour les raisons suivantes :

Introduction des promesses natives pour le module `fs`::
L'objet `fs.promises` propose les mêmes fonctions que `fs`… mais elles
retournent des <<../chapter-03.adoc#promise,promesses>> au lieu de faire
usage des <<../chapter-03/index.adoc#callback,fonctions de rappel>>. +
Voilà de quoi faciliter l'orgation d'opérations typiquement asynchrones.
Création de répertoires de manière récursive::
La fonction `fs.mkdir()` accepte l'option `recursive` : lorsque sa valeur
vaut `true`, Node crée tous les répertoires nécessaires.
Nous n'avons plus besoin de les créer un par un, ni d'avoir recours
au module{nbsp}``npm`` _mkdirp_ ([URL]#https://npmjs.com/mkdirp#).
Introduction des modules ESM::
C'est la première fois que l'on peut importer des
<<../chapter-04/index.adoc#esm,modules{nbsp}ECMAScript>> dans Node
sans avoir recours à de l'outillage externe.
Cela nécessite d'utiliser l'option `--experimental-modules` lors d'un appel
à la commande{nbsp}``node``, ainsi que d'avoir recours à l'extension de fichier
`.mjs`… mais c'est un (bon) début.
Introduction de l'internationalisation native (`Intl`)::
Le module d'internationalisation `Intl` entre en scène pour gérer l'affichage
des nombres, devises et dates selon des règles propres à chaque pays.
L'installation de base de Node gère uniquement l'anglais mais il est possible
d'installer des locales supplémentaires, ou de se reposer sur les réglages
du système d'exploitation.
Le module{nbsp}``npm`` en version 6::
La sixième version majeure du module{nbsp}``npm`` embarque la
commande{nbsp}``npm audit`` qui simplifie la résolution de l'installation
de mises à jour de sécurité.
Les temps d'installation ont été drastiquement réduits.

Certains aspects de Node ont gagné en rapidité (itération sur les tableaux,
itérations asynchrones, création de serveur DNS, assertions) mais d'autres
changements avancés vont avoir des conséquences intéressantes à moyen et
long{nbsp}terme :

Module de base `http2`::
Node supporte désormais nativement la création de serveur http/2.
C'est plus complexe à gérer mais fort heureusement, l'offre de
__frameworks__{nbsp}web va s'adapter pour absorber cette complexité à notre place.
Stabilisation de l'interface `N-API`::
L'interface `N-API` est une approche bas-niveau pour interfacer du code écrit
en {cpp} directement avec Node, sans script ECMAScript.
Certains modules y ont recours pour des questions de performance… mais aussi
pour expérimenter avec Node, en utilisant une autre machine virtuelle que V8.
Module de base `worker_threads`::
Il s'agit d'un concept similaire au _Web Workers_ des navigateurs web :
ce module expérimental sert à paralléliser l'exécution d'opérations sans
bloquer le processus principal, et sans créer de nouveau processus indépendant.

[NOTE]
.[RemarquePreTitre]#Documentation# Liste exhaustive des changements
====
Voici une liste de liens pour mieux comprendre ce qui se cache sous le capot
de Node v10 :
- [URL]#https://v8.dev/blog/v8-release-66#
- [URL]#https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V10.md#
====
5 changes: 5 additions & 0 deletions appendix-b/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 18 additions & 0 deletions appendix-b/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"name": "nodebook.appendix-b",
"private": true,
"version": "2.0.0",
"description": "",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"engines": {
"node": "^12.0.0"
},
"author": "Thomas Parisot (https://oncletom.io)",
"license": "MIT",
"bugs": {
"url": "https://github.com/oncletom/nodebook/issues"
},
"dependencies": {}
}
2 changes: 2 additions & 0 deletions book.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,5 @@ include::chapter-08/index.adoc[leveloffset=+1]
include::chapter-09/index.adoc[leveloffset=+1]

include::appendix-a/index.adoc[leveloffset=+1]

include::appendix-b/index.adoc[leveloffset=+1]
12 changes: 8 additions & 4 deletions foreword/preamble.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ J'ai fait en sorte que la lecture soit progressive, du plus simple au plus compl
Le contenu des chapitres explore une problématique et se termine
souvent sur une section avancée, pour aller plus{nbsp}loin.

Cette édition est composée de neuf chapitres et d'une annexe :
Cette édition est composée de neuf chapitres :

. *Histoire, écosystème et gouvernance* +
D'où vient Node et qui sont les acteurs participant à son histoire ?
Expand Down Expand Up @@ -110,11 +110,15 @@ Cette édition est composée de neuf chapitres et d'une annexe :
Utiliser la richesse de l'écosystème{nbsp}npm et profiter des modules pour écrire des
applications _front-end_ de qualité.

L'annexe complète l'ouvrage avec une *sélection de modules*{nbsp}npm,
pour démarrer plus vite et mieux cerner ce qu'on peut faire avec{nbsp}Node.
Deux annexes complètent l'ouvrage :
. une *sélection de modules*{nbsp}npm, pour bien démarrer et pour
cerner le potentiel de{nbsp}Node.
. un *historique des nouveautés techniques* des versions majeures de Node
pour adapter votre code aux changements et pour retrouver plus facilement
des explications en lien dans les bons chapitres.

[TIP]
.[RemarquePreTitre]#Ressources# Contenu en [line-through]#livre# libre accès
.[RemarquePreTitre]#Ressources# Contenu en libre accès
====
Le contenu de cet ouvrage est actualisé en permanence sur [URL]#https://oncletom.io/node.js/#.
Expand Down
1 change: 1 addition & 0 deletions index.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ include::docs/description.adoc[]
- *Chapitre 8* : <<chapter-08/index.adoc#,Créer un outil en ligne de commande>>
- *Chapitre 9* : <<chapter-09/index.adoc#,Créer une application front-end>>
- *Annexe A* : <<appendix-a/index.adoc#,Sélection de modules `npm`>>
- *Annexe B* : <<appendix-b/index.adoc#,Nouveautés et changements dans Node.js>>

== À propos de l'auteur

Expand Down

0 comments on commit 8e09c19

Please sign in to comment.