Ora è possibile utilizzare angular2, webpack con sostituzione di moduli caldi, sass sourcemaps e css caricati esternamente. Mi ci sono voluti giorni di gioco ma ho funzionato!
Le dipendenze sono style-loader
, css-loader
e sass-loader
(se si utilizza sass, se non, il caricatore sass può essere rimossa)
posso utilizzare ExtractTextPlugin per modalità di produzione ad emettere .css effettivi.
NOTA: per far funzionare tutto questo, non uso la proprietà stylesUrl, ma imposto il file .scss al di fuori del decoratore @Component in modo che gli stili vengano caricati nel contesto globale, piuttosto che in base al componente.
Questa configurazione consente la sostituzione del modulo caldo con i file SCSS utilizzando il server di sviluppo Webpack e il plug-in estrai per la modalità di produzione per l'emissione di file .css effettivi.
Ecco la mia configurazione di lavoro
{
test: /\.(scss)$/,
use:
isDevServer ? [
{
loader: 'style-loader',
},
{
loader: 'css-loader',
options: { sourceMap: true }
},
{
loader: 'postcss-loader',
options: { postcss: [AutoPrefixer(autoPrefixerOptions)], sourceMap: true }
},
{
loader: 'sass-loader',
options: { sourceMap: true }
},
{
loader: 'sass-resources-loader',
options: {
resources: [
'./src/assets/styles/variables.scss',
'./src/assets/styles/mixins.scss']
}
},
/**
* The sass-vars-loader will convert the 'vars' property or any module.exports of
* a .JS or .JSON file into valid SASS and append to the beginning of each
* .scss file loaded.
*
* See: https://github.com/epegzz/sass-vars-loader
*/
{
loader: '@epegzz/sass-vars-loader?',
options: querystring.stringify({
vars: JSON.stringify({
susyIsDevServer: susyIsDevServer
})
})
}] : // dev mode
ExtractTextPlugin.extract({
fallback: "css-loader",
use: [
{
loader: 'css-loader',
options: { sourceMap: true }
},
{
loader: 'postcss-loader',
options: { postcss: [AutoPrefixer(autoPrefixerOptions)], sourceMap: true }
},
{
loader: 'sass-loader',
options: { sourceMap: true }
},
{
loader: 'sass-resources-loader',
options: {
resources: [
'./src/assets/styles/variables.scss',
'./src/assets/styles/mixins.scss']
}
}, {
loader: '@epegzz/sass-vars-loader?',
options: querystring.stringify({
vars: JSON.stringify({
susyIsDevServer: susyIsDevServer
})
// // Or use 'files" object to specify vars in an external .js or .json file
// files: [
// path.resolve(helpers.paths.appRoot + '/assets/styles/sass-js-variables.js')
// ],
})
}],
publicPath: '/' // 'string' override the publicPath setting for this loader
})
},
Poi, nel componente, ad esempio, app.component.ts
, si richiederebbe il tuo app.style.scss
file di al di fuori della @Component decoratrice.
Questo è il trucco. Questo non funzionerà se carichi stili "angolare" con stylesUrl
. Facendolo in questo modo potrai caricare pigro i fogli di stile .css
per i componenti che sono pigri, rendendo il tempo di caricamento iniziale ancora più veloce.
app.component.css
/*
* THIS IS WHERE WE REQUIRE CSS/SCSS FILES THAT THIS COMPONENT NEEDS
*
* Function: To enable so-called "Lazy Loading" CSS/SCSS files "on demand" as the app views need them.
* Do NOT add styles the "Angular2 Way" in the @Component decorator ("styles" and "styleUrls" properties)
*/
import './app.style.scss'
/**
* AppComponent Component
* Top Level Component
*/
@Component({
selector: 'body',
encapsulation: ViewEncapsulation.None,
host: { '[class.authenticated]': 'appState.state.isAuthenticated' },
templateUrl: './app.template.html'
})
ho avuto problemi in esecuzione questa configurazione. Ecco qui!
Aggiornato 08/2017: Migliorata la configurazione per webpack 3+ requisiti dello schema, e di lavorare con angolare 4 compilazione AOT.
Ho creato https://github.com/sheerun/extracted-loader per risolvere questo problema – sheerun