Skip to content

Commit 4c5cdfd

Browse files
committed
Use extract-text-plugin to extract css bundle for production builds.
Development builds continue to use style-loader for fast developer workflow (HMR). Production builds use static, minimized, CSS file.
1 parent 765d1e4 commit 4c5cdfd

File tree

3 files changed

+56
-18
lines changed

3 files changed

+56
-18
lines changed

packages/angular-cli/models/webpack-build-common.ts

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -71,24 +71,6 @@ export function getWebpackCommonConfig(
7171
loaders: ['raw-loader', 'postcss-loader', 'sass-loader']
7272
},
7373

74-
// outside of main, load it via style-loader
75-
       {
76-
include: styles,
77-
test: /\.css$/,
78-
loaders: ['style-loader', 'css-loader', 'postcss-loader']
79-
}, {
80-
include: styles,
81-
test: /\.styl$/,
82-
loaders: ['style-loader', 'css-loader', 'postcss-loader', 'stylus-loader']
83-
}, {
84-
include: styles,
85-
test: /\.less$/,
86-
loaders: ['style-loader', 'css-loader', 'postcss-loader', 'less-loader']
87-
}, {
88-
include: styles,
89-
test: /\.scss$|\.sass$/,
90-
loaders: ['style-loader', 'css-loader', 'postcss-loader', 'sass-loader']
91-
},
9274

9375
// load global scripts using script-loader
9476
{ include: scripts, test: /\.js$/, loader: 'script-loader' },

packages/angular-cli/models/webpack-build-development.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
const path = require('path');
22

33
export const getWebpackDevConfigPartial = function(projectRoot: string, appConfig: any) {
4+
const appRoot = path.resolve(projectRoot, appConfig.root);
5+
const styles = appConfig.styles
6+
? appConfig.styles.map((style: string) => path.resolve(appRoot, style))
7+
: [];
8+
const cssLoaders = ['style-loader', 'css-loader?sourcemap', 'postcss-loader'];
49
return {
510
devtool: 'cheap-module-source-map',
611
output: {
@@ -9,6 +14,28 @@ export const getWebpackDevConfigPartial = function(projectRoot: string, appConfi
914
sourceMapFilename: '[name].map',
1015
chunkFilename: '[id].chunk.js'
1116
},
17+
module: {
18+
rules: [
19+
// outside of main, load it via style-loader for development builds
20+
       {
21+
include: styles,
22+
test: /\.css$/,
23+
loaders: cssLoaders
24+
}, {
25+
include: styles,
26+
test: /\.styl$/,
27+
loaders: [...cssLoaders, 'stylus-loader?sourcemap']
28+
}, {
29+
include: styles,
30+
test: /\.less$/,
31+
loaders: [...cssLoaders, 'less-loader?sourcemap']
32+
}, {
33+
include: styles,
34+
test: /\.scss$|\.sass$/,
35+
loaders: [...cssLoaders, 'sass-loader?sourcemap']
36+
},
37+
]
38+
},
1239
node: {
1340
fs: 'empty',
1441
global: true,

packages/angular-cli/models/webpack-build-production.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import * as path from 'path';
22
const WebpackMd5Hash = require('webpack-md5-hash');
33
const CompressionPlugin = require('compression-webpack-plugin');
44
import * as webpack from 'webpack';
5+
const ExtractTextPlugin = require('extract-text-webpack-plugin');
56

67
declare module 'webpack' {
78
export interface LoaderOptionsPlugin {}
@@ -14,6 +15,11 @@ declare module 'webpack' {
1415
}
1516

1617
export const getWebpackProdConfigPartial = function(projectRoot: string, appConfig: any) {
18+
const appRoot = path.resolve(projectRoot, appConfig.root);
19+
const styles = appConfig.styles
20+
? appConfig.styles.map((style: string) => path.resolve(appRoot, style))
21+
: [];
22+
const cssLoaders = ['css-loader?sourcemap&minimize', 'postcss-loader'];
1723
return {
1824
devtool: 'source-map',
1925
output: {
@@ -22,7 +28,30 @@ export const getWebpackProdConfigPartial = function(projectRoot: string, appConf
2228
sourceMapFilename: '[name].[chunkhash].bundle.map',
2329
chunkFilename: '[id].[chunkhash].chunk.js'
2430
},
31+
module: {
32+
rules: [
33+
// outside of main, load it via extract-text-plugin for production builds
34+
       {
35+
include: styles,
36+
test: /\.css$/,
37+
loaders: ExtractTextPlugin.extract(cssLoaders)
38+
}, {
39+
include: styles,
40+
test: /\.styl$/,
41+
loaders: ExtractTextPlugin.extract([...cssLoaders, 'stylus-loader?sourcemap'])
42+
}, {
43+
include: styles,
44+
test: /\.less$/,
45+
loaders: ExtractTextPlugin.extract([...cssLoaders, 'less-loader?sourcemap'])
46+
}, {
47+
include: styles,
48+
test: /\.scss$|\.sass$/,
49+
loaders: ExtractTextPlugin.extract([...cssLoaders, 'sass-loader?sourcemap'])
50+
},
51+
]
52+
},
2553
plugins: [
54+
new ExtractTextPlugin('[name].[contenthash].bundle.css'),
2655
new WebpackMd5Hash(),
2756
new webpack.optimize.UglifyJsPlugin(<any>{
2857
mangle: { screw_ie8 : true },

0 commit comments

Comments
 (0)