Till v2 eller v3 från v1
De följande avsnitten beskriver de viktigaste ändringarna från webpack 1 till 2.
resolve.root, resolve.fallback, resolve.modulesDirectories
De här alternativen har ersatts av ett enda alternativ resolve.modules
. Se resolving för mer användning.
resolve: {- root: path.join(__dirname, "src")+ modules: }
resolve.extensions
Detta alternativ kräver inte längre att en tom sträng överförs. Detta beteende flyttades till resolve.enforceExtension
. Se resolving för mer användning.
resolve.*
Flera API:er ändrades här. Listas inte i detalj eftersom det inte är vanligt förekommande. Se resolving för mer information.
module.loaders är nu module.rules
Den gamla lastarkonfigurationen ersattes av ett kraftfullare regelsystem, som gör det möjligt att konfigurera lastare med mera. Av kompatibilitetsskäl är den gamla module.loaders
-syntaxen fortfarande giltig och de gamla namnen analyseras. De nya namnkonventionerna är lättare att förstå och är en bra anledning att uppgradera konfigurationen till att använda module.rules
.
module: {- loaders: }, { test: /\.jsx$/, loader: "babel-loader", // Do not use "use" here options: { // ... } } ] }
Kedja laddare
Likt i webpack 1 kan laddare kedjas för att skicka resultat från laddare till laddare. Med hjälp av konfigurationsalternativet rule.use kan use
sättas till en array av laddare. I webpack 1 var det vanligt att lastare kedjades med !
. Denna stil stöds endast med hjälp av det gamla alternativet module.loaders
.
module: {- loaders: }] }
Automatisk -loader module name extension removed
Det är inte längre möjligt att utelämna -loader
-tillägget när man hänvisar till loaders:
module: { rules: } ] }
Du kan fortfarande välja det gamla beteendet med konfigurationsalternativet resolveLoader.moduleExtensions
, men detta rekommenderas inte.
+ resolveLoader: {+ moduleExtensions: + }
Se #2986 för orsaken till denna ändring.
json-loader krävs inte längre
När ingen loader har konfigurerats för en JSON-fil kommer webpack automatiskt att försöka ladda JSON-filen med json-loader
.
module: { rules: }
Vi bestämde oss för att göra detta för att utjämna miljöskillnader mellan webpack, node.js och browserify.
Laddare i konfiguration löser upp relativt till kontext
I webpack 1 löser konfigurerade laddare upp relativt till den matchade filen. I webpack 2 löser dock konfigurerade lastare relativt till context
-alternativet.
Detta löser vissa problem med dubbla moduler som orsakas av lastare när man använder npm link
eller hänvisar till moduler utanför context
.
Du kan ta bort några hack för att komma runt det här:
module: { rules: }, resolveLoader: {- root: path.resolve(__dirname, "node_modules") }
module.preLoaders och module.postLoaders har tagits bort:
module: {- preLoaders: }
UglifyJsPlugin sourceMap
Objektet sourceMap
i UglifyJsPlugin
har nu som standardvärde false
istället för true
. Detta innebär att om du använder källkodsmappningar för minimerad kod eller vill ha korrekta radnummer för uglifyjs-varningar måste du ställa in sourceMap: true
för UglifyJsPlugin
.
devtool: "source-map", plugins:
UglifyJsPlugin varnings
Optionen compress.warnings
i UglifyJsPlugin
har nu som standard false
i stället för true
. Detta innebär att om du vill se uglifyjs-varningar måste du ställa in compress.warnings
till true
.
devtool: "source-map", plugins:
UglifyJsPlugin minimize loaders
UglifyJsPlugin
växlar inte längre in loaders i minimize-läge. Inställningen minimize: true
måste överföras via laddningsalternativ på lång sikt. Se loader-dokumentationen för relevanta alternativ.
Minimera läget för loaders kommer att tas bort i webpack 3 eller senare.
För att bibehålla kompatibiliteten med gamla loaders kan loaders växlas till minimera läget via insticksmodulen:
plugins:
DedupePlugin har tagits bort
webpack.optimize.DedupePlugin
behövs inte längre. Ta bort den från din konfiguration.
BannerPlugin – brytningsändring
BannerPlugin
accepterar inte längre två parametrar, utan ett enda optionsobjekt.
plugins:
OccurrenceOrderPlugin är nu aktiverad som standard
The OccurrenceOrderPlugin
är nu aktiverad som standard och har bytt namn (OccurenceOrderPlugin
i webpack 1). Se därför till att ta bort insticksprogrammet från din konfiguration:
plugins:
ExtractTextWebpackPlugin – breaking change
ExtractTextPlugin kräver version 2 för att fungera med webpack 2.
npm install --save-dev extract-text-webpack-plugin
Konfigurationsändringarna för det här insticksprogrammet är huvudsakligen syntaktiska.
module: { rules: }
new ExtractTextPlugin({options})
plugins:
Fullt dynamiskt krav misslyckas nu som standard
Ett beroende med endast ett uttryck (dvs. require(expr)
) kommer nu att skapa en tom kontext i stället för kontexten för hela katalogen.
Kod som den här typen av kod bör omarbetas eftersom den inte fungerar med ES2015-moduler. Om detta inte är möjligt kan du använda ContextReplacementPlugin
för att ge kompilatorn en vink om rätt upplösning.
Användning av egna argument i CLI och konfiguration
Om du missbrukade CLI för att skicka egna argument till konfigurationen på följande sätt:
webpack --custom-stuff
// webpack.config.jsvar customStuff = process.argv.indexOf('--custom-stuff') >= 0;/* ... */module.exports = config;
Du kanske märker att detta inte längre är tillåtet. CLI är strängare nu.
Istället finns det ett gränssnitt för att skicka argument till konfigurationen. Detta bör användas i stället. Framtida verktyg kan förlita sig på detta.
webpack --env.customStuff
module.exports = function (env) { var customStuff = env.customStuff; /* ... */ return config;};
Se CLI.
require.ensure och AMD require är asynkrona
De här funktionerna är nu alltid asynkrona i stället för att anropa sin callback synkront om chunken redan är inläst.
require.ensure
är nu beroende av native Promise
s. Om du använder require.ensure
i en miljö som saknar dem behöver du en polyfill.
Laddarkonfiguration sker via alternativ
Du kan inte längre konfigurera en laddare med en anpassad egenskap i webpack.config.js
. Det måste göras via options
. Följande konfiguration med egenskapen ts
är inte längre giltig med webpack 2:
module.exports = { //... module: { rules: , }, // does not work with webpack 2 ts: { transpileOnly: false },};
Vad är alternativ?
God fråga. Tja, strängt taget är det 2 möjliga saker; båda sätten att konfigurera en webpack-loader. Klassiskt kallades options
för query
och var en sträng som kunde läggas till namnet på laddaren. Ungefär som en frågeserie-sträng men faktiskt med större befogenheter:
module.exports = { //... module: { rules: , },};
Men det kan också vara ett separat specificerat objekt som levereras tillsammans med en laddare:
module.exports = { //... module: { rules: , },};
LoaderOptionsPlugin context
Vissa laddare behöver kontextinformation och läser dem från konfigurationen. Detta måste överföras via loader options på lång sikt. Se dokumentation om laddare för relevanta alternativ.
För att behålla kompatibiliteten med gamla laddare kan den här informationen överföras via plugin:
plugins:
debug
Optionen debug
växlade laddare till felsökningsläge i webpack 1. Detta måste överföras via laddningsalternativ på lång sikt. Se loader-dokumentationen för relevanta alternativ.
Debugläget för loaders kommer att tas bort i webpack 3 eller senare.
För att behålla kompatibiliteten med gamla laddare kan laddare kopplas om till felsökningsläge via ett insticksmodul:
- debug: true, plugins:
Kodeuppdelning med ES2015
I webpack 1 kan du använda require.ensure()
som en metod för att lazily-ladda delar för din applikation:
require.ensure(, function (require) { var foo = require('./module');});
Specifikationen för ES2015 Loader definierar import()
som en metod för att ladda ES2015-moduler dynamiskt vid körning. webpack behandlar import()
som en delningspunkt och placerar den begärda modulen i en separat delning. import()
tar modulnamnet som argument och returnerar en Promise.
function onClick() { import('./module') .then((module) => { return module.default; }) .catch((err) => { console.log('Chunk loading failed'); });}
Goda nyheter: Fungerande laddning av en chunk kan nu hanteras eftersom de är Promise
baserade.
Dynamiska uttryck
Det är möjligt att skicka ett partiellt uttryck till import()
. Detta hanteras på samma sätt som uttryck i CommonJS (webpack skapar en kontext med alla möjliga filer).
import()
skapar en separat chunk för varje möjlig 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
Blandning av ES2015 med AMD och CommonJS
Som för AMD och CommonJS kan du fritt blanda alla tre modultyperna (även inom samma fil). webpack beter sig på samma sätt som babel och node-eps i det här fallet:
// 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';
Det är viktigt att notera att du vill be Babel att inte analysera dessa modulsymboler så att webpack kan använda dem. Du kan göra detta genom att ställa in följande i dina .babelrc
eller babel-loader
alternativ.
.babelrc
{ "presets": ]}
Hänvisningar
Ingen anledning att ändra något, men möjligheter
Mallsträngar
webpack stöder nu mallsträngar i uttryck. Detta innebär att du kan börja använda dem i webpack-konstruktioner:
- require("./templates/" + name);+ require(`./templates/${name}`);
Configuration Promise
webpack har nu stöd för att returnera en Promise
från konfigurationsfilen. Detta möjliggör asynkron behandling i din konfigurationsfil.
webpack.config.js
module.exports = function () { return fetchLangs().then((lang) => ({ entry: '...', // ... plugins: , }));};
Avancerad matchning av laddare
webpack har nu stöd för fler saker att matcha på för laddare.
module.exports = { //... module: { rules: , },};
Mer CLI-alternativ
Det finns några nya CLI-alternativ som du kan använda:
--define process.env.NODE_ENV="production"
Se DefinePlugin
.
--display-depth
visar avståndet till startpunkten för varje modul.
--display-used-exports
visar information om vilka exporter som används i en modul.
--display-max-modules
ställer in antalet för moduler som visas i utdata (standardvärdet är 15).
-p
definierar även process.env.NODE_ENV
till "production"
nu.
Loaderändringar
Förändringar som endast är relevanta för loaderförfattare.
Cacheable
Loader är nu cacheable som standard. Laddare måste välja bort om de inte är cacheable.
// Cacheable loader module.exports = function(source) {- this.cacheable(); return source; }
// Not cacheable loader module.exports = function(source) {+ this.cacheable(false); return source; }
Komplexa alternativ
webpack 1 har endast stöd för JSON.stringify
-kapabla alternativ för laddare.
webpack 2 har nu stöd för alla JS-objekt som laddningsalternativ.