Módulos ES6 en el navegador: Error de sintaxis no detectado: Importación de token inesperada


85

Soy nuevo en ES6 (ECMAScript 6) y me gustaría usar su sistema de módulos en el navegador. Leí que ES6 es compatible con Firefox y Chrome, pero obtengo el siguiente error al usarexport

Uncaught SyntaxError: Unexpected token import

Tengo un archivo test.html

<html>
    <script src="test.js"></script>
<body>
</body>
</html>

y un archivo test.js

'use strict';

class Test {

    static hello() {
        console.log("hello world");
    } 
}

export Test;    

¿Por qué?


Los módulos ES6 aún no son compatibles con el navegador. Además, todavía está cargando un script, no un módulo.
Bergi

3
Todavía no entiendo la diferencia entre un script y un módulo
cdarwin

Ver aquí
Bergi

20
La parte importante que he notado es <script type="module"></script>asegurarse de agregar que, de lo contrario, obtendrá ese error. Me golpeaba la cabeza contra la pared continuamente haciendo a <script>import ... </script>sabiendas que ahora se dice que Chrome admite módulos ES6 sin banderas, luego noté que el atributo de tipo era necesario para especificar al navegador que este es un módulo ES6, sin el cual se obtiene exactamente error.
Emmanuel Mahuni

1
Estoy usando Chrome 68, todavía veo este error cuando usamos importar * desde
Integración

Respuestas:



53

Puede probar los módulos ES6 en Google Chrome Beta (61) / Chrome Canary.

Implementación de referencia de ToDo MVC por Paul Irish - https://paulirish.github.io/es-modules-todomvc/

Tengo una demostración básica -

//app.js
import {sum} from './calc.js'

console.log(sum(2,3));
//calc.js
let sum = (a,b) => { return a + b; }

export {sum};
<html> 
    <head>
        <meta charset="utf-8" />
    </head>

    <body>
        <h1>ES6</h1>
        <script src="app.js" type="module"></script>
    </body>

</html>

¡Espero eso ayude!


33
Así es ... La parte importante que he notado es <script type="module"></script>asegurarse de agregar que, de lo contrario, obtendrá ese error. Me golpeaba la cabeza contra la pared continuamente haciendo a <script>import ... </script>sabiendas que ahora se dice que Chrome admite módulos ES6 sin banderas, luego noté que el atributo de tipo era necesario para especificar al navegador que este es un módulo ES6.
Emmanuel Mahuni

1
{"message": "Error de sintaxis no detectado: token inesperado {", "nombre de archivo": " stacksnippets.net/js ", "lineno": 24, "colno": 8}
hoogw

4
Obtuve el error anterior al ejecutar el fragmento de código anterior, usar Chrome v67, ¿por qué?
hoogw

@hoogw Stackoverflow agregó que Ejecutar fragmento de código automáticamente. Este código no se puede ejecutar tal cual. ¡Debe copiar el código en index.html y separar los archivos .js como se muestra arriba y probar en el navegador!
Roopesh Reddy

Gracias respuesta útil. Eliminé el corredor de fragmentos para ti. (Como vi, los fragmentos de StackOverflow no pueden tener más de una jsfuente).
Mir-Ismaili

25

Desafortunadamente, los módulos no son compatibles con muchos navegadores en este momento.

Esta característica apenas está comenzando a implementarse en los navegadores de forma nativa en este momento. Está implementado en muchos transpilers, como TypeScript y Babel, y paquetes como Rollup y Webpack.

Encontrado en MDN


Leí que esta función se implementó en una pregunta Sof, pero la fuente MDN es en realidad más confiable.
cdarwin

Según el siguiente enlace, Chrome 61 debería admitir la importación, pero no es así. medium.com/dev-channel/…
Marc

4
Tienes que agregar type = "module" a tu etiqueta de script.
smohadjer

10

funcionó para mí agregandotype="module" al script importmis mjs:

<script type="module">
import * as module from 'https://rawgit.com/abernier/7ce9df53ac9ec00419634ca3f9e3f772/raw/eec68248454e1343e111f464e666afd722a65fe2/mymod.mjs'

console.log(module.default()) // Prints: Hi from the default export!
</script>

Ver demostración: https://codepen.io/abernier/pen/wExQaa

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.