Zu v2 oder v3 von v1

Dez 20, 2021
admin

Die folgenden Abschnitte beschreiben die wichtigsten Änderungen von webpack 1 zu 2.

resolve.root, resolve.fallback, resolve.modulesDirectories

Diese Optionen wurden durch eine einzige Option resolve.modules ersetzt. Siehe auflösen für weitere Verwendung.

 resolve: {- root: path.join(__dirname, "src")+ modules: }

resolve.extensions

Diese Option erfordert nicht mehr die Übergabe eines leeren Strings. Dieses Verhalten wurde nach resolve.enforceExtension verschoben. Siehe Auflösen für weitere Verwendung.

resolve.*

Hier wurden mehrere APIs geändert. Nicht im Detail aufgeführt, da es nicht häufig verwendet wird. Siehe auflösen für Details.

module.loaders ist jetzt module.rules

Die alte Laderkonfiguration wurde durch ein leistungsfähigeres Regelsystem ersetzt, das die Konfiguration von Ladern und mehr erlaubt. Aus Kompatibilitätsgründen ist die alte module.loaders-Syntax noch gültig und die alten Namen werden geparst. Die neuen Namenskonventionen sind einfacher zu verstehen und sind ein guter Grund, die Konfiguration auf module.rules zu aktualisieren.

 module: {- loaders: }, { test: /\.jsx$/, loader: "babel-loader", // Do not use "use" here options: { // ... } } ] }

Loader verketten

Wie in Webpack 1 können Loader verkettet werden, um Ergebnisse von Loader zu Loader weiterzugeben. Mit der Konfigurationsoption rule.use kann use auf ein Array von Loadern gesetzt werden. In Webpack 1 wurden Lader üblicherweise mit ! verkettet. Dieser Stil wird nur mit der Legacy-Option module.loaders unterstützt.

 module: {- loaders: }] }

Automatische Erweiterung des Modulnamens des Laders entfernt

Es ist nicht mehr möglich, die Erweiterung -loader wegzulassen, wenn auf Lader verwiesen wird:

 module: { rules: } ] }

Sie können immer noch das alte Verhalten mit der Konfigurationsoption resolveLoader.moduleExtensions wählen, aber dies wird nicht empfohlen.

+ resolveLoader: {+ moduleExtensions: + }

Siehe #2986 für den Grund für diese Änderung.

json-loader wird nicht mehr benötigt

Wenn kein Loader für eine JSON-Datei konfiguriert wurde, wird webpack automatisch versuchen, die JSON-Datei mit dem json-loader zu laden.

 module: { rules: }

Wir haben uns dazu entschlossen, dies zu tun, um Umgebungsunterschiede zwischen webpack, node.js und browserify auszugleichen.

Loader in der Konfiguration lösen sich relativ zum Kontext auf

In webpack 1 lösen sich konfigurierte Loader relativ zur angepassten Datei auf. In webpack 2 jedoch werden konfigurierte Lader relativ zur context-Option aufgelöst.

Dies löst einige Probleme mit doppelten Modulen, die durch Lader verursacht werden, wenn npm link verwendet wird oder Module außerhalb der context referenziert werden.

Sie können einige Hacks entfernen, um dies zu umgehen:

 module: { rules: }, resolveLoader: {- root: path.resolve(__dirname, "node_modules") }

module.preLoaders und module.postLoaders wurden entfernt:

 module: {- preLoaders: }

UglifyJsPlugin sourceMap

Die Option sourceMap der UglifyJsPlugin ist jetzt standardmäßig auf false statt true eingestellt. Das bedeutet, wenn Sie Source Maps für minimierten Code verwenden oder korrekte Zeilennummern für uglifyjs-Warnungen wünschen, müssen Sie sourceMap: true für UglifyJsPlugin setzen.

 devtool: "source-map", plugins: 

UglifyJsPlugin-Warnungen

Die compress.warnings-Option des UglifyJsPlugin ist jetzt standardmäßig auf false statt true eingestellt. Das bedeutet, dass man compress.warnings auf true setzen muss, wenn man uglifyjs-Warnungen sehen will.

 devtool: "source-map", plugins: 

UglifyJsPlugin minimiert Lader

UglifyJsPlugin schaltet Lader nicht mehr in den Minimierungsmodus. Die Einstellung minimize: true muss langfristig über Loader-Optionen übergeben werden. Siehe Loader-Dokumentation für relevante Optionen.

Der Minimierungsmodus für Lader wird in Webpack 3 oder später entfernt.

