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.
Mais si j'ajoute le
"type": "module"
À mon fichierpackage.json
, Je ne peux plus utiliser les instructionsrequire
, car j'obtiens unReferenceError: 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"
:
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 .
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 avecimport
.
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");
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:
node --experimental-modules app.js