logo

 

Road to ES2023 : Support de la syntaxe Hashbang

Adikts - Road to ES2023

Road to ES2023 : Support de la syntaxe Hashbang

Chaque année, une nouvelle version de la spécification ECMAScript, derrière le langage Javascript, sort, avec son lot de fonctionnalités. Depuis novembre, nous vous proposons, sur le blog d’Adikts, la série Road to ES2023, résumant et expliquant une à une chacune des fonctionnalités qui devraient être apportées par cette nouvelle fonction. Après un premier article consacré à Array.prototype.findLast et Array.prototype.findLastIndex, nous vous proposons de découvrir le second ajout d’ECMAScript 2023, plus léger mais néanmoins très intéressant : le support de la syntaxe Hashbang.

Disclaimer : Dans la mesure où la spécification ES2023 n’est ni officielle ni-même gelée, il n’est pas impossible que cette fonctionnalité ne fasse finalement pas partie de cette version d’ECMAScript, par exemple dans le cas où un problème serait identifié tardivement. C’est très improbable, en particulier dans le cas des petites propositions, mais tant que la spécification n’est pas officielle, des changements peuvent arriver.

Contexte

Dans un certain nombre d’environnements, notamment les shells unix, la première ligne d’un script peut, avec une syntaxe spécifique, indiquer le chemin de l’exécutable devant le lire, permettant ainsi de ne pas avoir à se soucier de le lancer avec le bon programme. Cette syntaxe est particulièrement populaire, en particulier pour les scripts d’administration système, souvent en bash ou en python. Cette ligne doit commencer par les deux caractères #!, suivis du chemin absolu de l’exécutable, comme ci-dessous. C’est ce qu’on appelle le Hashbang (combinaison du caractère # (dit « hash ») et ! (dit « bang »), ou, plus rarement, le Shebang.

#!/bin/bash

echo "Adikts"
echo "When passion fITs with skills

Dans la plupart de ces langages de scripting, le caractère # constitue également le caractère introduisant le commentaire. Ainsi, on est sûr que l’interpréteur ne tentera pas d’exécuter le script si on le donne spécifiquement à un exécutable.

Cependant, en Javascript, ce n’est pas le cas, les commentaires étant introduits par // ou /*. Cela pose un problème plus spécifiquement en node.js (mais cela vaut aussi pour d’autres environnements, tels que deno), où cette syntaxe peut être pertinente dans plusieurs contextes. C’est pourquoi, depuis déjà plusieurs années, ces environnements considèrent déjà le Hashbang comme un commentaire. Ce n’était toutefois pas un comportement standard défini par la spécification, et son support était donc variable en fonction du contexte. Cet ajout à ES2023 est donc, simplement, l’ajout et la définition de ce comportement de façon normalisée à la spécification, permettant à tous les moteurs Javascript d’avoir la même interprétation, et donc de briser d’éventuelles ambiguïtés.

Utilisation

Pour utiliser le Hashbang, il vous suffit, dans un environnement compatible, de le placer en première ligne de votre script, et d’exécuter directement votre script sur un shell compatible.

#!/usr/bin/env node

console.log('Adikts');
console.log('When passion fITs with skills');

En exécutant le script directement, sous réserve d’avoir les droits d’exécution, le script pourra fonctionner correctement

./adikts.js

Mais ce sera également le cas en lançant le script via node.js directement

node adikts.js

Théoriquement, ça peut également être une nouvelle syntaxe pour un commentaire, mais, bien-entendu, il est très déconseillé de s’en servir de cette façon. C’est pourquoi la suite de caractères #! ne sera interprétée comme un commentaire que s’il s’agit des premiers caractères du script. Dans tous les autres contextes, l’interprétation échouera.

Notez, pour finir, que cette syntaxe fonctionne également dans les ES Modules, même dans le cas d’un module avec export :

#!/usr/bin/env node

function helloWorld() {
  console.log('hello world from my function');
}

export default helloWorld;
helloWorld();

Cela marche également dans le cadre de la fonction eval.

eval(`#!/usr/bin/env node
'Hello from eval with hashbang`); // Fonctionnera, et retournera bien 'Hello from eval with hashbang

Compatibilité

Cet ajout est un peu particulier, compte-tenu de son utilité particulière dans le cadre des interpréteurs en ligne de commande, comme node.js, il y est pris en charge depuis la version 12.8, sortie en 2019. Côté navigateurs, le support est là-aussi généralisé, à partir de Chrome 74, Safari 13.1, Firefox 67, Opera 62, et toutes les versions de Edge basées sur Chromium. Côté mobile, le support est également généralisé depuis de nombreuses versions. Vous pouvez donc utiliser cette syntaxe sans crainte, y compris côté frontend (ce qui peut être utile, par exemple dans vos modules) dans la plupart des contextes. Si vous devez gérer Internet Explorer ou une ancienne version de Edge, vous pourriez cependant être bloqués. Cependant, la plupart des projets front complexes utilisent Webpack et/ou Babel, qui effectueront la transpilation sans problème, et permettront à votre code de s’exécuter dans la plupart des contextes (tant que le reste de votre code est pris en charge, bien-entendu).

Cette fonctionnalité est la deuxième dont l’intégration à ECMAScript 2023 est prévue. Cela ne devrait, cependant, pas s’arrêter là, et se poursuivre jusqu’en mars 2023, lorsque la nouvelle version sera gelée. Chacune fera l’objet d’un article de la série Road to ES2023. Continuez à suivre le blog Adikts ainsi que le la page LinkedIn pour en être informés.