Tengo un proyecto ApolloServer que me está dando problemas, así que pensé en actualizarlo y me encontré con problemas al usar la última versión de Babel. Mi "index.js" es:
require('dotenv').config() import {startServer} from './server' startServer()Y cuando lo ejecuto me sale el error
SyntaxError: Cannot use import statement outside a modulePrimero intenté hacer cosas para convencer a TPTB* de que se trataba de un módulo (sin éxito). Así que cambié la " importación " a " requerir " y esto funcionó.
Pero ahora tengo alrededor de dos docenas de " importaciones " en otros archivos que me dan el mismo error.
*Estoy seguro de que la raíz de mi problema es que ni siquiera estoy seguro de qué se queja sobre el problema. Supuse que era Babel 7 (ya que vengo de Babel 6 y tuve que cambiar los ajustes preestablecidos), pero no estoy 100% seguro.
La mayoría de las soluciones que he encontrado no parecen aplicarse a Node. Como este de aquí:
Importación del módulo ES6 dando "Error de sintaxis no detectado: identificador inesperado"
Dice que se resolvió agregando "tipo = módulo", pero esto normalmente iría en el HTML, del cual no tengo ninguno. También intenté usar los ajustes preestablecidos antiguos de mi proyecto:
"presets": ["es2015", "stage-2"], "plugins": []Pero eso me genera otro error: "Error: los archivos de complemento/preestablecidos no pueden exportar objetos, solo funciones".
Aquí están las dependencias con las que comencé:
"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",Verifique que tiene instalada la última versión de Node.js (o, al menos, 13.2.0+). A continuación, realice una de las siguientes acciones, como se describe en la documentación :
Opción 1
En el archivo principal package.json más cercano, agregue el campo "type" de nivel superior con un valor de "module" . Esto garantizará que todos los archivos .js y .mjs se interpreten como módulos ES. Puede interpretar archivos individuales como CommonJS usando la extensión .cjs .
// package.json { "type": "module" }opcion 2
Nombra explícitamente los archivos con la extensión .mjs . Todos los demás archivos, como .js , se interpretarán como CommonJS, que es el valor predeterminado si el type no está definido en package.json .
Si alguien se encuentra con este problema con TypeScript , la clave para resolverlo fue cambiar
"target": "esnext", "module": "esnext",para
"target": "esnext", "module": "commonjs", En mi tsconfig.json . Tenía la impresión de que " esnext " era el "mejor", pero eso fue solo un error.
Para aquellos que estaban tan confundidos como yo al leer las respuestas, en su archivo package.json, agregue "type": "module" en el nivel superior como se muestra a continuación:
{ "name": "my-app", "version": "0.0.0", "type": "module", "scripts": { ... }, ... }