Hier ist, was ich versuche zu tun:Dynamisches Laden webpack Bündel von einem anderen Projekt
eine SubApp
haben, dass, wenn sie mit webpack gebaut, ein vendor.js erstellt und app.js Bundles. Die auf diese Weise erstellte Anwendung funktioniert bereits. Haben Sie eine MainApp
, die Anbieter und App-Pakete von SubApp
dynamisch lädt. Dies funktioniert nicht.
Wenn die Pakete geladen, erhalte ich folgende Fehlermeldung:
Cannot read property 'call' of undefined
Alle Code Code I bin mit:
SubApp
webpack config:
{
context: path.resolve(__dirname, './src'),
entry: {
app: './app.js',
},
output: {
path: path.resolve(__dirname, './dist'),
filename: '[name].js',
},
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks(module) {
return module.context && module.context.indexOf('node_modules') >= 0;
},
}),
],
};
SubApp
app.js:
import angular from 'angular';
angular.module('barApp', [])
.component('foobar', {
template: `BAR APP`,
});
MainApp
webpack config:
{
context: path.resolve(__dirname, './src'),
entry: {
app: './nav.js',
},
output: {
path: path.resolve(__dirname, './dist'),
filename: '[name].js',
},
module: {
rules: [
{
test: /\.html$/,
use: [{ loader: 'html-loader' }],
},
],
},
devServer: {
contentBase: path.resolve(__dirname, './src'),
},
};
MainApp
app.js:
Promise.all([
import('./SubApp/dist/vendor.js'),
import('./SubApp/dist/app.js'),
]).then(([ vendor, app ]) => {
console.log('Success');
}).catch(err => {
console.log("Chunk loading failed", err);
});
Lauf MainApp
(ob von dev-Server oder gebaut Dateien) erzeugt: Chunk loading failed TypeError: Cannot read property 'call' of undefined
.
Ich benutze webpack 2.5.0.
Edit: Nach einigen Untersuchungen sieht es so aus, als könnte ich mein aktuelles Setup funktionieren lassen, wenn ich Vendor und App sequenziell lade, würde aber das Laden erheblich verlangsamen, da ich auf das große warten müsste (Vendor) -Bündel, das zuerst geladen wird, bevor die aktuelle App abgerufen wird.
AFAIK, dynamisch geladene Module sollten weiterhin in der Reihenfolge ausgeführt werden, in der sie angefordert werden, nicht in der Reihenfolge, in der die Anforderung zuerst abgeschlossen wird.
Es gibt einige Hinweise, dass ich SubApp
als library verpacken könnte, aber es ist mir nicht klar, wie das geht, wenn ich separate Anbieter und App-Bundles haben möchte.
Hallo William. Der Grund, warum ich asynchrone Module verwende, ist, das zu vermeiden, was Sie vorgeschlagen haben. MainApp würde sofort geladen werden, da es in meinem Fall nur Module benötigt, die bei Bedarf geladen werden müssen. Im wirklichen Leben würde es nicht eine, sondern mehrere SubApps geben. Wenn Sie alle an MainApp senden, müssen Sie ein paar MB-Pakete an den Client senden, unabhängig davon, ob sie die Funktionalität benötigen, die jede SubApp hat oder nicht (und das nach der Minification und dem Gziping). –
In jedem Fall ist mein Problem, alle Dateien gleichzeitig laden zu können, aber sie in der Reihenfolge ausführen zu können, in der sie aufgelistet sind - wie es passieren würde, wenn ich