Chaque jour, des millions de développeurs, lors de la création de leurs applications JavaScript, se tournent vers npm (ou vers Yarn). L'exécution de commandes comme
npm init
ou
npx create-react-app
est devenue un moyen familier de commencer à travailler sur presque tous les projets JavaScript. Il peut s'agir d'un serveur, d'un client ou même d'une application de bureau.
Mais l'utilitaire npm n'est pas seulement capable d'initialiser des projets ou d'installer des packages. L'auteur du matériel, dont nous publions la traduction aujourd'hui, veut parler de 13 astuces de npm qui vous permettront de tirer tout ce qui est possible de ce système. Ici, nous considérerons des techniques de différentes tailles - de l'utilisation de raccourcis à la personnalisation du comportement de
npm init
.

De nombreux programmeurs utilisent quotidiennement npm. Cela signifie qu'à long terme, même un petit gain de temps peut changer quelque chose pour le mieux. Ce matériel est principalement destiné aux développeurs débutants et aux développeurs de niveau intermédiaire. Cependant, même si vous êtes un professionnel, l'auteur du document espère que vous trouverez ici quelques choses intéressantes que vous n'avez jamais rencontrées auparavant.
Si vous n'êtes pas familier avec npm - sachez que le programme qui nous intéresse est installé avec
Node.js. Si vous travaillez sous Windows, il est recommandé d'installer
Git Bash afin de reproduire une partie de ce qui est discuté ici.
1. Options brèves pour l'enregistrement des commandes de base
Commençons par les bases. En passant un peu de temps à explorer les versions abrégées des commandes npm les plus courantes, vous vous épargnerez beaucoup de temps à l'avenir.
- Installez les packages. Option normale:
npm install
. Raccourci: npm i
. - Exécution de tests. Option normale:
npm test
. Raccourci: npm t
. - Aidez-moi. Option courante:
npm --help
. Raccourci: npm -h
. - Indicateur de paramètre global. Option courante:
--global
. Raccourci: -g
. - Indicateur d'installation du package en tant que dépendance de développement. L'option habituelle est
--save-dev
. Raccourci: -D
. npm init
paramètres d' npm init
par défaut. L'option habituelle est npm init --yes
ou npm init --force
. Raccourci: npm init -y
ou npm init -f
.
Désormais, vous n'avez plus besoin d'utiliser l'
--save
ou
-S
pour enregistrer les packages. Les packages sont enregistrés par défaut. Et pour installer un paquet sans l'enregistrer, vous pouvez utiliser l'indicateur
--no-save
.
▍Options d'enregistrement courtes pour les commandes moins courantes
Voici quelques abréviations plus utiles, qui ne sont cependant pas utilisées aussi largement que celles que nous venons de passer en revue.
- Enregistrement d'un package en tant que dépendance facultative. L'option habituelle:
--save-optional
. Raccourci: -O
. - Enregistrement d'informations sur la version exacte du package. L'option habituelle est
--save-exact
. Raccourci: -E
.
L'utilisation de la commande
npm install
avec le
--save-bundle
ou
-B
fait apparaître les entrées des bundles installés dans
package.json
, dans la section
bundledDependencies
. Ces packages seront fournis avec le projet lors de leur publication. Pour créer un fichier tarball contenant les fichiers de projet et les packages répertoriés dans
bundledDependencies
, vous pouvez utiliser la commande
npm pack
.
▍ Abréviation du répertoire racine
En règle générale, le symbole point (
.
) Est utilisé pour représenter le répertoire racine d'une application ou (selon le contexte) pour représenter un point d'entrée vers une application. Dans npm, c'est ce qui est défini comme la valeur de la propriété
main
dans le fichier
package.json
:
{ "main": "index.js" }
Ce raccourci peut être utilisé, par exemple, avec des commandes comme
npx create-react-app
. Ainsi, au lieu d'exécuter cette commande sous la forme de
npx create-react-app my-app
(qui conduira à la création d'un nouveau dossier
my-app
), vous pouvez exécuter cette commande comme ceci:
npx create-react-app .
(faites attention au point qui vient après la commande). Cela vous permettra de créer un projet de modèle d'application React dans le dossier dans lequel vous vous trouvez au moment où la commande est exécutée.
2. Définition des valeurs par défaut pour npm init
En exécutant constamment la commande
npm init
pour créer un nouveau projet, vous constaterez très probablement que vous entrez les mêmes données encore et encore en réponse aux questions du système. Par exemple - il est probable que vous êtes l'auteur de la plupart des projets que vous créez. Afin de gagner du temps lors de la saisie des mêmes données, vous pouvez définir vos propres valeurs par défaut pour les champs correspondants:
npm config set init.author.name "Joe Bloggs" npm config set init.author.email "joebloggs@gmail.com" npm config set init.author.url "joebloggs.com" npm config set init.license "MIT"
Afin de vérifier l'exactitude de l'ajout de telles informations au système, entrez la commande d'
npm config edit
. Cela ouvrira le fichier de configuration dans l'éditeur système. Si vous souhaitez modifier les paramètres globaux de npm, utilisez la commande
npm config edit -g
.
Afin de revenir aux paramètres par défaut, vous pouvez utiliser le script suivant. Sa première ligne supprime les données de configuration du fichier et la seconde les remplit avec des valeurs par défaut.
echo "" > $(npm config get userconfig) npm config edit
Le script ci-dessus réinitialise les valeurs par défaut pour l'utilisateur. Le script suivant réinitialise les valeurs par défaut globales:
echo "" > $(npm config get globalconfig) npm config --global edit
3. Scripts multiplateformes
Tout code exécuté sur la ligne de commande peut rencontrer des problèmes de compatibilité. Cela est particulièrement vrai pour les incompatibilités entre les systèmes Windows et Unix (cela inclut Mac et Linux). Ce n'est pas un problème si vous et vous seul travaillez sur un certain projet. Mais dans de nombreux cas, la compatibilité des scripts multiplateforme est importante. Par exemple, travailler indépendamment du système d'exploitation est un énorme avantage pour tout projet open source, de formation ou de démonstration.
Heureusement, la résolution du problème de compatibilité des scripts n'est pas particulièrement difficile. Nous avons plusieurs options à notre disposition. Cependant, ici, je voudrais parler de l'un d'eux, de l'utilisation dont j'ai obtenu les meilleurs résultats. Il s'agit d'un package
cross-env . Il doit être installé en tant que dépendance de développement à l'aide de la commande
npm i -D cross-env
. Ensuite, vous devez mettre
cross-env
devant chaque variable d'environnement. Par exemple, cela pourrait ressembler à ceci:
{ "scripts": { "build": "cross-env NODE_ENV=production webpack --config build/webpack.config.js" }
J'ai trouvé que le package
cross-env
est l'outil le plus pratique pour atteindre la compatibilité des scripts multiplateforme. Mais il vous sera utile de jeter un œil aux deux outils populaires suivants qui peuvent vous aider à résoudre ce problème:
- Forfait Rimraf . Il, pour exécuter des scripts multiplateformes, peut être installé globalement.
- Package ShellJS . Il s'agit d'une implémentation Node.js portable du shell de commande Unix.
4. Exécution parallèle de scripts
Afin d'organiser l'exécution séquentielle des commandes dans le shell Linux, la construction
&&
est utilisée. Qu'en est-il de l'exécution de scripts parallèles? Pour ce faire, vous pouvez choisir le package npm approprié. Les packages les plus populaires de ce type sont
simultanément et
npm-run-all . Ici, nous montrons l'utilisation du package simultanément.
Tout d'abord, le package sélectionné doit être installé en tant que dépendance de développement:
npm i -D concurrently
. Ensuite, dans
package.json
vous pouvez utiliser une construction de la forme suivante:
{ "start": "concurrently \"command1 arg\" \"command2 arg\"" }
5. Exécution de scripts situés dans divers répertoires
Parfois, vous rencontrez des applications qui ont plusieurs fichiers
package.json
situés dans différents répertoires. Il serait pratique, par exemple, d'exécuter des scripts qui y sont déclarés, se trouvant dans le répertoire racine du projet. C'est bien mieux que de devoir voyager dans différents dossiers chaque fois que vous devez exécuter un script. Pour ce faire, vous pouvez utiliser les deux approches suivantes.
Pour commencer, vous pouvez utiliser la
cd
pour naviguer automatiquement vers le répertoire souhaité. Cela peut ressembler à ceci:
cd folder && npm start && cd ..
Mais ce problème peut être résolu d'une manière plus intéressante. Il consiste à utiliser l'indicateur
--prefix
, avec lequel vous pouvez spécifier le chemin:
npm start --prefix path/to/your/folder
Voici un exemple d'application de cette solution à partir d'une application réelle. Ici, nous devons exécuter
npm start
pour les parties client et serveur du projet. Leur code, respectivement, se trouve dans les dossiers
client
et
server
.
"start": "concurrently \"(npm start --prefix client)\" \"(npm start --prefix server)\"",
6. Retarder le lancement du script jusqu'à ce qu'une ressource soit disponible
Lors du développement d'applications à pile complète, il est souvent nécessaire d'exécuter les parties client et serveur de l'application. Le package d'
attente vous permet de synchroniser l'exécution de certains processus. Dans notre cas, il est nécessaire qu'avant de démarrer la partie client de l'application, un certain port soit disponible.
Par exemple, il existe un script de développement utilisé dans une application Electron dont l'interface est écrite à l'aide de React. Le script, en utilisant
concurrently
, exécute la couche de présentation de l'application et la fenêtre Electron en parallèle. Mais en utilisant l'
wait-on
vous ne pouvez ouvrir la fenêtre Electron que lorsque la couche de présentation React est prête à l'emploi et est disponible sur
http://localhost:3000
. Voici à quoi ressemble l'
wait-on
:
"dev": "concurrently \"cross-env BROWSER=none npm run start\" \"wait-on http://localhost:3000 && electron .\"",
De plus, le comportement standard des projets React consiste à ouvrir automatiquement une fenêtre de navigateur. Si vous utilisez React avec Electron, cela n'est pas nécessaire. Ceci peut être
BROWSER=none
à l'aide de la variable d'environnement
BROWSER=none
, avant laquelle, pour des raisons de compatibilité multiplateforme de la solution, il existe la commande
cross-env
.
7. Liste et utilisation des scripts disponibles
Afin de lister les scripts disponibles dans
package.json
, allez simplement dans le répertoire racine du projet et exécutez la commande
npm run
dans le terminal.
Mais il existe un moyen encore plus pratique de répertorier les scripts. Lorsque vous l'utilisez, le script souhaité peut être immédiatement sélectionné dans la liste et exécuté. Afin d'utiliser cette façon de travailler avec les scripts, nous devons installer globalement le
ntl
(Npm Task List):
npm i -g ntl
Ensuite, dans le dossier du projet, vous devez exécuter la commande
ntl
. Il affichera une liste des scripts disponibles et vous donnera la possibilité de sélectionner le script à exécuter. Voici à quoi ça ressemble.
Utilisation de la commande ntlCette fonctionnalité peut être très utile si vous ne savez pas exactement quels sont les scripts du projet. C'est également bon dans les cas où le programmeur veut remplacer l'entrée d'une commande longue pour exécuter un script par l'entrée d'une commande courte et la pression rapide de quelques touches supplémentaires sur le clavier.
8. Exécution de pré-scripts et post-scripts
Vous connaissez peut-être les scripts de
postbuild
prebuild
et de
prebuild
-
postbuild
qui vous permettent d'exécuter du code avant et après l'exécution du script de
build
. Ces pré- et post-scripts peuvent être définis pour tout autre script. Y compris ceux dont les descriptions sont ajoutées à p
ackage.json
par le programmeur.
Cela vous permet non seulement de rendre le code plus propre, mais aide également à exécuter les pré et post-scripts de manière isolée.
9. Contrôle de la version de l'application
Au lieu de modifier manuellement la version de l'application, le programmeur peut utiliser des commandes spéciales
npm
. Afin d'augmenter la partie correspondante du numéro de version de l'application, vous pouvez utiliser la commande
npm version
suivie de
major
,
minor
ou
patch
:
// 1.0.0 npm version patch // 1.0.1 npm version minor // 1.1.0 npm version major // 2.0.0
Selon la fréquence à laquelle vous mettez à jour votre application, vous pouvez gagner du temps en augmentant automatiquement le numéro de version à chaque fois que vous déployez une nouvelle version de l'application. Par exemple, comme ceci:
{ "predeploy": "npm version patch" }
10. Modification de package.json à partir de la ligne de commande
Le fichier package.json est un fichier json standard, il peut donc être modifié directement à partir de la ligne de commande à l'aide de l'utilitaire
json . Cela ouvre de nouvelles possibilités dans les situations où vous devez modifier
package.json
, vous permettant de créer vos propres versions raccourcies de commandes. Installez le package
json
globalement:
npm install -g json
L'utilitaire
json
peut ensuite être utilisé pour
modifier rapidement
le fichier à l'aide du
-I
. Par exemple, pour ajouter un nouveau script
foo
avec la
bar
valeur au fichier, vous pouvez utiliser la commande suivante:
json -I -f package.json -e 'this.scripts.foo="bar"'
Dans la section suivante, vous verrez un exemple plus pratique d'utilisation de l'utilitaire
json
.
11. Automatisation de la configuration et de l'ouverture du référentiel
S'il existe une entrée
"repository"
dans votre fichier
package.json
, cela signifie que vous pouvez ouvrir la page du référentiel dans le navigateur utilisé par défaut par le système. Pour ce faire, utilisez la commande
npm repo
.
Si votre projet est déjà connecté à un référentiel distant et que l'utilitaire de ligne de commande
git
installé, cela signifie que vous pouvez trouver l'adresse de votre référentiel à l'aide de la commande suivante:
git config --get remote.origin.url
Mais ce n'est pas tout. Si, conformément à l'astuce précédente, vous avez installé l'utilitaire
json
, vous pouvez utiliser le script suivant pour ajouter automatiquement les informations de référentiel correctes à
package.json
:
json -I -f package.json -e "this.repository=\"$(git config --get remote.origin.url)\""
12. Création de votre propre script pour contrôler la commande npm init
Parlons maintenant de la résolution d'une tâche plus importante. À savoir, nous allons développer notre propre script qui contrôle le fonctionnement de la commande
npm init
, qui accepte l'URL du référentiel GitHub et lui envoie automatiquement le premier commit. Ici, nous parlons de la création de tels scripts. Et dans la section suivante, qui sera notre dernier conseil, nous parlerons de travailler avec
git
.
Vous pouvez personnaliser le comportement de la commande
npm init
à l'aide du
.npm-init.js
. Créez un tel fichier dans le répertoire personnel de l'utilisateur actuel (sous Windows, il s'agit généralement de
C:/Users/<username>
, et sur Mac,
/Users/<username>
). Après cela, exécutez la commande suivante qui indique à npm où se trouve exactement ce fichier:
npm config set init-module ~\.npm-init.js
Avant l'intégration avec
git
, regardons un exemple simple du
.npm-init.js
, qui reproduit les questions que le système pose à l'utilisateur lors de l'utilisation de la commande
npm init
sans paramètres supplémentaires:
module.exports = { name: prompt('package name', basename || package.name), version: prompt('version', '0.0.0'), decription: prompt('description', ''), main: prompt('entry point', 'index.js'), repository: prompt('git repository', ''), keywords: prompt(function (s) { return s.split(/\s+/) }), author: prompt('author', 'Joe Bloggs <joe.bloggs@gmail.com> (joebloggs.com)'), license: prompt('license', 'ISC') }
Chaque question est basée sur le modèle suivant:
nameInPackage: prompt('nameInPrompt', 'defaultValue')
Afin d'indiquer une certaine valeur et de ne pas poser de question à l'utilisateur, supprimez simplement la méthode d'
prompt
.
Si vous souhaitez revenir aux paramètres d'
npm init
standard, supprimez simplement le
.npm-init.js
.
13. Envoi du premier commit au référentiel GitHub à l'aide de npm init
Afin d'exécuter des commandes
git
dans le
.npm-init.js
nous devons trouver un moyen de travailler avec la ligne de commande. Vous pouvez utiliser le module
child_process
pour
child_process
. Nous le connectons en haut du fichier, et comme nous n'avons besoin que de la fonction
execSync
, nous l'importons uniquement, en utilisant la déstructuration:
const { execSync } = require('child_process');
De plus, nous allons créer une fonction d'aide qui affiche les résultats de notre fonction dans la console:
function run(func) { console.log(execSync(func).toString()) }
Et enfin, créons le bloc d'invite approprié pour gérer l'URL du référentiel GitHub. Si le script a l'URL, nous créerons le fichier
README.md
et enverrons le premier commit au référentiel.
Ainsi, l'un des éléments de l'objet
.npm-init.js
doit être le code suivant:
repository: prompt('github repository url', '', function (url) { if (url) { run('touch README.md'); run('git init'); run('git add README.md'); run('git commit -m "first commit"'); run(`git remote add origin ${url}`); run('git push -u origin master'); return url; })
Voici comment le code complet du fichier
.npm-init.js
doit se
.npm-init.js
de cet ajout:
const { execSync } = require('child_process'); function run(func) { console.log(execSync(func).toString()) } module.exports = { name: prompt('package name', basename || package.name), version: prompt('version', '0.0.0'), decription: prompt('description', ''), main: prompt('entry point', 'index.js'), keywords: prompt(function (s) { return s.split(/\s+/) }), author: prompt('author', 'Joe Bloggs <joe.bloggs@gmail.com> (joebloggs.com)'), license: prompt('license', 'ISC'), repository: prompt('github repository url', '', function (url) { if (url) { run('touch README.md'); run('git init'); run('git add README.md'); run('git commit -m "first commit"'); run(`git remote add origin ${url}`); run('git push -u origin master'); return url; }), }
Voici à quoi ressemble le fichier
package.json
que le système crée à l'aide de ce
.npm-init.js
:
{ "name": "Custom npm init", "version": "0.0.0", "decription": "A test project, to demonstrate a custom npm init script.", "main": "index.js", "keywords": [], "author": "Joe Bloggs <joe.bloggs@gmail.com> (joebloggs.com)", "license": "ISC", "repository": { "type": "git", "url": "git+https://github.com/JoeBloggs/custom.git" }, "bugs": { "url": "https://github.com/JoeBloggs/custom/issues" }, "homepage": "https://github.com/JoeBloggs/custom#readme" }
En mettant en place le processus d'initialisation de nouveaux projets, vous pouvez aller plus loin. Par exemple, pour vous assurer que lors de la création d'un projet, un nouveau référentiel sera créé pour celui-ci.
Résumé
J'espère que ce matériel vous a aidé à voir ce que vous pouvez réaliser avec npm. Je veux croire que vous avez trouvé quelque chose ici qui vous permettra de travailler de manière plus productive - que nous parlions de l'utilisation de versions raccourcies de commandes, de scripts de
package.json
ou de la configuration de
npm init
en fonction de vos besoins.
Chers lecteurs! Automatisez-vous le travail avec npm?
