Oto moje przykładowe pliki:
<!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");
Kiedy ładuję stronę w przeglądarce Firefox 46, zwraca ona „SyntaxError: deklaracje importu mogą pojawiać się tylko na najwyższym poziomie modułu” - ale nie jestem pewien, o ile więcej najwyższego poziomu może uzyskać tutaj instrukcja import. Czy ten błąd to czerwony śledź i czy import / eksport po prostu nie jest jeszcze obsługiwany?
javascript
html
firefox
ecmascript-6
es6-modules
Christoph Burschka
źródło
źródło
Odpowiedzi:
Właściwie otrzymałeś błąd, ponieważ musisz wyraźnie stwierdzić, że ładujesz moduł - tylko wtedy użycie modułów jest dozwolone:
<script src="t1.js" type="module"></script>
Znalazłem to w tym dokumencie o używaniu importu ES6 w przeglądarce . Rekomendowane lektury.
W pełni obsługiwane w tych wersjach przeglądarek (i nowszych; pełna lista na caniuse.com ):
W starszych przeglądarkach może być konieczne włączenie niektórych flag w przeglądarkach:
chrome:flags
.dom.moduleScripts.enabled
ustawienie wabout:config
.about:flags
.źródło
import
nie jest już nieobsługiwana.import Test from './t2.js';
'./t2.js'
i nie'./t2'
bez.js
?To już nie jest dokładne. Wszystkie obecne przeglądarki obsługują teraz moduły ES6
Oryginalna odpowiedź poniżej
Od
import
dnia MDN :Przeglądarki nie obsługują
import
.Oto tabela obsługiwanych przeglądarek:
Jeśli chcesz zaimportować moduły ES6, sugerowałbym użycie transpilera (na przykład babel ).
źródło
Samo użycie rozszerzenia .js podczas importowania plików rozwiązało ten sam problem (nie zapomnij ustawić
type="module
w tagu script).Po prostu napisz:
import foo from 'foo.js';
zamiast
import foo from 'foo';
źródło
Dodaj
type=module
skrypty, które importują i eksportują moduły, rozwiązałyby ten problem.źródło
musisz określić jego typ w skrypcie i eksport musi być domyślny ... na przykład w twoim przypadku powinien być,
<script src='t1.js' type='module'>
dla t2.js użyj domyślnego po wyeksportowaniu w ten sposób, eksportuj domyślne „tutaj twoje wyrażenie” (nie możesz tutaj użyć zmiennej) . możesz użyć takiej funkcji,
export default function print(){ return console.log('hello world');}
a do importu składnia importu powinna wyglądać następująco: importowanie wydruku z „./t2.js” (użyj rozszerzenia pliku i ./ dla tego samego katalogu) .. Mam nadzieję, że to będzie przydatne dla Ciebie!
źródło
Dla argumentu...
Można dodać niestandardowy interfejs modułu do globalnego obiektu okna. Chociaż nie jest to zalecane. Z drugiej strony DOM jest już uszkodzony i nic nie pozostaje. Używam tego przez cały czas do krzyżowego ładowania modułów dynamicznych i subskrybowania niestandardowych słuchaczy. To prawdopodobnie nie jest odpowiedź - ale działa. Przepełnienie stosu ma teraz module.export, które wywołuje zdarzenie o nazwie `` Spork '' - przynajmniej do odświeżenia ...
// 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
źródło