使用动态模块进行代码拆分?
Code splitting with dynamic modules?
我在 React 中使用 Webpack 的代码拆分功能。我正在构建一个应用程序,用户将在其中 select 一个选项,相应的 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();
});
}
我终于明白了!!我将动态要求移动到它自己的文件中,所以下面是我从我的 React 组件调用该文件,然后是文件的内容。您需要安装 bundle-loader 软件包才能执行此操作。
这就是我进行调用的地方,传入 this
以及我要加载的组件的名称。
loadLiveCode(that, component) {
req(component, function(result) {
DynamicModule = result;
that.forceUpdate();
});
}
还有 dynamicRequire.js 文件,其中包含我们使用 bundle-loader 的动态 require 调用:
module.exports = function loadAsync(expr, callback) {
var bundledResult = require("bundle!./elements/" + expr + "/index.js");
bundledResult(function(result) {
callback(result);
});
};
我在 React 中使用 Webpack 的代码拆分功能。我正在构建一个应用程序,用户将在其中 select 一个选项,相应的 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();
});
}
我终于明白了!!我将动态要求移动到它自己的文件中,所以下面是我从我的 React 组件调用该文件,然后是文件的内容。您需要安装 bundle-loader 软件包才能执行此操作。
这就是我进行调用的地方,传入 this
以及我要加载的组件的名称。
loadLiveCode(that, component) {
req(component, function(result) {
DynamicModule = result;
that.forceUpdate();
});
}
还有 dynamicRequire.js 文件,其中包含我们使用 bundle-loader 的动态 require 调用:
module.exports = function loadAsync(expr, callback) {
var bundledResult = require("bundle!./elements/" + expr + "/index.js");
bundledResult(function(result) {
callback(result);
});
};