2016-05-23 30 views
7

Sto creando un'applicazione con angular 2, sass e webpack e sto riscontrando problemi con l'url sui file sass richiesti all'interno di ciascun componente (utilizzando richiedono); non prende quei file e li copia nella cartella delle risorse e non modifica l'url degli stili css creati. Funziona correttamente quando uso l'importazione e con le risorse all'interno del componente html.I caricatori di file e URL Webpack non funzionano sugli stili di componente Angular 2

caricatori:

 ...{ 
      test: /\.html$/, 
      loader: 'html' 
     }, 
     { 
      test: /\.(png|jpe?g|gif)$/, 
      loader: 'file?name=assets/[name].[hash].[ext]' 
     }, 
     { 
      test: /\.scss/, 
      exclude: helpers.root('src', 'app'), 
      loader: ExtractTextPlugin.extract('style', 'css?sourceMap!sass?sourceMap') 
     }, 
     { 
      test: /\.scss$/, 
      include: helpers.root('src', 'app'), 
      loaders: ['raw', 'resolve-url', 'sass?sourceMap'] 
     }... 

Richiede stili:

... 
styles: [require('./hero-image.scss')] 
template: require('./hero-image.component.html') 
... 

Sass

... 
background: url('../../../public/img/hero-bg.jpg'); 
... 

Qui i caricatori (quando build) dovrebbe copiare eroe-bg.jpg a/attività/e nel css costruito lo sfondo dovrebbe essere /assets/hero-bg.jpg ma non copia l'immagine in cartelle di risorse e creazione di css ed rimane come il sass.

NOTA: Quando utilizzo l'importazione anziché richiedere (modificando ovviamente le regole dei caricatori) a questo punto funziona correttamente. All'interno del componente html (hero-image.component.html) ho questo <img src="../../../public/img/btn-google-play.jpg" /> e funziona anche correttamente.

Provo con this angular 2 starter pack e il problema si verifica anche.

Grazie per l'aiuto, lo apprezzo molto.

Edit: Ho dimenticato di dire che questo accade anche utilizzando solo i CSS (senza sass) e seguendo la official angular documentation about webpack

risposta

13

Dopo molte ricerche e molti tentativi ho trovato un approccio utilizzando il exports-loader di quel lavoro e può essere facilmente aggiornato.

{ 
    test: /\.scss$/, 
    include: helpers.root('src', 'app'), 
    loaders: ['exports-loader?module.exports.toString()', 'css', 'sass'] 
} 

Grazie a @BobSponge per il vostro aiuto, mi avete guidato nella giusta direzione.

+0

Grazie David! Sono contento di aver trovato questo dopo ore di provare soluzioni che non funzionano =) – rjmarques

3

assomiglia errato esempio config nella documentazione angolari.

Nessuno di questi caricatori processa url() in css e pubblica le risorse nella cartella di destinazione: 'raw', 'resolve-url', 'sass'. Nonostante il nome, il caricatore resolve-url sostituisce solo gli url relativi a css-loader.

Quindi, si dovrebbe aggiungere css-loader al config all'ultimo SCSS del caricatore:

{ 
    test: /\.scss$/, 
    include: helpers.root('src', 'app'), 
    loaders: ['css', 'resolve-url', 'sass?sourceMap'] 
} 

stili richiedono sarà cambiato in:

styles: [require('./hero-image.scss').toString()] 

Da docs: @import e url(...) [in css file] sono interpretati come require() e verranno risolti dallo css-loader.

+0

Non funziona :(, Questo rompe gli stili generati perché il codice di add js all'interno del grezzo. 'Module.exports = "esportazioni = modulo .exports = require (... ' –

+0

Mi spiace, non ho notato che' css-loader' non produce un semplice css. Prova a rimuovere ''raw''. –

+0

Non funziona perché gli stili angolari ricevono è una matrice di stringhe, quindi Ricevo un errore quando provo a eseguire il rendering. –

0

Un'alternativa a exports-loader?module.exports.toString() è quella di utilizzare il to-string-loader menzionato nel css-loader readme

+0

Mentre questo link può rispondere alla domanda, il link solo risposte sono scoraggiate su Stack Overflow, è possibile migliorare questa risposta prendendo parti vitali del link e inserendolo nella tua risposta, questo assicura che la tua risposta sia ancora una risposta se il link viene modificato o rimosso :) – WhatsThePoint

Problemi correlati