Estos son mis archivos de muestra:
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
<script src="t1.js"></script>
</head>
<body></body>
</html>
t1.js:
import Test from 't2.js';
t2.js:
export const Test = console.log("Hello world");
Cuando cargo la página en Firefox 46, devuelve "SyntaxError: las declaraciones de importación solo pueden aparecer en el nivel superior de un módulo", pero no estoy seguro de cuánto más nivel superior puede obtener la declaración de importación aquí. ¿Es este error una pista falsa y la importación / exportación simplemente no es compatible todavía?
javascript
html
firefox
ecmascript-6
es6-modules
Christoph Burschka
fuente
fuente
Respuestas:
En realidad, el error que obtuvo fue porque necesita indicar explícitamente que está cargando un módulo, solo entonces se permite el uso de módulos:
<script src="t1.js" type="module"></script>
Lo encontré en este documento sobre el uso de la importación de ES6 en el navegador . Lectura recomendada.
Totalmente compatible con esas versiones del navegador (y posteriores; lista completa en caniuse.com ):
En navegadores más antiguos, es posible que deba habilitar algunas banderas en los navegadores:
chrome:flags
.dom.moduleScripts.enabled
instalaciónabout:config
.about:flags
.fuente
import
ya que ya no es compatible.import Test from './t2.js';
'./t2.js'
y no'./t2'
sin el.js
?Esto ya no es exacto. Todos los navegadores actuales ahora admiten módulos ES6
Respuesta original a continuación
Desde
import
MDN :Los navegadores no admiten
import
.Aquí está la tabla de soporte del navegador:
Si desea importar módulos ES6, le sugiero que use un transpilador (por ejemplo, babel ).
fuente
El solo uso de la extensión de archivo .js al importar archivos resolvió el mismo problema (no olvide configurar la
type="module
etiqueta de script).Simplemente escribe:
import foo from 'foo.js';
en vez de
import foo from 'foo';
fuente
Agregar
type=module
los scripts que importan y exportan los módulos resolvería este problema.fuente
debe especificar su tipo en el script y exportar debe ser predeterminado ... por ejemplo, en su caso, debería serlo,
<script src='t1.js' type='module'>
para t2.js, use el valor predeterminado después de exportar de esta manera, exporte el valor predeterminado 'aquí va su expresión' (no puede usar la variable aquí) . puedes usar una función como esta,
export default function print(){ return console.log('hello world');}
y para la importación, su sintaxis de importación debería ser así, importar impresión desde './t2.js' (use la extensión de archivo y ./ para el mismo directorio). ¡ Espero que esto le sea útil!
fuente
Por el valor del argumento...
Se podría agregar una interfaz de módulo personalizado al objeto de ventana global. Aunque no se recomienda. Por otro lado, el DOM ya está roto y no persiste nada. Utilizo esto todo el tiempo para cruzar módulos dinámicos de carga y suscribir oyentes personalizados. Probablemente no sea una respuesta, pero funciona. Stack overflow ahora tiene un module.export que llama a un evento llamado 'Spork', al menos hasta que se actualice ...
// spam the global window with a custom method with a private get/set-interface and error handler... window.modules = function(){ window.exports = { get(modName) { return window.exports[modName] ? window.exports[modName] : new Error(`ERRMODGLOBALNOTFOUND [${modName}]`) }, set(type, modDeclaration){ window.exports[type] = window.exports[type] || [] window.exports[type].push(modDeclaration) } } } // Call the method window.modules() // assign a custom type and function window.exports.set('Spork', () => console.log('SporkSporSpork!!!')) // Give your export a ridiculous event subscription chain type... const foofaalala = window.exports.get('Spork') // Iterate and call (for a mock-event chain) foofaalala.forEach(m => m.apply(this)) // Show and tell... window
fuente