Um die Kompatibilität mit alten Ladern zu erhalten, können Lader per Plugin in den Minimierungsmodus geschaltet werden:

 plugins: 

DedupePlugin wurde entfernt

webpack.optimize.DedupePlugin wird nicht mehr benötigt. Entferne es aus deiner Konfiguration.

BannerPlugin – brechende Änderung

BannerPlugin akzeptiert nicht mehr zwei Parameter, sondern ein einziges Options-Objekt.

 plugins: 

OccurrenceOrderPlugin ist nun standardmäßig aktiviert

Das OccurrenceOrderPlugin ist nun standardmäßig aktiviert und wurde umbenannt (OccurenceOrderPlugin in webpack 1). Stellen Sie also sicher, dass Sie das Plugin aus Ihrer Konfiguration entfernen:

 plugins: 

ExtractTextWebpackPlugin – breaking change

ExtractTextPlugin benötigt Version 2, um mit Webpack 2 zu funktionieren.

npm install --save-dev extract-text-webpack-plugin

Die Konfigurationsänderungen für dieses Plugin sind hauptsächlich syntaktisch.

module: { rules: }

new ExtractTextPlugin({options})

plugins: 

Vollständige dynamische Anforderungen scheitern nun standardmäßig

Eine Abhängigkeit mit nur einem Ausdruck (z. B. require(expr)) erzeugt nun einen leeren Kontext anstelle des Kontexts des kompletten Verzeichnisses.

Code wie dieser sollte überarbeitet werden, da er nicht mit ES2015-Modulen funktioniert. Wenn dies nicht möglich ist, können Sie die ContextReplacementPlugin verwenden, um den Compiler auf die korrekte Auflösung hinzuweisen.

Verwendung von benutzerdefinierten Argumenten in CLI und Konfiguration

Wenn Sie die CLI missbraucht haben, um benutzerdefinierte Argumente an die Konfiguration zu übergeben, wie zum Beispiel:

webpack --custom-stuff

// webpack.config.jsvar customStuff = process.argv.indexOf('--custom-stuff') >= 0;/* ... */module.exports = config;

Sie werden feststellen, dass dies nicht mehr erlaubt ist. Die CLI ist jetzt strenger.

Stattdessen gibt es eine Schnittstelle zur Übergabe von Argumenten an die Konfiguration. Diese sollte stattdessen verwendet werden. Zukünftige Tools könnten sich darauf verlassen.

webpack --env.customStuff

module.exports = function (env) { var customStuff = env.customStuff; /* ... */ return config;};

Siehe CLI.

require.ensure und AMD require sind asynchron

Diese Funktionen sind jetzt immer asynchron, anstatt ihren Callback synchron aufzurufen, wenn der Chunk bereits geladen ist.

require.ensure hängt jetzt von nativen Promises ab. Wenn require.ensure in einer Umgebung verwendet wird, in der diese fehlen, wird ein Polyfill benötigt.

Die Konfiguration des Laders erfolgt über Optionen

Man kann einen Lader nicht mehr mit einer benutzerdefinierten Eigenschaft im webpack.config.js konfigurieren. Dies muss über die options erfolgen. Die folgende Konfiguration mit der Eigenschaft ts ist mit Webpack 2 nicht mehr gültig:

