Firefox에서 ES2015 가져 오기가 작동하지 않음 (최상위 수준에서도)


90

다음은 내 샘플 파일입니다.

<!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");

Firefox 46에서 페이지를로드 할 때 "SyntaxError : import 선언은 모듈의 최상위 수준에서만 나타날 수 있습니다."를 반환하지만 import 문이 여기에 얼마나 더 많은 최상위 수준을 가져올 수 있는지 잘 모르겠습니다. 이 오류는 붉은 청어이며 아직 가져 오기 / 내보내기가 지원되지 않습니까?


2
ES6 모듈은 아직 브라우저에서 지원되지 않습니다.
펠릭스 클링

2
사실이 아닙니다 펠릭스. 2016 년에도 마찬가지입니다. '모든'브라우저에서 지원되지 않는 것이 더 정확합니다.
Andrew S

답변:


128

실제로 발생한 오류는 모듈을로드하고 있음을 명시 적으로 명시해야하기 때문입니다. 그런 다음에 만 모듈 사용이 허용됩니다.

<script src="t1.js" type="module"></script>

이 문서에서 브라우저에서 ES6 가져 오기를 사용 하는 방법을 찾았습니다 . 추천 도서.

해당 브라우저 버전에서 완전히 지원됨 (및 이후 버전, caniuse.com의 전체 목록 ) :

  • Firefox 60
  • Chrome (데스크톱) 65
  • 크롬 (안드로이드) 66
  • Safari 1.1

이전 브라우저에서는 브라우저에서 일부 플래그를 활성화해야 할 수 있습니다.

  • Chrome Canary 60 – chrome:flags.
  • 파이어 폭스 54 - dom.moduleScripts.enabled에 설정 about:config.
  • Edge 15 – about:flags.

1
감사; 이것은 새로운 정보 인 것 같습니다 (이전 답변의 브라우저 지원 표와 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 비교 ) import더 이상 지원되지 않는 답변으로 전환하고 있습니다 .
Christoph Burschka

1
이제 edge 16299 및 chrome 64에서 플래그 / 설정없이 작동합니다. 한 가지주의 사항은 파일이 아닌 경로를 가져와야합니다. 따라서 t1.js에서 :import Test from './t2.js';
Catweazle

@Catweazle 당신은 그것의 확실 './t2.js'하지 './t2'를 빼고 .js?
fredoverflow

@fredoverflow 예, Node.js와 달리 전체 이름을 지정해야합니다.
Tomáš Zato-Monica 복원

수입뿐 아니라 완전한 예가 필요합니다
bharal

14

이것은 더 이상 정확하지 않습니다. 현재 모든 브라우저는 이제 ES6 모듈을 지원합니다.

아래의 원래 답변

에서 importMDN에 :

이 기능은 현재 기본적으로 어떤 브라우저에서도 구현되지 않습니다. Traceur Compiler, Babel 또는 Rollup과 같은 많은 트랜스 파일러에서 구현됩니다.

브라우저는 import.

다음은 브라우저 지원 테이블입니다.

여기에 이미지 설명 입력

ES6 모듈을 가져 오려면 트랜스 파일러 (예 : babel ) 를 사용하는 것이 좋습니다 .


플래그를 사용하여 이러한 기능을 켤 수 있습니까 (예 : 크롬)?
evolutionxbox

4
@evolutionxbox : 기능이 함축 되지 않은 경우 플래그도 없습니다.
Bergi

1
기능이 구현되지 않은 경우 구문 오류 또는 구현되지 않았다는 오류가 표시되지 않는 이유는 무엇입니까? 이것은 말이되지 않습니다.
Tomáš Zato-Monica 복원

TomášZato @, 단지에 따라 달라집니다 그러나 어떤 브라우저 당신이 그것을 처리하기로 결정 사용하고
조쉬 빔

1
실제로 내 코드에 오류가 있었고 잘 작동합니다. 귀하의 답변이 왜 찬성되었는지 모르겠습니다. 가져 오기를 지원하지 않는 브라우저는이를보고합니다. 문제의 오류와 같은 오류는 가져 오기를 사용하는 실제 오류입니다.
Tomáš Zato-Monica 복원

2

파일을 가져 오는 동안 .js 파일 확장자를 사용하는 것만으로도 동일한 문제가 해결 type="module되었습니다 (스크립트 태그 에 설정하는 것을 잊지 마십시오 ).

간단히 작성하십시오.

import foo from 'foo.js';

대신에

import foo from 'foo';

1

type=module모듈을 가져오고 내보내는 스크립트를 추가 하면이 문제를 해결할 수 있습니다.


0

스크립트에 유형을 지정해야하고 내보내기는 기본 ..이어야합니다. 예를 들어 귀하의 경우에는

<script src='t1.js' type='module'>

t2.js의 경우 이와 같이 내보내기 후 기본값을 사용하고 기본값을 'here your expression goes'(여기서는 변수를 사용할 수 없습니다) . 다음과 같은 기능을 사용할 수 있습니다.

export default function print(){ return console.log('hello world');}

가져 오기의 경우 가져 오기 구문은 다음과 같아야합니다. './t2.js'에서 인쇄를 가져옵니다 (동일한 디렉토리에 대해 파일 확장자 및 ./ 사용) ..이 정보가 유용하기를 바랍니다!


0

논쟁을 위해 ...

전역 창 개체에 사용자 지정 모듈 인터페이스를 추가 할 수 있습니다. 그러나 권장하지 않습니다. 반면에 DOM은 이미 손상되었으며 아무것도 지속되지 않습니다. 나는 항상 이것을 사용하여 동적 모듈을 교차로드하고 사용자 지정 리스너를 구독합니다. 이것은 아마도 대답은 아니지만 작동합니다. 스택 오버플로에는 이제 'Spork'라는 이벤트를 호출하는 module.export가 있습니다.

//  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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.