Ich versuche etwas zu tun, von dem ich glaube, dass es möglich sein sollte, aber ich kann es wirklich nicht verstehen, nur aus der Webpack-Dokumentation.
Ich schreibe eine JavaScript-Bibliothek mit mehreren Modulen, die voneinander abhängen können oder nicht. Darüber hinaus wird jQuery von allen Modulen verwendet, und einige von ihnen benötigen möglicherweise jQuery-Plugins. Diese Bibliothek wird dann auf mehreren verschiedenen Websites verwendet, für die möglicherweise einige oder alle Module erforderlich sind.
Das Definieren der Abhängigkeiten zwischen meinen Modulen war sehr einfach, aber das Definieren der Abhängigkeiten von Drittanbietern scheint schwieriger zu sein, als ich erwartet hatte.
Was ich erreichen möchte : Für jede App möchte ich zwei Bundle-Dateien haben, eine mit den erforderlichen Abhängigkeiten von Drittanbietern und eine mit den erforderlichen Modulen aus meiner Bibliothek.
Beispiel : Stellen wir uns vor, meine Bibliothek enthält die folgenden Module:
- a (erfordert: jquery, jquery.plugin1)
- b (erfordert: jquery, a)
- c (erfordert: jquery, jquery.ui, a, b)
- d (erfordert: jquery, jquery.plugin2, a)
Und ich habe eine App (siehe sie als eindeutige Eintragsdatei), die die Module a, b und c benötigt. Webpack für diesen Fall sollte die folgenden Dateien generieren:
- Vendor Bundle : mit jquery, jquery.plugin1 und jquery.ui;
- Website-Bundle : mit Modulen a, b und c;
Am Ende würde ich es vorziehen, jQuery als global zu haben, damit ich es nicht für jede einzelne Datei benötigen muss (ich könnte es zum Beispiel nur für die Hauptdatei benötigen). Und jQuery-Plugins würden nur $ global erweitern, falls sie benötigt werden (es ist kein Problem, wenn sie anderen Modulen zur Verfügung stehen, die sie nicht benötigen).
Angenommen, dies ist möglich, was wäre ein Beispiel für eine Webpack-Konfigurationsdatei für diesen Fall? Ich habe verschiedene Kombinationen von Ladern, externen Geräten und Plugins in meiner Konfigurationsdatei ausprobiert, aber ich verstehe nicht wirklich, was sie tun und welche ich verwenden soll. Danke dir!
quelle
Antworten:
In meiner Datei webpack.config.js (Version 1,2,3) habe ich
in meinem Plugins-Array
Jetzt habe ich eine Datei, die nur nach Bedarf Bibliotheken von Drittanbietern zu einer Datei hinzufügt.
Wenn Sie detaillierter werden möchten, wo Sie Ihre Lieferanten und Einstiegspunktdateien trennen:
Beachten Sie, dass die Reihenfolge der Plugins sehr wichtig ist.
Dies wird sich auch in Version 4 ändern. Wenn dies offiziell ist, aktualisiere ich diese Antwort.
Update: Index der Suchänderung für Windows-Benutzer
quelle
isExternal
inminChunks
machte meinen Tag. Wie ist das nicht dokumentiert? Es gibt Nachteile?options.minChunks (number|Infinity|function(module, count) -> boolean):
sehe ich noch keinen Nachteil.module.userRequest
(und der Lader sich wahrscheinlich in befindetnode_modules
). Mein Code fürisExternal()
:return typeof module.userRequest === 'string' && !!module.userRequest.split('!').pop().match(/(node_modules|bower_components|libraries)/);
Ich bin nicht sicher, ob ich Ihr Problem vollständig verstehe, aber da ich kürzlich ein ähnliches Problem hatte, werde ich versuchen, Ihnen zu helfen.
Vendor Bundle.
Sie sollten dafür CommonsChunkPlugin verwenden . In der Konfiguration geben Sie den Namen des Blocks (z. B.
vendor
) und den Dateinamen an, der generiert werden soll (vendor.js
).Jetzt wichtiger Teil, müssen Sie jetzt angeben, was
vendor
Bibliothek bedeutet, und das tun Sie in einem Eintragsabschnitt. Ein weiteres Element zur Eintragsliste mit demselben Namen wie der Name des neu deklarierten Blocks (in diesem Fall dh "Anbieter"). Der Wert dieses Eintrags sollte die Liste aller Module sein, die Sie zum Bündeln verschieben möchtenvendor
. in deinem Fall sollte es ungefähr so aussehen:JQuery als global
Hatte das gleiche Problem und löste es mit ProvidePlugin . Hier definieren Sie kein globales Objekt, sondern eine Art Shurtcuts zu Modulen. dh Sie können es so konfigurieren:
Und jetzt können Sie es einfach
$
überall in Ihrem Code verwenden - Webpack konvertiert das automatisch inIch hoffe es hat geholfen. Sie können sich auch meine Webpack-Konfigurationsdatei ansehen, die sich hier befindet
Ich liebe Webpack, aber ich stimme zu, dass die Dokumentation nicht die schönste der Welt ist ... aber hey ... die Leute sagten am Anfang dasselbe über Angular-Dokumentation :)
Bearbeiten:
Verwenden Sie CommonsChunkPlugins mehrmals, um Einstiegspunkt-spezifische Hersteller-Chunks zu erhalten:
und deklarieren Sie dann verschiedene Erweiterungsbibliotheken für verschiedene Dateien:
Wenn sich einige Bibliotheken (und für die meisten von ihnen) zwischen Einstiegspunkten überschneiden, können Sie sie mit demselben Plugin und unterschiedlicher Konfiguration in eine gemeinsame Datei extrahieren. Siehe dieses Beispiel.
quelle
Falls Sie daran interessiert sind, Ihre Skripte automatisch getrennt von denen des Anbieters zu bündeln:
Weitere Informationen zu dieser Funktion finden Sie in der offiziellen Dokumentation .
quelle
vendor : Object.keys(pkg.dependencies)
dies nicht immer funktioniert und davon abhängt, wie das Paket erstellt wird.package.json
eingestellt sind. Diese Problemumgehung funktioniert in den meisten Fällen, es gibt jedoch Ausnahmen, in denen Sie einen anderen Weg einschlagen müssen. Es könnte interessant sein, eine eigene Antwort auf die Frage zu veröffentlichen, um der Community zu helfen.Object.keys(pkg.dependencies)
alles gebündelt wird !!!! Nehmen wir an, Sie haben dort eine Reihe von Ladern aufgelistet ... ja, das wird enthalten sein !!! Also pass auf dich auf ... trenne vorsichtig, was devDependency und was dependency istdependencies
?Ich bin mir auch nicht sicher, ob ich Ihren Fall vollständig verstehe, aber hier ist ein Konfigurationsausschnitt, mit dem Sie für jedes Ihrer Bundles separate Vendor Chunks erstellen können:
Und Link zu
CommonsChunkPlugin
Dokumenten: http://webpack.github.io/docs/list-of-plugins.html#commonschunkpluginquelle
react
sollte es nur dann im Vendor-Bundle vorhanden sein, wenn es von Bundle1 und Bundl2 explizit benötigt wird. Ich sollte das nicht in der Konfigurationsdatei angeben müssen ... Ist das sinnvoll? Irgendwelche Ideen?