Wenn Sie checkAuth
in ./AuthenticationContainer.js
haben, dann verschieben Sie es zu routes.js
oder erstellen Sie eine neue js-Datei und fordern Sie es in routes.js. Grundsätzlich muss die Funktion, die auf dem Haken onEnter
ausgeführt werden soll, vorhanden sein, bevor die Komponente getComponent
benötigt wird.
sieht mein routes.js wie this-
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)
})
}
}]
}]
}
};
Ich bin nicht sicher, ob Sie es geladen checkAuth
innerhalb require.ensure
und stoppen Sie die Komponente aus wird anrufen, wenn nicht authentifiziert ist. Dies ist ein schlechter Ansatz, da Sie die Komponente laden und dann überprüfen, ob sie authentifiziert ist. Dies negiert die Vorteile der Codeaufteilung.
Bearbeiten - webpack.config.js
Hinzufügen
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 Ausgang bauen -
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
Arjun, würde dies nicht bedeuten, dass jederzeit der Benutzer die codesplitting für über den 'über' Pfad besucht .jsx würde keinen großen Nutzen bringen, da sich die Eigenschaft requireAuth immer noch in der JS-Hauptdatei befindet und immer benötigt wird. – jasan
Muss ich auch meine Webpack-Konfiguration ändern? weil Ereignis nach dem Hinzufügen von require.ensure das webpack -p keine zusätzlichen js-Dateien erstellt hat – jasan
@jasan - Sie können Ihr Login/Anmeldeformular und zugehörige Funktionen in AuthenticationContainer.js und checkAuth im Haupt-Chunk behalten, da Sie checkAuth immer ausführen Überprüfen Sie, ob der Benutzer angemeldet ist, bevor Sie zu einer neuen Route wechseln. Ich sehe CheckAuth als Hilfsprogramm, das von der gesamten App und nicht nur von einem oder zwei Containern benötigt wird. Hinweis - Sie teilen Ihren Code immer noch auf. AuthenticationContainer wird nur ausgeführt, wenn der Benutzer nicht angemeldet ist. Wenn sich der Benutzer immer bei der App anmelden muss, ist es nicht sinnvoll, den AuthenticationContainer in einen Chunk zu teilen, da dieser immer benötigt wird. –