Tutoriel Node.js pour les débutants. Partie 3





Bonjour mes amis!



Je continue à poster une traduction de ce tutoriel Node.js .



Autres parties:



Partie 1

Partie 2

Partie 3

Partie 4



Obtenir les données saisies par l'utilisateur dans Node.js



Comment rendre un programme Node.js interactif?



Pour ce faire, la version 7 de Node.js introduit le module readline : il sert à récupérer les données d'un flux à lire, comme la process.stdinligne de commande lors de l'exécution d'un programme Node.js.



const readline = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
})

readline.question(`What is your name?`, name => {
    console.log(`Hi ${name}!`)
    readline.close()
})


Ce code demande le nom d'utilisateur, après que l'utilisateur a tapé et cliqué enter, un message d'accueil s'affiche.



La méthode question()imprime le premier paramètre (question) sur la console et attend la réponse de l'utilisateur. Lorsqu'elle est enfoncée enter, la fonction de rappel est exécutée.



Dans ce rappel, nous fermons l'interface readline.



readlinecontient d'autres méthodes, que vous pouvez lire dans la documentation.



Si vous avez besoin de demander un mot de passe, il est préférable de ne pas le renvoyer explicitement, mais d'utiliser plutôt des symboles *.



Une façon de faire est d'utiliser le package readline-sync , qui est simple à comprendre et facile à configurer.



Une solution plus complète et abstraite est fournie par le package Inquirer.js .



Nous l'installons avec l'aide npm install inquireret l'utilisons comme suit:



const inquirer = require('inquirer')

const questions = [
    {
        type: 'input',
        name: 'name',
        message: `What's your name?`
    }
]

inquirer.prompt(questions).then(answers => {
    console.log(`Hi ${answers['name']}!`)
})


Inquirer.js vous permet de faire beaucoup de choses intéressantes, comme suggérer plusieurs choix, fournir des boutons radio, demander une confirmation, etc.



Il est mieux connu comme une alternative aux solutions intégrées, mais si vous prévoyez de faire passer l'expérience utilisateur au niveau supérieur, Inquirer.js est la meilleure solution.



Extension de la fonctionnalité de fichier Node.js à l'aide de l'exportation



Node.js a un système modulaire intégré.



Le fichier Node.js peut importer des fonctionnalités à partir d'autres fichiers Node.js.



Lorsque vous souhaitez importer quelque chose, vous utilisez const library = require('./library')

pour importer des fonctionnalités exportées dans un fichier library.jssitué dans le répertoire actuel.



Dans ce fichier, les fonctionnalités doivent être exportées avant de pouvoir être importées dans un autre fichier.



Tout autre objet ou variable défini dans un fichier est par défaut privé (privé) et ne peut pas être utilisé dans d'autres fichiers.



C'est ce que nous permet de faire l'interface module.exportsfournie par le système modulaire .



Lorsque vous affectez un objet ou une fonction en tant que nouvelle propriété de l'objetexports, vous les exportez, puis ils peuvent être importés ailleurs dans l'application ou dans une autre application.



Ceci peut être fait de deux façons.



La première consiste à attribuer une valeur module.exports, qui est l'objet par défaut fourni par le système modulaire. Cette méthode vous permet d'exporter uniquement cet objet:



const car = {
    brand: 'Ford',
    model: 'Fiesta'
}

module.exports = car 

//   
const car = require('./car')


La deuxième méthode consiste à ajouter l'objet exporté en tant que propriété de l'objet exports. Cette méthode vous permet d'exporter de nombreux objets, fonctions ou données:



const car = {
    brand: 'Ford',
    model: 'Fiesta'
}

exports.car = car


ou alors



exports.car = {
    brand: 'Ford',
    model: 'Fiesta'
}


Pour utiliser cet objet dans un autre fichier, vous devez créer un lien vers l'importation:



const items = require('./items')
items.car 


ou



const car = require('./items').car 


Quelle est la différence entre module.exportset exports?



Le premier exporte l'objet référencé, le second une propriété de l'objet.



Une introduction au gestionnaire de packages npm



Introduction à npm


npmEst le gestionnaire de packages Node.js par défaut.



En janvier 2017, npm possédait plus de 350000 packages, ce qui en faisait le plus grand référentiel de code dans un seul langage de programmation sur Terre, et vous pouvez être assuré qu'il existe des packages pour faire à peu près tout.



