正如一些 cmets 已经指出的,我们必须区分构建时和运行时。 webpack 文档中的referenced guide 是关于构建性能。
虽然不使用源映射和缩小代码等开发工具会影响执行速度,但我认为最重要的是分块/延迟加载(正如estus 已经指出的那样)。
您应该决定初始渲染不需要应用程序的哪些部分。这些部分应该被移动到另一个块中并通过require.ensure()延迟加载。
通常你的路由器是一个典型的异步加载东西的地方:
<Router>
<Route
path="/dashboard"
getComponent={loadPage("Dashboard")}
/>
</Router>
function loadPage(page) {
return (location, cb) => pages[page](cb);
}
const pages = {
Dashboard(cb) {
require.ensure(
["./Dashboard.js"],
require => cb(null, require("./Dashboard.js").default)
// .default is required in case you are using ES2015 modules
);
}
};
现在,所有仅在 Dashboard 上需要的模块都将被移动到一个单独的块中。
冗长的require.ensure 部分甚至可以通过将所有顶级组件(我在这里称它们为pages)移动到像pages 这样的专用文件夹来进行优化。然后你可以配置 webpack 使用bundle-loader 来异步加载这些东西:
// webpack.config.js
...
{
test: /\.jsx$/,
include: [
path.resolve("path", "to", "pages"),
],
loaders: [
"bundle-loader?" + JSON.stringify({
lazy: true
})
]
},
那么你的路由器看起来像:
// This does not actually import the Dashboard,
// but a function which loads the dashboard.
import Dashboard from "path/to/pages/Dashboard";
function loadPage(page) {
return (location, cb) => pages[page](module => {
cb(null, module.default);
});
}
const pages = {
Dashboard
};
如果你超级懒,只想引用相同的文件名而不手动创建pages-Object,你也可以使用require contexts:
function loadPage(page) {
return (location, cb) =>
require("./path/to/pages/" + page + ".jsx")(
module => cb(null, module.default)
);
}