SyntaxError: impossibile utilizzare l'istruzione import all'esterno di un modulo


53

Ho un progetto ApolloServer che mi sta dando problemi, quindi ho pensato di aggiornarlo e ho riscontrato problemi durante l'utilizzo dell'ultima Babel. Il mio "index.js" è:

require('dotenv').config()
import {startServer} from './server'
startServer()

E quando lo eseguo, viene visualizzato l'errore "SyntaxError: impossibile utilizzare l'istruzione import all'esterno di un modulo". Per prima cosa ho provato a fare le cose per convincere TPTB * che questo era un modulo (senza successo). Quindi ho cambiato l '"importazione" in un "requisito" e questo ha funzionato.

Ma ora ho circa due dozzine di "importazioni" in altri file che mi danno lo stesso errore.

* Sono sicuro che la radice del mio problema è che non sono nemmeno sicuro di cosa si stia lamentando del problema. Ho pensato che fosse Babel 7 (dato che vengo da Babel 6 e ho dovuto cambiare i preset) ma non sono sicuro al 100%.

La maggior parte di ciò che ho trovato per le soluzioni non sembra applicarsi al Nodo diritto. Come questo qui:

Importazione modulo ES6 che dà "Uncaught SyntaxError: identificatore imprevisto"

Dice che è stato risolto aggiungendo "type = module" ma questo in genere andrebbe nell'HTML, di cui non ne ho. Ho anche provato a usare i vecchi preset del mio progetto:

"presets": ["es2015", "stage-2"],
"plugins": []

Ma questo mi dà un altro errore: "Errore: i file Plugin / Preset non possono esportare oggetti, solo funzioni".

AGGIORNAMENTO: Ecco le dipendenze con cui ho iniziato:

