node.js - È necessario usare import per caricare il modulo ES: ...\node_modules\got\dist\source\index.js
Ci sono dozzine di altre domande con praticamente lo stesso titolo, ma nessuna delle risposte sembra essere rilevante e aggiunge solo confusione.
Questo è il mio tsconfig.json:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"lib": ["es2017", "es7", "es6", "dom"],
"declaration": true,
"outDir": "dist",
"strict": true,
"esModuleInterop": true
},
"exclude": [
"node_modules",
"dist"
]
}
Questo è ciò che ho digitato:
import md5 from 'js-md5';
import got from 'got';
import { Design } from './Design';
...
Questo è il mio errore:
Errore [ERR_REQUIRE_ESM]: Devi usare import per caricare il modulo ES: C:\Users\...\node_modules\got\dist\source\index.js require() dei moduli ES non è supportato.
Cosa. Non sto usando require, sto usando import. Non ho avuto questo errore con nessun altro modulo, quindi perché Got è diverso (e perché nulla è mai semplice)?
Perché sta succedendo questo e come posso risolverlo?
Secondo la risposta di @jsejcksn, ho provato a modificare il mio tsconfig.json nel seguente modo:
{
"compilerOptions": {
"target": "es6",
"module": "esnext",
"lib": ["es2017", "es7", "es6", "dom"],
"declaration": true,
"outDir": "dist",
"strict": true,
"esModuleInterop": true
},
"exclude": [
"node_modules",
"dist"
]
}
... e ho aggiunto "type": "module" al mio package.json:
{
"dependencies": {
"body-parser": "^1.19.0",
"express": "^4.17.1",
"fs-extra": "^10.0.0",
"got": "^12.0.1",
"js-md5": "^0.7.3",
"moment": "^2.29.1",
"semver": "^7.3.5",
"typescript": "^4.4.3",
"uuid": "^8.3.2",
"@types/node": "^16.9.2",
"@types/express": "^4.17.13",
"@types/fs-extra": "^9.0.13",
"@types/semver": "^7.3.9",
"@types/uuid": "^8.3.1",
"@types/js-md5": "^0.4.3"
},
"type": "module"
}
Ma ora ricevo solo errori diversi :|
src/Logging.ts:1:20 - errore TS2792: Impossibile trovare il modulo 'moment'. Intendevi impostare l'opzione 'moduleResolution' su 'node', oppure aggiungere alias all'opzione 'paths'?
1 importa moment da 'moment';
src/SyncAPI.ts:2:17 - errore TS2792: Impossibile trovare il modulo 'got'. Intendevi impostare l'opzione 'moduleResolution' su 'node', oppure aggiungere alias all'opzione 'paths'?
2 importa got da 'got';
Risposta n. 1
Nel mio caso questo errore specifico è stato causato dal pacchetto ts-node-dev.
Se usi lo stesso pacchetto (di solito si trova nelle dipendenze di sviluppo in package.json) puoi controllare i passaggi di risoluzione che ho pubblicato in un thread parallelo. Spero che questo aiuti.
Risposta n. 2
Hai configurato TypeScript per compilare i tuoi moduli in formato CommonJS (la tua opzione TSConfig compilerOptions.module è impostata su "commonjs"). Dovrai impostare quell'opzione su un'impostazione compatibile con ESM (come "esnext") in modo che il JavaScript compilato emesso dal compilatore TS sia in formato ESM.
Nel tuo package.json, probabilmente dovrai anche impostare il campo "type" su "module".
Modifica: Per utilizzare i pacchetti npm per nome come specificatori diretti nelle tue istruzioni di importazione, dovrai anche aggiornare il tuo TSConfig compilerOptions.moduleResolution a "node". Nella tua configurazione attuale, hai incluso "dom" nell'array compilerOptions.lib. "dom" è per ambienti con un DOM (che Node non ha nativamente), quindi non dovrebbe esserci. Invece, impostare quell'array su ["es2017"] includerà gli altri che hai specificato.
Modifica: Nel tentativo di fornire indicazioni più dirette:
- Assicurati di non usare una versione obsoleta di Node (l'LTS attuale è
^16.x.x) - Assicurati di non usare una versione obsoleta di TypeScript (attualmente a
^4.5.x) - Sposta tutti i tuoi file sorgente in
./src(se non sono già in quella directory), e - Usa questo come il tuo
./tsconfig.json:
{
"compilerOptions": {
"allowSyntheticDefaultImports": true,
"declaration": true,
"esModuleInterop": true,
"lib": [
"es2021"
],
"module": "esnext",
"moduleResolution": "node",
"outDir": "dist",
"strict": true,
"target": "es2021"
},
"include": [
"src/**/*"
]
}
- e assicurati che il campo "type" nel tuo
./package.jsonsia impostato su "module":
{
// ...
"type": "module"
// ...
}
Non dovresti avere alcun problema di compatibilità del sistema dei moduli con l'istruzione import dopo di ciò.
