web-dev-qa-db-fra.com

require () ne fonctionne pas dans le script de type module nodejs

Dans mon package.json fichier, j'ai spécifié que mon nodejs app est de type module, car si je ne le fais pas, il semble que je ne puisse pas utilisez les instructions import. Voici à quoi ça ressemble maintenant:

{
  "name": "...",
  "version": "1.0.0",
  "description": "....",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "...."
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "lodash": "^4.17.15"
  },
  "type": "module"
}

Mais si j'ajoute le "type": "module" dans mon fichier package.json, je ne peux plus utiliser d'instructions require, car j'obtiens un ReferenceError: require is not defined Erreur.

Si je supprime le "type": "module" ligne de package.json, et réécrire toutes mes importations en requiert, tout fonctionne sans erreur.

Je ne parviens pas à trouver d'indication, que import et require ne peuvent pas être mélangés ou utilisés ensemble dans le même script, est-ce que je manque quelque chose ici, ou j'ai un autre bogue? Comment pourrais-je résoudre à utiliser ces deux types d'instructions dans le même script?

Pourquoi j'en aurais besoin, c'est parce que je veux require certains fichiers de configuration basés sur des chemins dynamiques, et seulement si les fichiers existent, ce que je pense que je ne peux pas faire avec import.

DISCLAIMER: Je suis plutôt nouveau dans la programmation côté serveur de nodejs, il est donc possible que j'aborde cette situation très mal, si c'est le cas, veuillez me conseiller quelque chose, basé sur le Pourquoi je l'ai mentionné ci-dessus.

REMARQUE: J'exécute ce script de nœud à partir du terminal serveur, et non à partir du navigateur.

5
Adam Baranyai

Mais si j'ajoute le "type": "module" À mon fichier package.json, Je ne peux plus utiliser les instructions require, car j'obtiens un ReferenceError: require is not defined error.

Droite. C'est soit/ou. Soit vous utilisez ESM (modules JavaScript, type = "module") soit vous utilisez CJS (modules natifs de type CommonJS Node.js, require).

Mais , si vous utilisez type="module":

  1. Vous pouvez toujours utiliser les modules CJS, il vous suffit de les importer via import au lieu de require (ou via import() [importation dynamique] si nécessaire). Voir les détails ici et ici .

  2. Vous pouvez utiliser createRequire pour obtenir efficacement une fonction require que vous pouvez utiliser dans votre module ESM, ce qui nous amène à ...

Pourquoi j'en aurais besoin, c'est parce que je veux require des fichiers de configuration basés sur des chemins dynamiques, et seulement si les fichiers existent, ce que je pense que je ne peux pas faire avec import.

C'est vrai. Vous devez utiliser createRequire pour cela à la place (ou readFile et JSON.parse), Plus ici .

createRequire version:

import { createRequire } from "module";
const require = createRequire(import.meta.url);
const yourData = require("./your.json");
5
T.J. Crowder

Habituellement, vous avez besoin de Babel pour transpiler votre code Node.js qui utilise des modules ES.

Mais si vous ne souhaitez pas utiliser Babel: ES Modules est une fonctionnalité expérimentale du dernier Node.js.

Vous avez besoin de 3 choses:

  1. dernier Node.js
  2. Ajoutez "type": "module" au package.json
  3. Ajouter un indicateur expérimental lors de l'exécution de node.js node --experimental-modules app.js
0
Sergii Shvager