2017-02-02 4 views
2

ブラウザからwebpackバンドルライブラリにアクセスできません。ブラウザでwebpackバンドルライブラリにアクセスする

例:私はクラスFoo

// foo.js 

"use strict"; 

export default class Foo { 
    constructor() { 
    var bar = "bar"; 
    } 
} 

FooはWebPACKのコンフィグは次のようになりますsrc.js

// src.js 

"use strict"; 
import Foo from "./foo.js"; 

にインポートされています。エントリはsrc.js、出力ファイルはbundle.jsです。

// webpack.config.js 

module.exports = { 
    entry: './src.js', 
    output: { 
    path: '.', 
    filename: 'bundle.js', 
    }, 
    module: { 
    loaders: [ 
     { 
     test: /\.js$/, 
     exclude: /node_modules/, 
     loader: 'babel-loader', 
     query: { 
      presets: ['es2015'] 
     } 
     }, 
    ] 
    }, 
}; 

ウェブパックはすべて正常にコンパイルされ、HTMLファイルにロードできます。

<!-- index.html --> 

<!DOCTYPE html> 
<html> 
<head> 
    <script src="bundle.js"></script> 
    <script type="text/javascript"> 
    var x = new Foo(); 
    console.log(x); 
    </script> 
</head> 
<body> 
</body> 
</html> 

エラーが発生しています。何らかの理由で、バンドルされたJSは、ブラウザがアクセスできる名前空間にFooクラスを入れません。

これは私がFirefoxで取得エラーです:

ReferenceError: Foo is not defined[Learn More]

私はgrokkingないよWebPACKの中にいくつかの設定があります、私はそれを確信しているが、私は、これまでにできていませんでしたそれを理解する。

+0

これは仕様です。 – Claies

+0

@Claiesバンドルに含めるクラスにアクセスできないように設計されていますか?次に、ウェブパックのポイントは何ですか? – samullen

+0

厳密なモードを使用している場合は、オブジェクトがインポートされたモジュールにスコープされるのが設計上の問題です。あなたの 'srcにインポートします。js'はHTMLのスクリプトと同じスコープではありません。なぜなら、そのスクリプトは1)厳密なモードではなく* 2)グローバルな名前空間にバインドされているからです。 – Claies

答えて

3

このコードを再利用できるようにするには、webpackにライブラリのオーサリングを指示する必要があります。 WebPACKの設定でライブラリのプロパティを追加し、再利用のためのライブラリを利用できるようにするに

:WebPACKのdocumentationから

次のように変更します、あなたのライブラリーを作成するには、次のライブラリを使用するためには

module.exports = { 
    entry: './src.js', 
    output: { 
    path: '.', 
    filename: 'bundle.js', 
    library: 'fooLibrary', //add this line to enable re-use 
    }, 
... 

を、あなたは、あなたの他のスクリプトでそれを参照することができます

<script type="text/javascript"> 
    var x = new fooLibrary.Foo(); 
    console.log(x); 
</script> 
+0

ライブラリーを使用するには、実稼働環境でビルドする必要があります.devサーバーを停止し、ctrl + Cを押してwebpack -p(プロダクション用にビルドします) – user889030

0

WebpackおよびES2015モジュールの主な利点の1つは、デフォルトでグローバル名前空間の汚染を防ぐことです。

グローバルオブジェクトに何かを公開する場合は、明示的に行う必要があります。私はあなたのクラスをアプリケーションや会社に固有の何かに名前空間を付けることを推奨します。そうすれば、他のものと命名の衝突を起こす危険はありません。

+0

私は名前空間を汚染したくないので、私はクラスを作りました - 私はそのクラスにアクセスする方法を理解しようとしています。私はどのようにそれを行うためのドキュメントで何かを見つけることができません。 – samullen

関連する問題