Qu'est-ce que require en Node.js

À quoi sert require, comment fonctionne t-il et comment l'utiliser ? Une traduction de l'article What is require?

Classée dans Pour commencer

Traduction

Node.js suit le système de modules CommonJS, et la fonction intégrée require est le moyen le plus simple d'inclure des modules qui existent dans des fichiers séparés. La fonction de base de require consiste à lire un fichier JavaScript, à exécuter le fichier et à renvoyer l'objet exporté avec exports. Voici un exemple de module :

console.log("évaluer example.js");

var invisible = function () {
  console.log("invisible");
}

exports.message = "salut";

exports.say = function () {
  console.log(exports.message);
}

Ainsi, si vous exécutez var example = require('./example.js'), alors example.js sera évalué et example sera un objet égal à :

{
  message: "salut",
  say: [Function]
}

Si vous voulez définir l'objet exports avec une fonction ou avec un nouvel objet, vous devez utiliser l'objet module.exports. Donc par exemple :

module.exports = function () {
  console.log("hello world")
}

require('./example2.js')() // exécution de l'objet fonction apporté avec `require` grâce à  `module.exports`

Il est intéressant de noter que chaque fois que vous exigez par la suite un fichier déjà requis, l'objet d'exportation est mis en cache et réutilisé. Pour illustrer ce point avec Node.js REPL :

node> require('./example.js')
évaluer example.js
{ message: 'salut', say: [Function] }
node> require('./example.js')
{ message: 'salut', say: [Function] }
node> require('./example.js').message = "hey" // affecter `"hey"` à `message`
'hey'
node> require('./example.js') // On pourrait penser que cela "recharge" le fichier...
{ message: 'hey', say: [Function] } //...mais le message est toujours `"hey"` à cause du cache du module.

Comme vous pouvez le voir ci-dessus, example.js est évalué la première fois, mais tous les appels ultérieurs à require() invoquent uniquement le cache du module, plutôt que de relire le fichier. Comme nous l'avons vu ci-dessus, cela peut occasionnellement produire des effets secondaires.

Les règles concernant l'endroit où require trouve les fichiers peuvent être un peu complexes, mais une règle simple est que si le fichier ne commence pas par ./ ou /, alors il est soit considéré comme un module de base (et le chemin local de Node.js est vérifié), soit comme une dépendance dans le dossier local node_modules. Si le fichier commence par ./, il est considéré comme un fichier relatif au fichier qui a appelé require. Si le fichier commence par /, il est considéré comme un chemin absolu. Notez que vous pouvez omettre .js et require l'ajoutera automatiquement si nécessaire. Pour des informations plus détaillées, consultez la documentation officielle (EN).

Remarque supplémentaire : si le nom de fichier transmis à require est en fait un répertoire, il cherchera d'abord un package.json dans le répertoire et chargera le fichier référencé dans la propriété main. Sinon, il cherchera un index.js.

Lire dans une autre langue