Qual è l'ordine del caricatore per webpack?


87

Quando ho una configurazione del caricatore con più test che corrispondono a un file, mi aspetto che venga utilizzato solo il primo caricatore corrispondente, ma non sembra essere il caso.

Ho provato a leggere il sorgente ma anche quando ho trovato il bit che secondo me implementa il caricamento non riesco a capire come si comporta.

La documentazione non menziona nemmeno come dovrebbe comportarsi quella situazione.

Risposte:


110
{
    test: /\.css$/,
    loaders: ['style'],
},
{
    test: /\.css$/,
    loaders: ['css'],
},

e

{
    test: /\.css$/,
    loaders: ['style', 'css'],
},

sembrano essere uguali. In termini di funzionalità, questo è lo stesso di style(css(file))(grazie Miguel).

Notare che all'interno loadersvengono valutati da destra a sinistra .


2
Hmm, comportamento non molto utile penso: - / Preferirei usare i preLoader per quel comportamento ...
w00t

20
I caricatori agiscono come funzioni, ecco perché va da destra a sinistra. Quando lo usi "style!css", immaginali come funzioni: style( css( file ) )... in questo caso cssviene chiamato per primo.
Miguel Angelo

13
La valutazione da DESTRA a SINISTRA mi ha fatto lottare per un po '. @ miguel-angelo la tua style( css( file ) )spiegazione è un sollievo per me.
Evi Song

1
Da DESTRA a SINISTRA molto probabilmente significa essenzialmente dal BASSO all'ALTO, quando guardiamo la sintassi Webpack 3 ... più in basso: prima alias funzione più interna ...
Frank Nocke

1
Non so quando sia stato aggiunto, ma finalmente c'è la documentazione sull'ordine: webpack.js.org/concepts/loaders/#loader-features I caricatori possono essere concatenati. Ogni programma di caricamento nella catena applica le trasformazioni alla risorsa elaborata. Una catena viene eseguita in ordine inverso. Il primo caricatore passa il suo risultato (risorsa con trasformazioni applicate) a quello successivo e così via. Infine, webpack si aspetta che JavaScript venga restituito dall'ultimo caricatore della catena.
Eric Majerus

61

La documentazione ufficiale lo spiega molto bene. Sfortunatamente tutte le informazioni necessarie sono distribuite in diverse sezioni della documentazione. Fammi concludere tutto ciò che devi sapere.

1.

Assicurati che siano nell'ordine corretto (dal basso verso l'alto).

2.

Sono funzioni che prendono l'origine di un file di risorse come parametro e restituiscono la nuova origine.

3.

I caricatori possono essere concatenati. Vengono applicati in una pipeline alla risorsa. Il caricatore finale dovrebbe restituire JavaScript; ogni altro caricatore può restituire l'origine in un formato arbitrario, che viene passato al caricatore successivo.

Così...

Se si dispone somefile.csse si sta passando attraverso loaderOne, loaderTwo, loaderThreeè si comporta come una funzione incatenato regolare.

{
    test: /\.css$/,
    loaders: ['loaderOne', 'loaderTwo', 'loaderThree']
}

significa esattamente lo stesso di ...

loaderOne(loaderTwo(loaderThree(somefile.css)))

Se vieni da grugnito || gulp world è confuso. Basta leggere l'ordine dei caricatori da destra a sinistra.


1
Ho questo array di module.loaders, in quale ordine vengono eseguiti?
Saras Arya

45
PERCHÉ CARICANO DAL BASSO ALL'ALTO! ??
lampadine il

potresti voler modificare la risposta per specificare che il "caricatore finale" nella documentazione è loaderOnenel tuo esempio
aaaaaa

1
@ light24bulbs in modo che tu possa aggiungere caricatori aggiuntivi con un semplice .pushalle regole e non devi preoccuparti di anteporli.
Sarke

3

Questa risposta mi è stata utile, ma vorrei completare con un altro punto che influisce sull'ordine del caricatore, che è il nome del caricatore! approccio.

Supponiamo che tu abbia un url-loadernella tua configurazione con una priorità più alta di file-loadere desideri importare un percorso immagine con quest'ultima. Non fare nulla importerebbe il file tramite url-loader(che crea un data-url codificato).

Prefissare l'importazione con file-loader!indirizzerebbe l'importazione a quel caricatore.

import image from 'file-loader!./my-img.png'

3
Sì, anche se mi piace evitarlo perché in quel momento non puoi decidere in fase di compilazione se il file deve essere un collegamento o incorporato. Puoi anche iniziare con !!per saltare qualsiasi altro caricatore BTW ...
w00t
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.