2016-09-20 11 views
8

私はReact内でWebpackのコード分割機能を使用しています。私は、ユーザーがオプションを選択するアプリケーションを構築しています。対応するReactコンポーネントがレンダリングされます。しかし、CommonJs require.ensureを使用すると、ハードコードされた文字列でしか動作しないことがわかりました。変数を使用すると、動作しているように見えますが、コンポーネントは切り替わります。しかし、ネットワークタブを見ると、コードを分割しないことがわかります。新しいバンドルはロードされません。私がハードコーディングすると、新しいバンドルのたびに呼び出しがあります。ここでダイナミックモジュールによるコード分割ですか?

が働いているものである:ここでは

executeDynamic(component){ 
    var that = this; 
    switch(component){ 
     case 'SolidButton': 
      require.ensure([], function(require){ 
       DynamicModule = require(`./elements/SolidButton/index.js`); 
       that.forceUpdate(); 
      }); 
      break; 
     case 'ThreeDButton': 
      require.ensure([], function(require){ 
       DynamicModule = require(`./elements/ThreeDButton/index.js`); 
       that.forceUpdate(); 
      }); 
      break; 
     case 'NoPreview': 
      require.ensure([], function(require){ 
       DynamicModule = require(`./elements/NoPreview/index.js`); 
       that.forceUpdate(); 
      }); 
      break; 
     default: 
      break; 
    }  
} 

は私が働くことを望むものである:

executeDynamic(component){ 
    var that = this; 
    require.ensure([], function(require) { 
     DynamicModule = require(`./elements/${component}/index.js`); 
     that.forceUpdate(); 
    }); 
} 
+0

をこれは右、ブラウザ内で起こっているのでしょうか?もしそうならば、すでに「必要とされていない」バベルによってすでに蒸散されていないので、動的に変更することはできませんか?あなたのハードコーディングされた文字列は正常に蒸散されていました。 – Benjamin

+0

@ Benjamin-これは変数です。ハードコード文字列に変換されません。私は他の変数と同じように動作すると期待しています。 – Steph

+1

** 'ContextReplacementPlugin' **はあなたのための解決策になりますhttps://github.com/webpack/webpack/issues/118 – Everettss

答えて

3

私は最終的にそれを得ました!動的なrequireを独自のファイルに移動しました。以下は、私の反応コンポーネントからのファイルへの呼び出しです。次に、ファイルの内容です。これを行うには、bundle-loaderパッケージがインストールされている必要があります。

ここで私はロードするコンポーネントの名前と共にthisを渡してコールします。私たちのダイナミックを保持している

loadLiveCode(that, component) { 
    req(component, function(result) { 
     DynamicModule = result; 
     that.forceUpdate(); 
    }); 
} 

そしてdynamicRequire.jsファイルがバンドル・ローダーを利用して、コールが必要です。

module.exports = function loadAsync(expr, callback) { 
    var bundledResult = require("bundle!./elements/" + expr + "/index.js"); 
    bundledResult(function(result) { 
    callback(result); 
    }); 
}; 
関連する問題