Estes são meus arquivos de amostra:
<!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");
Quando carrego a página no Firefox 46, ele retorna "SyntaxError: declarações de importação podem aparecer apenas no nível superior de um módulo" - mas não tenho certeza de quanto mais nível superior a instrução de importação pode chegar aqui. Este erro é uma pista falsa e a importação / exportação ainda não é suportada?
javascript
html
firefox
ecmascript-6
es6-modules
Christoph Burschka
fonte
fonte
Respostas:
Na verdade, o erro que você obteve foi porque você precisa declarar explicitamente que está carregando um módulo - só então o uso de módulos é permitido:
<script src="t1.js" type="module"></script>
Eu encontrei neste documento sobre como usar a importação ES6 no navegador . Leitura recomendada.
Totalmente compatível com essas versões de navegador (e posteriores; lista completa em caniuse.com ):
Em navegadores mais antigos, pode ser necessário habilitar alguns sinalizadores em navegadores:
chrome:flags
.dom.moduleScripts.enabled
configuração emabout:config
.about:flags
.fonte
import
não é mais compatível.import Test from './t2.js';
'./t2.js'
e não'./t2'
sem o.js
?Isso não é mais preciso. Todos os navegadores atuais agora suportam módulos ES6
Resposta original abaixo
De
import
em MDN :Os navegadores não são compatíveis
import
.Aqui está a tabela de suporte do navegador:
Se você deseja importar módulos ES6, sugiro o uso de um transpiler (por exemplo, babel ).
fonte
Apenas usar a extensão de arquivo .js durante a importação de arquivos resolveu o mesmo problema (não se esqueça de definir
type="module
na tag do script).Basta escrever:
import foo from 'foo.js';
ao invés de
import foo from 'foo';
fonte
Adicionar
type=module
os scripts que importam e exportam os módulos resolveria este problema.fonte
você tem que especificar seu tipo no script e exportar tem que ser o padrão .. por exemplo, no seu caso deveria ser,
<script src='t1.js' type='module'>
para t2.js use default após exportar assim, export default 'aqui vai sua expressão' (você não pode usar variável aqui) . você pode usar uma função como esta,
export default function print(){ return console.log('hello world');}
e para importação, sua sintaxe de importação deve ser assim, import print from './t2.js' (use a extensão de arquivo e ./ para o mesmo diretório) ..Espero que seja útil para você!
fonte
Por uma questão de argumento ...
Pode-se adicionar uma interface de módulo personalizado ao objeto de janela global. Embora não seja recomendado. Por outro lado, o DOM já está quebrado e nada persiste. Eu uso isso o tempo todo para carregar módulos dinâmicos e inscrever ouvintes personalizados. Provavelmente não é uma resposta, mas funciona. Stack overflow agora tem um module.export que chama um evento chamado 'Spork' - pelo menos até a atualização ...
// 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
fonte