2015-08-26 18 views
34

Quando ho una configurazione del caricatore con più test corrispondenti a un file, mi aspetto che venga utilizzato solo il primo caricatore corrispondente, ma non sembra essere il caso.Qual è l'ordine del caricatore per il webpack?

Ho provato a leggere the source ma anche quando ho trovato il bit che penso implementa il caricamento non riesco a capire come si comporta.

The documentation non menziona come dovrebbe comportarsi quella situazione.

risposta

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

e

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

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

Si noti che entro loaders vengono valutati da da destra a sinistra.

+1

Hmm, un comportamento non molto utile penso: -/avrei preferito utilizzare Preloaders per quel comportamento ... – w00t

+0

Io preferisco usare quest'ultima forma. I "pre-caricatori" hanno i loro usi per la spazzatura e simili controlli. Ci sono anche 'postLoaders' ma finora non ho trovato alcun buon uso per quelli. Detto questo, forse ce ne sono alcuni. –

+0

Apparentemente il caso d'uso per "postLoaders" è la copertura del codice. Fonte: https://webpack.github.io/docs/loaders.html. –

23

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

1.

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

2.

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

3.

caricamento possono essere concatenati. Vengono applicati in una pipeline alla risorsa . Il caricatore finale dovrebbe restituire JavaScript; ogni altro caricatore può restituire l'origine in formato arbitrario, che viene passato a il prossimo caricatore.

Quindi ...

Se avete somefile.css e si passa attraverso loaderOne, loaderTwo, loaderThree è si comporta come una funzione incatenato regolare.

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

significa exactlly lo stesso ...

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

se si proviene da grugnito || gulp world è confuso. Basta leggere l'ordine dei caricatori da destra a sinistra.

+1

Ho questa matrice di module.loaders, in quale ordine vengono eseguiti? –

+1

PERCHÉ FANNO CARICO FONDO IN BASSO! ?? – light24bulbs

1

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

Diciamo che avete un url-loader nella configurazione con una priorità maggiore rispetto file-loader e che ci piace importare un percorso di immagine con quest'ultimo. Non fare nulla importerebbe il file tramite url-loader (che crea un data-url codificato).

Il prefisso dell'importazione con file-loader! indirizzava l'importazione a tale caricatore.

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

Sì, anche se mi piace evitarlo perché non è possibile decidere al momento della compilazione se il file deve essere un collegamento o incorporato. Puoi anche iniziare con '!!' per saltare altri caricatori BTW ... – w00t

Problemi correlati