1
- const ngtools = require ( '@ngtools/webpack' ) ;
1
+ const { resolve } = require ( 'path' ) ;
2
+ const AoTPlugin = require ( '@ngtools/webpack' ) . AotPlugin ;
2
3
const webpackMerge = require ( 'webpack-merge' ) ;
3
- const commonPartial = require ( './webpack/webpack.common' ) ;
4
- const clientPartial = require ( './webpack/webpack.client' ) ;
5
- const serverPartial = require ( './webpack/webpack.server' ) ;
6
- const prodPartial = require ( './webpack/webpack.prod' ) ;
7
- const devPartial = require ( './webpack/webpack.dev' ) ;
8
- const { getAotPlugin } = require ( './webpack/webpack.aot' ) ;
9
- const { root } = require ( './webpack/helpers' ) ;
10
- const { getDevStylesConfig, getProdStylesConfig } = require ( './webpack/webpack.style' ) ;
4
+ const compression = require ( 'compression-webpack-plugin' ) ;
5
+ const html = require ( 'html-webpack-plugin' ) ;
6
+ const copy = require ( 'copy-webpack-plugin' ) ;
7
+ const extract = require ( 'extract-text-webpack-plugin' ) ;
11
8
const portfinder = require ( 'portfinder' ) ;
12
9
13
10
module . exports = function ( options , webpackOptions ) {
14
11
options = options || { } ;
15
12
16
- if ( options . aot ) {
17
- console . log ( `Running build for ${ options . client ? 'client' : 'server' } with AoT compilation...` )
18
- }
13
+ let config = { } ;
19
14
20
- const serverConfig = webpackMerge ( { } , commonPartial , serverPartial , {
21
- entry : options . aot ? './src/main.server.aot.ts' : serverPartial . entry ,
15
+ config = webpackMerge ( { } , config , {
16
+ entry : getEntry ( options ) ,
17
+ resolve : { extensions : [ '.ts' , '.js' ] } ,
18
+ output : {
19
+ path : root ( 'dist' )
20
+ } ,
21
+ module : {
22
+ rules : [
23
+ { test : / \. h t m l $ / , loader : 'raw-loader' } ,
24
+ { test : / \. j s o n $ / , loader : 'json-loader' } ,
25
+ { test : / \. ( j p ? g | p n g | g i f ) $ / , loader : 'file-loader' , options : { hash : 'sha512' , digest : 'hex' , name : 'images/[hash].[ext]' } } ,
26
+ { test : / \. ( e o t | w o f f 2 ? | s v g | t t f | o t f ) ( [ \? ] ? .* ) $ / , loader : 'file-loader' , options : { hash : 'sha512' , digest : 'hex' , name : 'fonts/[hash].[ext]' } }
27
+ ]
28
+ } ,
22
29
plugins : [
23
- getAotPlugin ( 'server ', ! ! options . aot )
30
+ new copy ( [ { context : './public ', from : '**/*' } ] )
24
31
]
25
- } , getProdStylesConfig ( ) ) ;
32
+ } ) ;
26
33
27
- let clientConfig = webpackMerge ( { } , commonPartial , clientPartial , {
28
- plugins : [
29
- getAotPlugin ( 'client' , ! ! options . aot )
30
- ]
31
- } , options . dev ? getDevStylesConfig ( ) : getProdStylesConfig ( ) ) ;
34
+ if ( options . client ) {
35
+ config = webpackMerge ( { } , config , {
36
+ output : {
37
+ filename : 'app.js'
38
+ } ,
39
+ target : 'web' ,
40
+ plugins : [
41
+ new html ( { template : root ( 'src/index.html' ) , output : root ( 'dist' ) } )
42
+ ] ,
43
+ devServer : {
44
+ historyApiFallback : true ,
45
+ port : 8000 ,
46
+ open : true ,
47
+ hot : false ,
48
+ inline : true ,
49
+ stats : { colors : true , chunks : false } ,
50
+ watchOptions : {
51
+ aggregateTimeout : 300 ,
52
+ poll : 1000
53
+ }
54
+ }
55
+ } ) ;
56
+ } else if ( options . server ) {
57
+ config = webpackMerge ( { } , config , {
58
+ output : { filename : 'server.js' } ,
59
+ target : 'node'
60
+ } ) ;
61
+ }
32
62
33
63
if ( webpackOptions . p ) {
34
- clientConfig = webpackMerge ( { } , clientConfig , prodPartial ) ;
64
+ if ( ! options . server ) {
65
+ config = webpackMerge ( { } , config , getProductionPlugins ( ) ) ;
66
+ config = webpackMerge ( { } , config , getProdStylesConfig ( ) ) ;
67
+ }
68
+ } else {
69
+ if ( ! options . server ) {
70
+ config = webpackMerge ( { } , config , getDevStylesConfig ( ) ) ;
71
+ }
35
72
}
36
73
37
- let config ;
74
+ if ( options . aot ) {
75
+ console . log ( `Running build for ${ options . client ? 'client' : 'server' } with AoT compilation...` )
38
76
39
- if ( options . client ) {
40
- config = clientConfig ;
41
- } else if ( options . server ) {
42
- config = serverConfig ;
77
+ config = webpackMerge ( { } , config , {
78
+ module : {
79
+ rules : [ { test : / \. t s $ / , loader : '@ngtools/webpack' } ]
80
+ } ,
81
+ plugins : [
82
+ new AoTPlugin ( {
83
+ tsConfigPath : options . client ? root ( 'src/tsconfig.browser.json' ) : root ( 'src/tsconfig.server.json' )
84
+ } )
85
+ ]
86
+ } ) ;
87
+ } else {
88
+ config = webpackMerge ( { } , config , {
89
+ module : {
90
+ rules : [ { test : / \. t s $ / , loader : '@ngtools/webpack' } ]
91
+ } ,
92
+ plugins : [
93
+ new AoTPlugin ( {
94
+ tsConfigPath : options . client ? root ( 'src/tsconfig.browser.json' ) : root ( 'src/tsconfig.server.json' ) ,
95
+ skipCodeGeneration : true
96
+ } )
97
+ ]
98
+ } ) ;
43
99
}
44
100
45
101
if ( options . serve ) {
46
- if ( ! options . aot ) {
47
- config . module . rules . shift ( ) ;
48
- config = webpackMerge ( { } , config , devPartial ) ;
49
- }
50
-
51
102
return portfinder . getPortPromise ( ) . then ( port => {
52
103
config . devServer . port = port ;
53
104
return config ;
@@ -56,3 +107,60 @@ module.exports = function (options, webpackOptions) {
56
107
return Promise . resolve ( config ) ;
57
108
}
58
109
}
110
+
111
+ function root ( path ) {
112
+ return resolve ( __dirname , path ) ;
113
+ }
114
+
115
+ function getEntry ( options ) {
116
+ if ( options . client ) {
117
+ if ( options . aot ) {
118
+ return { app : root ( 'src/main.browser.aot.ts' ) } ;
119
+ } else {
120
+ return { app : root ( 'src/main.browser.ts' ) } ;
121
+ }
122
+ } else if ( options . server ) {
123
+ if ( options . aot ) {
124
+ return { app : root ( 'src/main.server.aot.ts' ) } ;
125
+ } else {
126
+ return { app : root ( 'src/main.server.ts' ) } ;
127
+ }
128
+ }
129
+ }
130
+
131
+ function getProductionPlugins ( ) {
132
+ return {
133
+ plugins : [
134
+ new compression ( { asset : "[path].gz[query]" , algorithm : "gzip" , test : / \. j s $ | \. h t m l $ / , threshold : 10240 , minRatio : 0.8 } )
135
+ ]
136
+ }
137
+ }
138
+
139
+ function getDevStylesConfig ( ) {
140
+ return {
141
+ module : {
142
+ rules : [
143
+ { test : / \. c s s $ / , use : [ 'style-loader' , 'css-loader' ] , exclude : [ root ( 'src/app' ) ] } ,
144
+ { test : / \. c s s $ / , use : [ 'to-string-loader' , 'css-loader' ] , exclude : [ root ( 'src/styles' ) ] } ,
145
+ { test : / \. s c s s $ | \. s a s s $ / , use : [ 'style-loader' , 'css-loader' , 'sass-loader' ] , include : [ root ( 'src/styles' ) ] } ,
146
+ { test : / \. s c s s $ | \. s a s s $ / , use : [ 'to-string-loader' , 'css-loader' , 'sass-loader' ] , exclude : [ root ( 'src/styles' ) ] } ,
147
+ ]
148
+ }
149
+ } ;
150
+ }
151
+
152
+ function getProdStylesConfig ( ) {
153
+ return {
154
+ plugins : [
155
+ new extract ( '[name].css' )
156
+ ] ,
157
+ module : {
158
+ rules : [
159
+ { test : / \. c s s $ / , use : extract . extract ( { fallback : 'style-loader' , use : 'css-loader' } ) , include : [ root ( 'src/styles' ) ] } ,
160
+ { test : / \. c s s $ / , use : [ 'to-string-loader' , 'css-loader' ] , exclude : [ root ( 'src/styles' ) ] } ,
161
+ { test : / \. s c s s $ | \. s a s s $ / , loader : extract . extract ( { fallback : 'style-loader' , use : [ 'css-loader' , 'sass-loader' ] } ) , exclude : [ root ( 'src/app' ) ] } ,
162
+ { test : / \. s c s s $ | \. s a s s $ / , use : [ 'to-string-loader' , 'css-loader' , 'sass-loader' ] , exclude : [ root ( 'src/styles' ) ] } ,
163
+ ]
164
+ }
165
+ } ;
166
+ }
0 commit comments