使用动态模块进行代码拆分?

时间:2016-09-20 19:31:29

标签: reactjs webpack commonjs code-splitting

我在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();
    });
}

1 个答案:

答案 0 :(得分:3)

我终于明白了!!我将动态需求移动到它自己的文件,所以下面是我从react组件调用该文件,然后是文件的内容。您需要安装bundle-loader软件包才能执行此操作。

这就是我打电话的地方,传递this以及我要加载的组件的名称。

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

包含我们的动态需求调用的dynamicRequire.js文件使用了bundle-loader:

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