Tout a commencé par le téléchargement et la gestion des dépendances dans Node.js, mais bientôt cet outil a commencé à être activement utilisé dans le développement du côté client des applications.



npmfait plusieurs choses.



Une alternative à npm est le fil .



Chargement


npmgère le chargement des dépendances du projet.



Si un fichier existe dans le projet, le package.jsonlancement npm installinstallera tout ce dont le projet a besoin dans le répertoire node_modulescréé s'il n'existe pas.



Un package spécifique peut être installé à l'aide de npm install <package-name>.



Souvent, l'installation d'un package est accompagnée de drapeaux:



  • --save - installe le package et ajoute une entrée à ce sujet dans la section des dépendances du fichier package.json
  • --save-dev - installe le package et ajoute une entrée à ce sujet dans la section devDependencies du fichier package.json


La principale différence est que devDependencies est utilisé à des fins de développement, par exemple pour les tests, et les dépendances sont utilisées en production (lors de la construction d'un projet).



Mise à jour des packages


La mise à jour est facile avec npm update.



npmvérifiera tous les packages pour les nouvelles versions qui répondent aux restrictions établies.



Vous pouvez également mettre à jour un paquet spécifique: npm update <package-name>.



Gestion des versions


En plus des téléchargements standard, npm prend en charge le contrôle de version, vous pouvez donc spécifier n'importe quelle version spécifique d'un package ou demander une version plus récente ou plus ancienne.



Vous constaterez souvent qu'une bibliothèque n'est compatible qu'avec une certaine version (majeure) d'une autre bibliothèque.



Et aussi avec les bugs des dernières versions qui n'ont pas été corrigés depuis longtemps.



La gestion des versions facilite également le développement de l'équipe car chaque membre de l'équipe sait quelle version utiliser avant de mettre à jour le fichier package.json.



Dans tous ces cas, la gestion des versions aide; à cet égard, npmelle suit les normes acceptées.



Exécuter des tâches


package.jsonprend en charge un format pour spécifier les commandes à exécuter dans le terminal avec npm run <task-name>.



Par exemple:



{
    "scripts": {
        "start-dev": "node lib/server-development",
        "start": "node lib/server-production"
    },
}


Il est courant d'utiliser cette fonctionnalité pour exécuter Webpack:

{
    "scripts": {
        "watch": "webpack --watch --progress --colors --config webpack.conf.js",
        "dev": "webpack --progress --colors --config webpack.conf.js",
        "prod": "NODE_ENV=production webpack -p --config webpack.conf.js"
    },
}


Cela permet, au lieu d'un ensemble de commandes longues qui sont faciles à oublier ou qui sont faciles à faire des erreurs, faire ceci:



npm run watch 
npm run dev 
npm run prod 




Où npm installe-t-il les packages?



Lors de l'installation de packages à l'aide de, npmvous pouvez choisir entre deux types d'installation:



  • local
  • global


Par défaut, lorsque vous saisissez npm installpar exemple:



npm install lodash 


le package est installé dans un dossier node_modulesdu répertoire actuel.



Après l'installation, npmajoute un enregistrement o lodashà la section dependenciesfichier package.jsondu répertoire actuel.



Pour une installation globale, utilisez l'indicateur -g:



npm install -g lodash 


Dans une installation globale, le package n'est pas installé dans le répertoire actuel, mais dans le répertoire global.



Mais où exactement?



Pour le déterminer, vous devez exécuter la commande npm root -g.



Sous macOS ou Linux, ce répertoire peut être /usr/local/lib/node_modules. Sous Windows - C:\Users\YOU\AppData\Roaming\npm\node_modules. Ce répertoire peut être différent



lorsqu'il est utilisé nvmpour la gestion des versions de Node.js.



Comment utiliser les packages installés?



Comment utiliser un node_modulespackage installé dans un dossier ou globalement.



Supposons que vous ayez installé une lodashbibliothèque d'aide JavaScript populaire avec npm install lodash.



Cette commande installera lodashdans un répertoire local node_modules.



Pour utiliser le programme, vous devez importer le package en utilisant require:



const _ = require('lodash')


Que faire si le package est exécutable (fichier)?



Dans ce cas, le fichier exécutable sera placé dans le répertoire node_modules/.bin/.



Cela peut être facilement démontré à l'aide de la bibliothèque de cowsay .



Ce paquet fournit un programme en ligne de commande, lorsqu'il est exécuté, la vache (et les autres animaux) "parle" quelque chose.



Lors de l'installation d'un package via npm install cowsay, le package lui-même et plusieurs de ses dépendances seront installés:







Le dossier .binest caché et contient des liens symboliques vers les données binaires cowsay:







Comment les exécuter?



Vous pouvez bien sûr taper ./node_modules/.bin/cowsayet cela devrait fonctionner, mais npx inclus avec npm (depuis la version 5.2) est la meilleure option. Tu fais justenpx cowsayet npx localisera automatiquement le fichier: La





vache dit "sortez-moi d'ici".



Manuel de Package.json



Lorsque vous travaillez avec JavaScript, lorsque vous interagissez avec un projet JavaScript, Node.js ou le front-end d'une application, vous rencontrerez probablement un fichier package.json.



Ce que c'est? Que devez-vous savoir sur lui? Et que pouvez-vous en faire?



package.jsonEst une sorte de manifeste de projet. Il peut faire beaucoup de choses qui n'ont aucun rapport les unes avec les autres. Par exemple, il peut s'agir du fichier principal des paramètres des outils utilisés. Il stocke également les noms et les versions de tous les packages installés (ces informations sont utilisées npmet yarn).



Structure des fichiers


Voici un exemple package.json:



{}


Comme vous pouvez le voir, il est vide. Il package.jsonn'y a aucune exigence pour le contenu . La seule exigence est son format (JSON), sinon les programmes ne pourront pas y accéder.



Si vous créez un package Node.js que vous prévoyez de distribuer npm, la situation change radicalement et vous devez ajouter des propriétés pour aider d'autres personnes à utiliser le package. Nous examinerons cela plus tard.



Voici un autre exemple package.json:



"name": "test-project"


Ici, nous avons défini le nom du package ou de l'application situé dans le même répertoire que package.json.



Voici un exemple d'une application plus complexe package.jsonempruntée à une application Vue.js:



{
  "name": "test-project",
  "version": "1.0.0",
  "description": "A Vue.js project",
  "main": "src/main.js",
  "private": true,
  "scripts": {
    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
    "start": "npm run dev",
    "unit": "jest --config test/unit/jest.conf.js --coverage",
    "test": "npm run unit",
    "lint": "eslint --ext .js,.vue src test/unit",
    "build": "node build/build.js"
  },
  "dependencies": {
    "vue": "^2.5.2"
  },
  "devDependencies": {
    "autoprefixer": "^7.1.2",
    "babel-core": "^6.22.1",
    "babel-eslint": "^8.2.1",
    "babel-helper-vue-jsx-merge-props": "^2.0.3",
    "babel-jest": "^21.0.2",
    "babel-loader": "^7.1.1",
    "babel-plugin-dynamic-import-node": "^1.2.0",
    "babel-plugin-syntax-jsx": "^6.18.0",
    "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0",
    "babel-plugin-transform-runtime": "^6.22.0",
    "babel-plugin-transform-vue-jsx": "^3.5.0",
    "babel-preset-env": "^1.3.2",
    "babel-preset-stage-2": "^6.22.0",
    "chalk": "^2.0.1",
    "copy-webpack-plugin": "^4.0.1",
    "css-loader": "^0.28.0",
    "eslint": "^4.15.0",
    "eslint-config-airbnb-base": "^11.3.0",
    "eslint-friendly-formatter": "^3.0.0",
    "eslint-import-resolver-webpack": "^0.8.3",
    "eslint-loader": "^1.7.1",
    "eslint-plugin-import": "^2.7.0",
    "eslint-plugin-vue": "^4.0.0",
    "extract-text-webpack-plugin": "^3.0.0",
    "file-loader": "^1.1.4",
    "friendly-errors-webpack-plugin": "^1.6.1",
    "html-webpack-plugin": "^2.30.1",
    "jest": "^22.0.4",
    "jest-serializer-vue": "^0.3.0",
    "node-notifier": "^5.1.2",
    "optimize-css-assets-webpack-plugin": "^3.2.0",
    "ora": "^1.2.0",
    "portfinder": "^1.0.13",
    "postcss-import": "^11.0.0",
    "postcss-loader": "^2.0.8",
    "postcss-url": "^7.2.1",
    "rimraf": "^2.6.0",
    "semver": "^5.3.0",
    "shelljs": "^0.7.6",
    "uglifyjs-webpack-plugin": "^1.1.1",
    "url-loader": "^0.5.8",
    "vue-jest": "^1.0.2",
    "vue-loader": "^13.3.0",
    "vue-style-loader": "^3.0.1",
    "vue-template-compiler": "^2.5.2",
    "webpack": "^3.6.0",
    "webpack-bundle-analyzer": "^2.9.0",
    "webpack-dev-server": "^2.9.1",
    "webpack-merge": "^4.1.0"
  },
  "engines": {
    "node": ">= 6.0.0",
    "npm": ">= 3.0.0"
  },
  "browserslist": ["> 1%", "last 2 versions", "not ie <= 8"]
}


Il y en a beaucoup ici:



  • name - nom de l'application / du package
  • version - version application / package
  • description - une brève description de l'application / du package
  • main - fichier principal (point d'entrée) de l'application
  • private- la valeur trueempêche la publication accidentelle de l'application ànpm
  • scripts - un ensemble de scripts (commandes) qui peuvent être exécutés (exécutés)
  • dependencies - dépendances du projet
  • devDependencies - dépendances du projet utilisées uniquement pendant le développement
  • engines - les versions sur lesquelles l'application / le package s'exécute
  • browserlist - navigateurs pris en charge (et leurs versions)


Toutes ces propriétés sont utilisées npm.



Propriétés


Dans cette section, nous parlerons de certaines des propriétés que vous pouvez utiliser. Nous utiliserons le terme «package», mais la plupart de ce qui a été dit est également vrai pour les applications.



La plupart des propriétés sont nécessaires pour publier le package npm, certaines pour interagir avec le package.



Nom nom)


Spécifie le nom du package.



Par exemple:



"name": "test-project"


Le nom ne doit pas dépasser 214 caractères, ne doit pas contenir d'espaces et ne peut être composé que de lettres minuscules (minuscules), de tirets (-) et de trait de soulignement (_).



En effet, une npmURL est attribuée au package lors de sa publication en fonction de son nom.



Si le package est publié sur GitHub, il est recommandé de créer un lien vers le référentiel.



Auteur


Identifie l'auteur du package.



Par exemple:



{
    "author": "Joe <joe@whatever.com> (https://whatever.com)"
}


ou comme ça:



{
  "author": {
    "name": "Joe",
    "email": "joe@whatever.com",
    "url": "https://whatever.com"
  }
}


Contributeurs


Spécifie un ou plusieurs contributeurs au package. Cette propriété est un tableau de chaînes.



Par exemple:



{
  "contributors": ["Joe <joe@whatever.com> (https://whatever.com)"]
}


ou comme ça:



{
  "contributors": [
    {
      "name": "Joe",
      "email": "joe@whatever.com",
      "url": "https://whatever.com"
    }
  ]
}


les erreurs


Définit un lien vers un suivi des problèmes, généralement un suivi des problèmes sur GitHub.



Par exemple:



{
  "bugs": "https://github.com/whatever/package/issues"
}


Page d'accueil


Définit l'adresse de la page d'accueil.



Par exemple:



{
  "homepage": "https://whatever.com/package"
}


Version


Détermine la version actuelle du package.



Par exemple:



"version": "1.0.0"


Cette propriété suit la norme de gestion des versions sémantique. Cela signifie qu'il doit toujours être composé de trois nombres séparés par des points x.x.x.



Le premier numéro est la version majeure, le second est la version mineure, le troisième est le patch.



Chaque numéro a une signification spécifique: une mise à jour pour corriger les bogues est un correctif, une version de modifications rétrocompatibles est une version mineure et une version majeure peut signifier des modifications incompatibles avec la version précédente.



Licence


Spécifie la licence du package.



Par exemple:



"license": "MIT"


Mots clés


Cette propriété est un tableau de mots-clés associés au package.



Par exemple:



"keywords": [
  "email",
  "machine learning",
  "ai"
]


Ils aident les gens à trouver des colis.



La description


Définit une brève description du package.



Par exemple:



"description": "A package to work with strings"


Lors de la publication d'un package dans une npmpropriété donnée, cela aide les utilisateurs à comprendre à quoi il sert.



Dépôt


Détermine où se trouve le code source du package.



Par exemple:



"repository": "github:whatever/testing",


Faites attention au préfixe github. Il existe d'autres services similaires:



"repository": "gitlab:whatever/testing",


"repository": "bitbucket:whatever/testing",


Vous pouvez également définir un système de contrôle de version:



"repository": {
  "type": "git",
  "url": "https://github.com/whatever/testing.git"
}


Vous pouvez spécifier plusieurs systèmes de contrôle de version:



"repository": {
  "type": "svn",
  "url": "..."
}


principale


Définit le fichier principal (point d'entrée) du package.



Lors de l'importation d'un package dans une application, c'est dans ce fichier que l'application recherchera les modules exportés.



Par exemple:



"main": "src/main.js"


privé


La définition de cette propriété sur une valeur trueempêche la publication accidentelle du package dans npm.



Par exemple:



"private": true 


scripts


Définit une liste de commandes (scripts) pouvant être exécutées (exécutées).



Par exemple:



"scripts": {
  "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
  "start": "npm run dev",
  "unit": "jest --config test/unit/jest.conf.js --coverage",
  "test": "npm run unit",
  "lint": "eslint --ext .js,.vue src test/unit",
  "build": "node build/build.js"
}


Ces scripts sont des applications de ligne de commande. Vous pouvez les exécuter avec npm run XXXXou yarn run XXXX, où XXXXest le nom de la commande. Par exemple: npm run dev.



Vous pouvez utiliser n'importe quel nom comme nom de commande, le script fera tout ce que vous lui spécifiez.



Dépendances


Définit une liste de dépendances de package.



Lors de l'installation d'un package utilisant npm ou yarn:



npm install <PACKAGENAME>
yarn add <PACKAGENAME>


l'enregistrement de ce package sera automatiquement ajouté à la propriété en question.



Par exemple:



"dependencies": {
  "vue": "^2.5.2"
}


devDependencies


Définit une liste de dépendances à des fins de développement.



Ils diffèrent de dependencies, car ils sont installés uniquement sur l'ordinateur du développeur et ne sont pas mis en production.



Lors de l'installation d'un package utilisant npm ou yarn:



npm install --save-dev <PACKAGENAME>
yarn add --save-dev <PACKAGENAME>


l'enregistrement le concernant est automatiquement ajouté à la propriété considérée.



Par exemple:



"devDependencies": {
  "autoprefixer": "^7.1.2",
  "babel-core": "^6.22.1"
}


moteurs


Détermine les versions de Node.js ou d'autres outils sur lesquels le package / l'application s'exécute.



Par exemple:



"engines": {
  "node": ">= 6.0.0",
  "npm": ">= 3.0.0",
  "yarn": "^0.13.0"
}  


liste de navigateurs


Définit une liste de navigateurs pris en charge (et leurs versions). Ces informations sont utilisées par Babel, Autoprefixer et d'autres outils pour créer des polyfills et assurer la compatibilité avec les navigateurs spécifiés.



Par exemple:



"browserslist": [
  "> 1%",
  "last 2 versions",
  "not ie <= 8"
]    


Ce paramètre signifie que vous souhaitez prendre en charge les deux dernières versions de tous les navigateurs que plus de 1% des utilisateurs utilisent selon les statistiques de CanIUse , à l'exception d'IE8 et des versions antérieures.



Propriétés spéciales


package.jsonpeut contenir des propriétés spéciales pour des outils comme Babel, ESLint, etc.



Chacun de ces outils a ses propres propriétés, par exemple eslintConfig, babelet ainsi de suite. Pour plus de détails sur les propriétés spéciales, consultez la documentation correspondante.



Versions de package


Dans les exemples ci-dessus, vous avez probablement remarqué des entrées comme celle-ci: ~3.0.0, ^0.13.0. Que signifient-ils? Et quels autres spécificateurs de version puis-je utiliser?



Ces spécificateurs sont utilisés pour définir les conditions de mise à jour.



Les règles sont les suivantes:



  • ~- écrire ~0.13.0signifie que seules les mises à jour de correctifs sont autorisées, c'est-à-dire la libération est 0.13.1valide, mais la libération 0.14.0ne l' est pas
  • ^- écrire ^0.13.0signifie que les correctifs et les mises à jour mineures sont autorisés
  • *- record *signifie que toutes les mises à jour sont autorisées
  • > - toutes les nouvelles versions sont autorisées
  • >= - des versions similaires ou plus récentes sont autorisées
  • <= - des versions similaires ou antérieures sont acceptées
  • < - toutes les anciennes versions sont autorisées


Voici quelques règles supplémentaires:



  • pas de caractère de début - seule la version spécifiée est autorisée
  • latest - seule la dernière version est autorisée


Ces caractères peuvent être combinés de différentes façons, par exemple: 1.0.0 || >=1.1.0 <1.2.0.



Merci de votre attention.



À suivre…



All Articles