使用 Webpack 进行代码拆分
Code splitting with Webpack
我的其中一条路线的当前路线描述如下:
<Route path='auth' component = {AuthenticateContainer} onEnter = {checkAuth}/>
为了拆分路由路径的代码,我认为代码可能如下所示:
<Route path="auth" getComponent={(nextState, callback) => {
require.ensure([], function(require) {
callback(null, require('./AuthenticateContainer.js').default);
})
}}/>
但是我缺少的是 OnEnter checkAuth 函数,我该如何包含它?
如果您在 ./AuthenticationContainer.js
中有 checkAuth
,则将其移动到 routes.js
或创建一个新的 js 文件并在 routes.js 中需要它。基本上,在使用 getComponent
.
要求组件之前,必须存在 onEnter
挂钩上的 运行 函数
我的 routes.js 看起来像这样-
import React from 'react';
import { Route } from 'react-router';
export default (store) => {
function requireAuth(nextState, replace) {
if(!store.getState().auth.isAuthenticated) {
replace({
pathname: '/',
state: { nextPathname: nextState.location.pathname }
})
}
}
return { childRoutes: [{
path: '/',
getComponents(location, callback) {
require.ensure(['./containers/App/App.jsx'], function (require) {
callback(null, require('./containers/App/App.jsx').default)
})
},
childRoutes: [{
path: 'about',
onEnter: requireAuth,
getComponents(location, callback) {
require.ensure(['./containers/About/About.jsx'], function (require) {
callback(null, require('./containers/About/About.jsx').default)
})
}
}]
}]
}
};
我不确定您是否可以在 require.ensure
中调用 checkAuth
并在未通过身份验证时停止加载该组件。按照设计,这是一种糟糕的方法,因为您要加载组件然后检查它是否经过身份验证。这抵消了代码拆分的好处。
编辑 - 添加 webpack.config.js
var webpack = require('webpack');
var path = require('path');
var BUILD_DIR = path.resolve(__dirname, 'build');
var APP_DIR = path.resolve(__dirname, 'src');
var config = {
entry: APP_DIR + '/index.jsx',
output: {
path: BUILD_DIR,
filename: 'bundle.js',
chunkFilename: '[id].chunk.js',
},
devtool: 'inline-source-map',
module : {
loaders : [
{
test : /\.jsx?/,
include : APP_DIR,
loader : 'babel'
},
{
test: /\.css?$/,
loaders: [ 'style', 'raw' ],
include: __dirname
}
]
},
plugins: [
new webpack.optimize.CommonsChunkPlugin('shared.js')
]
};
module.exports = config;
Webpack 构建输出 -
webpack -d --watch
Hash: 08b101d1e95f7633adb4
Version: webpack 1.13.2
Time: 2680ms
Asset Size Chunks Chunk Names
bundle.js 1.05 MB 0, 3 [emitted] main
1.chunk.js 4.15 kB 1, 3 [emitted]
2.chunk.js 3.19 kB 2, 3 [emitted]
shared.js 3.66 kB 3 [emitted] shared.js
bundle.js.map 1.16 MB 0, 3 [emitted] main
1.chunk.js.map 2.32 kB 1, 3 [emitted]
2.chunk.js.map 1.18 kB 2, 3 [emitted]
shared.js.map 3.67 kB 3 [emitted] shared.js
+ 269 hidden modules
我的其中一条路线的当前路线描述如下:
<Route path='auth' component = {AuthenticateContainer} onEnter = {checkAuth}/>
为了拆分路由路径的代码,我认为代码可能如下所示:
<Route path="auth" getComponent={(nextState, callback) => {
require.ensure([], function(require) {
callback(null, require('./AuthenticateContainer.js').default);
})
}}/>
但是我缺少的是 OnEnter checkAuth 函数,我该如何包含它?
如果您在 ./AuthenticationContainer.js
中有 checkAuth
,则将其移动到 routes.js
或创建一个新的 js 文件并在 routes.js 中需要它。基本上,在使用 getComponent
.
onEnter
挂钩上的 运行 函数
我的 routes.js 看起来像这样-
import React from 'react';
import { Route } from 'react-router';
export default (store) => {
function requireAuth(nextState, replace) {
if(!store.getState().auth.isAuthenticated) {
replace({
pathname: '/',
state: { nextPathname: nextState.location.pathname }
})
}
}
return { childRoutes: [{
path: '/',
getComponents(location, callback) {
require.ensure(['./containers/App/App.jsx'], function (require) {
callback(null, require('./containers/App/App.jsx').default)
})
},
childRoutes: [{
path: 'about',
onEnter: requireAuth,
getComponents(location, callback) {
require.ensure(['./containers/About/About.jsx'], function (require) {
callback(null, require('./containers/About/About.jsx').default)
})
}
}]
}]
}
};
我不确定您是否可以在 require.ensure
中调用 checkAuth
并在未通过身份验证时停止加载该组件。按照设计,这是一种糟糕的方法,因为您要加载组件然后检查它是否经过身份验证。这抵消了代码拆分的好处。
编辑 - 添加 webpack.config.js
var webpack = require('webpack');
var path = require('path');
var BUILD_DIR = path.resolve(__dirname, 'build');
var APP_DIR = path.resolve(__dirname, 'src');
var config = {
entry: APP_DIR + '/index.jsx',
output: {
path: BUILD_DIR,
filename: 'bundle.js',
chunkFilename: '[id].chunk.js',
},
devtool: 'inline-source-map',
module : {
loaders : [
{
test : /\.jsx?/,
include : APP_DIR,
loader : 'babel'
},
{
test: /\.css?$/,
loaders: [ 'style', 'raw' ],
include: __dirname
}
]
},
plugins: [
new webpack.optimize.CommonsChunkPlugin('shared.js')
]
};
module.exports = config;
Webpack 构建输出 -
webpack -d --watch
Hash: 08b101d1e95f7633adb4
Version: webpack 1.13.2
Time: 2680ms
Asset Size Chunks Chunk Names
bundle.js 1.05 MB 0, 3 [emitted] main
1.chunk.js 4.15 kB 1, 3 [emitted]
2.chunk.js 3.19 kB 2, 3 [emitted]
shared.js 3.66 kB 3 [emitted] shared.js
bundle.js.map 1.16 MB 0, 3 [emitted] main
1.chunk.js.map 2.32 kB 1, 3 [emitted]
2.chunk.js.map 1.18 kB 2, 3 [emitted]
shared.js.map 3.67 kB 3 [emitted] shared.js
+ 269 hidden modules