2017-01-10 22 views
1

ReactアプリケーションにWebpackバンドルファイルから外部にコンポーネントをロードしたい。私のポイントを詳しく説明するために、ここで私が持っているしたいサンプルHTMLファイルには、次のとおりです。webpackバンドルとは別にコンポーネントを読み込む方法javascript?

<!doctype html> 
<html> 
<head> ... </head> 
<body> 
    <div id="app"></div> 
    <script src="/dist/app.js"></script> 
    <script src="/external-component/timer-component.js"></script> 
</body> 
</html> 

私は基本的にタイマーコンポーネントをロードするが、それでも、そのコンポーネントがapp.js(WebPACKのバンドルされたファイル)に依存するように作ることができるようにしたいので、 app.jsにはReactがあります。言い換えれば、タイマーコンポーネントにReactが存在することを知らせたい。私の現在のタイマーコンポーネントファイルが(ReactJSのウェブサイトから引用)以下の通りです:

class Timer extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = { secondsElapsed: 0 }; 
    } 

    tick() { 
    this.setState(prevState => ({ 
     secondsElapsed: prevState.secondsElapsed + 1 
    })); 
    } 

    componentDidMount() { 
    this.interval = setInterval(() => this.tick(), 1000); 
    } 

    componentWillUnmount() { 
    clearInterval(this.interval); 
    } 

    render() { 
    return React.createElement(
     "div", 
     null, 
     "Seconds Elapsed: ", 
     this.state.secondsElapsed 
    ); 
    } 
} 

私は存在しませんリアクトエラーを取得しておきます。輸入しようとした場合:

const React = require('react'); 
// or 
import React from 'react'; 

私は、要求(またはインポート)が定義されていないというエラーが表示されます。それを行う適切な方法は何ですか?私の理解はwebpack app.jsファイルの種類の名前空間を作成するので、Reactコンポーネントは実際に外界を見ません。 Webpackファイル内のコンポーネントだけがReactを参照します。このような場合、どうすれば外の世界に反応を公開できますか?

答えて

1

(WebPACKののスクリプトローダを使用して、私のプロジェクトの一つ)は、宣言するグローバル変数として反応します。 window.React = React

この方法で、他のコンポーネントからアクセスできます。

これを行うもう1つの方法は、webpackビルドからの反応を外部化し、ページ内のスクリプトタグを使用して外部化することです。外部化する

は、反応するあなたのWebPACKの設定 externals: {'react': 'React'}

でこれを含め世界的に反応するアクセスにあなたのhtmlでこれを含めます。

<script src="https://unpkg.com/[email protected]/dist/react.js"></script> 
<script src="https://unpkg.com/[email protected]/dist/react-dom.js"></script> 
1

あなたはWebpackのための "script-loader"プラグインを使いたいと思います。私はこれを行うためにそれを使用し、それは素晴らしい作品です。

https://github.com/webpack/script-loader

それは例えば、index.htmlの外のすべてのものを維持し、すべてのあなたの一箇所に必要とを置くための素晴らしい方法です私のシードプロジェクトindex.jsにはこれがすべて含まれています。他のプロジェクトでは、必要なときにここにスクリプトを追加するだけです。彼らはnpmをインストールする必要はありません、あなたのプロジェクトにスクリプトを持って、この方法でバンドルにロードすることができます。あなたのapp.jsのどこかに

require('!!script!core-js/client/shim.js'); 

require('!!script!zone.js/dist/zone.js'); 
require('!!script!reflect-metadata/temp/Reflect.js'); 
require('!!script!rxjs/bundles/Rx.js'); 
require('[email protected]/core/bundles/core.umd.js'); 
require('[email protected]/common/bundles/common.umd.js'); 
require('[email protected]/compiler/bundles/compiler.umd.js'); 
require('[email protected]/platform-browser/bundles/platform-browser.umd.js'); 
require('[email protected]/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js'); 
require('[email protected]/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js'); 

require('!style!css!./css/styles.css'); 
require('!style!css!./css/animate.css'); 
require('!style!css!bootstrap/dist/css/bootstrap.css'); 

require('./app/main'); 
+0

あなたはドキュメントがどのようにあなたを伝える「ローダーを使用する方法」これらの輸入を簡素化し、WebPACKのが不可解探しものを削除するバインディングを使用することができます。私はそれについて気にしない。 –

+0

これは良い解決策ですが、私は似たようなことをやっていましたが、すでにReactをwebpackに読み込んでいると、なぜ 'script'タグにそれを追加する必要があるのでしょうか。 'window.React'私のシナリオによく合った。ありがとうございました! – Gasim

関連する問題