21 votes

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

Dans mon paquet.json j'ai spécifié que mon nodejs L'application est de type module car si je ne fais pas cela, il semble que je ne puisse pas utiliser import déclarations. Voici à quoi cela 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" à mon paquet.json je ne peux pas utiliser require plus de déclarations, parce que je reçois un ReferenceError: require is not defined erreur.

Si je retire le "type": "module" ligne de paquet.json et réécrire tous mes imports en requis, tout fonctionne sans erreur.

Je ne peux 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 rate quelque chose ici, ou j'ai un autre bug ? Comment pourrais-je résoudre l'utilisation de ces deux types de déclarations dans le même script ?

Pourquoi J'en aurais besoin, 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 ne pas pouvoir faire avec import .

CLAUSE DE NON-RESPONSABILITÉ : Je suis plutôt novice en matière de programmation côté serveur de nodejs, il est donc possible que j'aborde cette situation de manière très incorrecte. Si c'est le cas, veuillez me conseiller quelque chose, en vous basant sur les éléments suivants Pourquoi Je l'ai mentionné plus haut.

NOTE : J'exécute ce nœud script depuis le terminal du serveur, et non depuis le navigateur.

35voto

T.J. Crowder Points 285826

Mais si j'ajoute le "type": "module" à mon package.json je ne peux pas utiliser require plus de déclarations, parce que je reçois un ReferenceError: require is not defined error .

C'est vrai. C'est l'un ou l'autre. Soit vous utilisez ESM (modules JavaScript, type = "module") o vous utilisez des modules natifs CJS (CommonJS-like 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 aquí et aquí .

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

Pourquoi j'ai besoin de ça, 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 ne pas pouvoir faire avec import .

C'est vrai. Vous devez utiliser createRequire pour cela (ou readFile et JSON.parse ), plus aquí .

createRequire version :

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

2voto

Sergey Shvager Points 477

En général, vous avez besoin de Babel pour transpiler votre code Node.js qui utilise des modules ES.

Mais si vous ne voulez pas utiliser Babel : ES Modules est une fonctionnalité expérimentale de la dernière version de Node.js.

Vous avez besoin de 3 choses :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X