"dependencies": {
"@babel/polyfill": "^7.6.0",
"apollo-link-error": "^1.1.12",
"apollo-link-http": "^1.5.16",
"apollo-server": "^2.9.6",
"babel-preset-es2015": "^6.24.1",

1
Ciao, ho lo stesso problema adesso. Potresti anche condividere le tue dipendenze? Forse anche un diff prima e dopo l'aggiornamento. Potrei verificare contro il mio per vedere se possiamo trovare pacchetti simili che potrebbero causare il problema.
lince

Ho appena sostituito tutte le "importazioni" con "richiede" e ora tutto va bene. Stupido ma non valeva la pena di capirlo subito. Aggiornerò l'originale con dipendenze, però. Se ricevi dei lead, li controllerò con il mio codice originale.
user3810626

1
La sintassi CommonJS (request e module.exports) era il formato originale per il nodo e anche il webpack lo supporta, ma la sintassi del modulo ES6 (esportazione, importazione) è il modo più recente e ora il nodo e il webpack lo supportano. Ho letto che il nodo supporta l'importazione ora, ma così tanti tutorial dimostrano la necessità di roba pura per il nodo che è probabilmente meglio usare quella sintassi per il nodo.
Ted Fitzpatrick,

1
Infine, per me la strada da percorrere sembrava essere questa: github.com/vuejs/vue-jest/issues/134#issuecomment-461755061 Impostazione dei preset jest.config.jsper 'ts-jest/presets/js-with-ts'- hanno ancora alcune altre questioni, ma questo risolto il grande. ..... eh sì, il mio problema era relativo ai test ... le build normali andavano bene
lince

Lynx, interessante. Non sto usando Jest, me stesso. Ted, interessante. OK, non lo farò sudare.
user3810626,

Risposte:


52

Aggiornamento 2020 (Nodo 13.2.0+)

Verificare che sia installata l'ultima versione di Node. La --experimental-modulesbandiera non è più necessaria. Basta eseguire una delle seguenti operazioni :

  • Aggiungi "type": "module"al genitore più vicino package.json. Con questo, tutti .jse .mjsfile vengono interpretati come i moduli ES. È possibile interpretare i singoli file come CommonJS utilizzando l' .cjsestensione.

O

  • Denominare in modo esplicito i file con l' .mjsestensione. Tutti gli altri file, come ad esempio, .jsverranno interpretati come CommonJS, che è l'impostazione predefinita se typenon è definita in package.json.

Se lo uso, quindi cambio il percorso in modo da includere "js" per il file richiesto, quindi modifichi il formato delle istruzioni di esportazione nel file richiesto, quindi prendo tutte le istruzioni "richiedi" che ho cambiato da "import", perché ora "richiedi" è sconosciuto: funzionerà, quindi accetterò questa risposta.
user3810626

2
Questa non è davvero un'opzione se il problema si trova in node_modules / giusto? Qualche idea su come risolvere in quel caso?
Trento Bing,


6

Ho avuto lo stesso problema e il seguente problema è stato risolto (utilizzando il nodo 12.13.1):

  • Cambia l'estensione dei file .js in .mjs
  • Aggiungi --experimental-modules flag quando esegui la tua app.
  • Opzionale: aggiungi "type": "module" nel tuo package.json

maggiori informazioni: https://nodejs.org/api/esm.html


-1

Ho avuto questo problema in un nascente progetto API Express.

Il codice del server offensivo in src/server/server.js:

import express from 'express';
import {initialDonationItems, initialExpenditureItems} from "./DemoData";

const server = express();

server.get('/api/expenditures', (req, res) => {
  res.type('json');
  res.send(initialExpenditureItems);
});

server.get('/api/donations', (req, res) => {
  res.type('json');
  res.send(initialDonationItems);
});

server.listen(4242, () => console.log('Server is running...'));

Ecco le mie dipendenze:

{
  "name": "contributor-api",
  "version": "0.0.1",
  "description": "A Node backend to provide storage services",
  "scripts": {
    "dev-server": "nodemon --exec babel-node src/server/server.js --ignore dist/",
    "test": "jest tests"
  },
  "license": "ISC",
  "dependencies": {
    "@babel/core": "^7.9.6",
    "@babel/node": "^7.8.7",
    "babel-loader": "^8.1.0",
    "express": "^4.17.1",
    "mysql2": "^2.1.0",
    "sequelize": "^5.21.7",
    "sequelize-cli": "^5.5.1"
  },
  "devDependencies": {
    "jest": "^25.5.4",
    "nodemon": "^2.0.3"
  }
}

Ed ecco il corridore che ha lanciato l'errore:

nodemon --exec babel-node src/server/server.js --ignore dist

Questo è stato frustrante, dato che avevo un progetto Express simile che funzionava bene.

La soluzione era innanzitutto aggiungere questa dipendenza:

npm install @babel/preset-env

E quindi per collegarlo usando a babel.config.jsnella radice del progetto:

module.exports = {
  presets: ['@babel/preset-env'],
};

Non capisco bene perché funzioni, ma l'ho copiato da una fonte autorevole , quindi sono felice di attenermi.


Sì, il mio problema era che il codice aveva un sacco di preset e non potevo mai trovare l'equilibrio giusto tra le cose che volevo e le cose che non volevo / che hanno rotto le cose.
user3810626

Ho spinto tutto il giorno a confondere gli arresti anomali di JS @ user3810626 - Sospetto che il mio problema sia che sono abbastanza nuovo nella lingua e nell'ecosistema e per ora devo mettere da parte un po 'di apprendimento per far funzionare le cose. Come arrivarci ...:-)
Halfer

1
In bocca al lupo! È una giungla là fuori! (Voglio dire, letteralmente, l'ecosistema JS è una giungla ...)
user3810626

-2
  1. Ho avuto lo stesso problema quando ho iniziato a usare Babel ... Ma più tardi, ho avuto una soluzione ... Non ho più avuto il problema finora ... Attualmente, Nodo v12.14.1, "@ babel / node" : "^ 7.8.4", utilizzo babel-node e nodemon per eseguire (anche il nodo va bene ..)
  2. package.json: "start": "nodemon --exec babel-node server.js" debug ":" debug-babel-node server.js "!! nota: server.js è il mio file di accesso, puoi usare il tuo.
  3. launch.json Quando esegui il debug, devi anche configurare il tuo file launch.json "runtimeExecutable": "$ {workspaceRoot} /node_modules/.bin/babel-node" !! note: più runtimeExecutable nella configurazione.
  4. Naturalmente, con babel-node, normalmente è anche necessario e modificare un altro file, come il file babel.config.js / .babelrc

-2

La mia soluzione era quella di includere il percorso del nodo babele durante l'esecuzione di nodemon come segue:

nodemon node_modules/.bin/babel-node index.js

puoi aggiungere lo script package.json come:

debug: nodemon node_modules/.bin/babel-node index.js

NOTA: il mio file di immissione è index.js sostituirlo con il file di immissione (molti hanno app.js / server.js).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.