2017-06-19 7 views
1

私はES6に2つのモジュールがあります。コンパイル済みのES6〜ES5ファイルをブラウザで使用する方法は?

//mycalss.js 
class MyClass { 
} 
export {MyClass}; 

//main.js 
import {MyClass} from './../src/myclass'; 

をそして私は、コンパイルおよびバンドルプロセスを処理するために、Laravelミックスを使用しています。

最終的に私はmain.jsになります。

私はこのファイルを自分のhtmlにリンクしています。

<script type="text/javascript" src="main.js"></script> 

とクラスMyClassへの参照を作成しよう:

<script type="text/javascript"> 

    var object = new MyClass(); 

</script> 

しかしUncaught ReferenceError: MyClass is not definedがスローされます。

私はどのようにしてes6からes5にコンパイルされたクラスをHTMLで使用しますか?

+2

できません。 「バンドルされた」JSファイルは関数スコープ内にある可能性が高く、変数/オブジェクトを公開する可能性は低いです。 – evolutionxbox

+0

おそらく、再利用したいオブジェクトを明示的に公開することはできますか? 'main.js'では、' window.MyClass = MyClass'のようなことをして、あなたのバンドルに含まれていない他のスクリプトから見えます。(もちろん、最初の場所...) –

+1

することはできませんし、しないでください。 MyClassを使用するコードは、インラインスクリプトではなくmain.js内にある必要があります。これがES6モジュールの目的です。 – estus

答えて

1

ES6モジュールにはモジュールスコープがあります。これにより、変数がグローバルスコープに漏れないようにします。これはまさにモジュール性のためのものです。

グローバルスコープ内のES6モジュール(モジュールパターンを実装するCommonJSモジュールまたはIIFEにも同じ)からアイテムを使用するには、それらをグローバルとして定義する必要があります。クライアントサイドスクリプトの場合、これは、彼らがバンドルアプリケーション内部windowプロパティとして定義されるべきであることを意味する:

window.MyClass = MyClass; 

これは、潜在的なXYの問題を示しています。より良い選択肢は、グローバルスコープで利用できる理由を再考することです。すでにバンドルされているES6アプリケーションがある場合は、インライン<script type="text/javascript">...</script>からコードを実行することになっています。

-2

Babelを使用すると、ブラウザでJavaScriptをES6からES5にコンパイルできます。

多くの場合、webpackを自動的に使用してHTML内に挿入する必要があります。

関連する問題