module.exports = { //... module: { rules: , }, // does not work with webpack 2 ts: { transpileOnly: false },};

Was sind Optionen?

Gute Frage. Nun, streng genommen sind es 2 mögliche Dinge; beide Möglichkeiten, einen Webpack-Loader zu konfigurieren. Klassischerweise hieß options query und war ein String, der an den Namen des Loaders angehängt werden konnte. Ähnlich wie ein Query-String, aber eigentlich mit mehr Befugnissen:

module.exports = { //... module: { rules: , },};

Es kann aber auch ein separat spezifiziertes Objekt sein, das zusammen mit einem Loader geliefert wird:

module.exports = { //... module: { rules: , },};

LoaderOptionsPlugin context

Einige Loader benötigen Kontextinformationen und lesen sie aus der Konfiguration. Diese müssen über Loader-Optionen in der Langzeit übergeben werden. Siehe Loader-Dokumentation für relevante Optionen.

Um die Kompatibilität mit alten Loadern zu erhalten, können diese Informationen per Plugin übergeben werden:

 plugins: 

debug

Die Option debug schaltet Loader in Webpack 1 in den Debug-Modus. Dies muss langfristig über Loader-Optionen übergeben werden. Siehe Loader-Dokumentation für relevante Optionen.

Der Debug-Modus für Loader wird in webpack 3 oder später entfernt.

Um die Kompatibilität mit alten Loadern aufrechtzuerhalten, können Loader über ein Plugin in den Debug-Modus geschaltet werden:

- debug: true, plugins: 

Code-Splitting mit ES2015

In webpack 1 konnte man require.ensure() als Methode zum Lazily-Loading von Chunks für die Anwendung verwenden:

require.ensure(, function (require) { var foo = require('./module');});

Die ES2015 Loader-Spezifikation definiert import() als Methode, um ES2015 Module dynamisch zur Laufzeit zu laden. webpack behandelt import() als einen Split-Punkt und legt das angeforderte Modul in einem separaten Chunk ab. import() nimmt den Modulnamen als Argument und gibt ein Promise zurück.

function onClick() { import('./module') .then((module) => { return module.default; }) .catch((err) => { console.log('Chunk loading failed'); });}

Gute Nachrichten: Das Fehlschlagen des Ladens eines Chunks kann jetzt behandelt werden, da sie auf Promise basieren.

Dynamische Ausdrücke

Es ist möglich, einen partiellen Ausdruck an import() zu übergeben. Dies wird ähnlich wie bei Ausdrücken in CommonJS gehandhabt (webpack erstellt einen Kontext mit allen möglichen Dateien).

import()erzeugt einen separaten Chunk für jedes mögliche Modul.

function route(path, query) { return import(`./routes/${path}/route`).then( (route) => new route.Route(query) );}// This creates a separate chunk for each possible route

Mischen von ES2015 mit AMD und CommonJS

Wie bei AMD und CommonJS können Sie alle drei Modultypen frei mischen (sogar innerhalb derselben Datei). webpack verhält sich in diesem Fall ähnlich wie babel und node-eps:

// CommonJS consuming ES2015 Modulevar book = require('./book');book.currentPage;book.readPage();book.default === 'This is a book';
// ES2015 Module consuming CommonJSimport fs from 'fs'; // module.exports map to defaultimport { readFileSync } from 'fs'; // named exports are read from returned object+typeof fs.readFileSync === 'function';typeof readFileSync === 'function';

Es ist wichtig zu beachten, dass Sie Babel anweisen wollen, diese Modulsymbole nicht zu parsen, damit webpack sie verwenden kann. Sie können dies tun, indem Sie die folgenden Einstellungen in Ihren .babelrc oder babel-loader Optionen vornehmen.

.babelrc

{ "presets": ]}

Hinweise

Keine Notwendigkeit etwas zu ändern, aber Möglichkeiten

Template-Strings

webpack unterstützt jetzt Template-Strings in Ausdrücken. Das bedeutet, dass man sie in Webpack-Konstrukten verwenden kann:

- require("./templates/" + name);+ require(`./templates/${name}`);

Configuration Promise

webpack unterstützt nun die Rückgabe eines Promise aus der Konfigurationsdatei. Dies ermöglicht eine asynchrone Verarbeitung in der Konfigurationsdatei.

webpack.config.js

module.exports = function () { return fetchLangs().then((lang) => ({ entry: '...', // ... plugins: , }));};

Erweitertes Loader-Matching

webpack unterstützt jetzt mehr Dinge, die für Loader passen.

module.exports = { //... module: { rules: , },};

Mehr CLI-Optionen

Es gibt einige neue CLI-Optionen, die Sie verwenden können:

--define process.env.NODE_ENV="production" Siehe DefinePlugin.

--display-depth Zeigt die Entfernung zum Einstiegspunkt für jedes Modul an.

--display-used-exports zeigt an, welche Exporte in einem Modul verwendet werden.

--display-max-modules legt die Anzahl der Module fest, die in der Ausgabe angezeigt werden (Standardwert ist 15).

-p definiert jetzt auch process.env.NODE_ENV bis "production".

Loader-Änderungen

Änderungen, die nur für Loader-Autoren relevant sind.

Cacheable

Loader sind jetzt standardmäßig cachefähig. Lader müssen sich abmelden, wenn sie nicht cachefähig sind.

 // Cacheable loader module.exports = function(source) {- this.cacheable(); return source; }
 // Not cacheable loader module.exports = function(source) {+ this.cacheable(false); return source; }

Komplexe Optionen

Webpack 1 unterstützt nur JSON.stringify-fähige Optionen für Lader.

Webpack 2 unterstützt nun jedes JS-Objekt als Laderoptionen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.