Voici mes exemples de fichiers:
<!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");
Lorsque je charge la page dans Firefox 46, elle renvoie "SyntaxError: les déclarations d'importation peuvent n'apparaître qu'au niveau supérieur d'un module" - mais je ne suis pas sûr du niveau supérieur que l'instruction d'importation peut obtenir ici. Cette erreur est-elle un hareng rouge et l'importation / exportation n'est-elle tout simplement pas encore prise en charge?
javascript
html
firefox
ecmascript-6
es6-modules
Christoph Burschka
la source
la source
Réponses:
En fait, l'erreur que vous avez obtenue est que vous devez indiquer explicitement que vous chargez un module - alors seulement l'utilisation de modules est autorisée:
<script src="t1.js" type="module"></script>
Je l'ai trouvé dans ce document sur l'utilisation de l'importation ES6 dans le navigateur . Lecture recommandée.
Entièrement pris en charge dans ces versions de navigateur (et versions ultérieures; liste complète sur caniuse.com ):
Dans les navigateurs plus anciens, vous devrez peut-être activer certains indicateurs dans les navigateurs:
chrome:flags
.dom.moduleScripts.enabled
installationabout:config
.about:flags
.la source
import
n'est plus non prise en charge.import Test from './t2.js';
'./t2.js'
pas'./t2'
sans le.js
?Ce n'est plus exact. Tous les navigateurs actuels prennent désormais en charge les modules ES6
Réponse originale ci-dessous
À partir
import
de MDN :Les navigateurs ne prennent pas en charge
import
.Voici le tableau de prise en charge du navigateur:
Si vous souhaitez importer des modules ES6, je vous suggère d'utiliser un transpilateur (par exemple, babel ).
la source
Le simple fait d'utiliser l'extension de fichier .js lors de l'importation de fichiers a résolu le même problème (n'oubliez pas de définir
type="module
balise script).Écrivez simplement:
import foo from 'foo.js';
au lieu de
import foo from 'foo';
la source
Ajouter
type=module
les scripts qui importent et exportent les modules résoudrait ce problème.la source
vous devez spécifier son type dans le script et l'exportation doit être par défaut .. par exemple dans votre cas, il devrait être,
<script src='t1.js' type='module'>
pour t2.js, utilisez la valeur par défaut après l'exportation comme celle-ci, exportez la valeur par défaut «ici votre expression va» (vous ne pouvez pas utiliser de variable ici) . vous pouvez utiliser une fonction comme celle-ci,
export default function print(){ return console.log('hello world');}
et pour l'importation, votre syntaxe d'importation devrait être comme ceci, importez l'impression depuis './t2.js' (utilisez l'extension de fichier et ./ pour le même répertoire) .. J'espère que cela vous sera utile!
la source
Pour le bien de l'argument...
On pourrait ajouter une interface de module personnalisée à l'objet de fenêtre globale. Bien que cela ne soit pas recommandé. En revanche, le DOM est déjà cassé et rien ne persiste. J'utilise cela tout le temps pour charger des modules dynamiques et souscrire des écouteurs personnalisés. Ce n'est probablement pas une réponse, mais cela fonctionne. Le débordement de pile a maintenant un module.export qui appelle un événement appelé 'Spork' - au moins jusqu'à l'actualisation ...
// 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
la source