Skip to content

Commit 9c1872b

Browse files
committed
feat(@angular/cli): add scope hoisting
See the following links for details on scope hoisting: https://medium.com/webpack/webpack-freelancing-log-book-week-5-7-4764be3266f5 https://medium.com/webpack/webpack-freelancing-log-book-week-8-e73811deb412 Node's global was also remove, since it seemed to affect optimization gains. It's still enabled for `ng serve` with live reload, since that functionality needs it.
1 parent a0db191 commit 9c1872b

File tree

11 files changed

+27
-12
lines changed

11 files changed

+27
-12
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@
9595
"typescript": "~2.3.1",
9696
"url-loader": "^0.5.7",
9797
"walk-sync": "^0.3.1",
98-
"webpack": "~2.4.0",
98+
"webpack": "~3.0.0",
9999
"webpack-dev-middleware": "^1.10.2",
100100
"webpack-dev-server": "~2.4.5",
101101
"webpack-merge": "^2.4.0",

packages/@angular/cli/commands/build.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ export const baseBuildCommandOptions: any = [
4343
{
4444
name: 'vendor-chunk',
4545
type: Boolean,
46-
default: true,
4746
aliases: ['vc'],
4847
description: 'Use a separate bundle containing only vendor libraries.'
4948
},

packages/@angular/cli/models/webpack-config.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,15 @@ export class NgCliWebpackConfig {
7979
environment: 'dev',
8080
outputHashing: 'media',
8181
sourcemaps: true,
82-
extractCss: false
82+
extractCss: false,
83+
vendorChunk: true
8384
},
8485
production: {
8586
environment: 'prod',
8687
outputHashing: 'all',
8788
sourcemaps: false,
8889
extractCss: true,
90+
vendorChunk: false,
8991
aot: true
9092
}
9193
};

packages/@angular/cli/models/webpack-configs/common.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ export function getCommonConfig(wco: WebpackConfigOptions) {
106106
].concat(extraPlugins),
107107
node: {
108108
fs: 'empty',
109-
global: true,
109+
global: false,
110110
crypto: 'empty',
111111
tls: 'empty',
112112
net: 'empty',

packages/@angular/cli/models/webpack-configs/production.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ export const getProdConfig = function (wco: WebpackConfigOptions) {
9494
'NODE_ENV': 'production'
9595
}),
9696
new (<any>webpack).HashedModuleIdsPlugin(),
97+
new (webpack.optimize as any).ModuleConcatenationPlugin(),
9798
new webpack.optimize.UglifyJsPlugin(<any>{
9899
mangle: { screw_ie8: true },
99100
compress: { screw_ie8: true, warnings: buildOptions.verbose },

packages/@angular/cli/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@
8080
"typescript": ">=2.0.0 <2.4.0",
8181
"url-loader": "^0.5.7",
8282
"walk-sync": "^0.3.1",
83-
"webpack": "~2.4.0",
83+
"webpack": "~3.0.0",
8484
"webpack-dev-middleware": "^1.10.2",
8585
"webpack-dev-server": "~2.4.5",
8686
"webpack-merge": "^2.4.0",

packages/@angular/cli/tasks/eject.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,9 @@ class JsonWebpackSerializer {
164164
case webpack.optimize.UglifyJsPlugin:
165165
this._addImport('webpack.optimize', 'UglifyJsPlugin');
166166
break;
167+
case (webpack.optimize as any).ModuleConcatenationPlugin:
168+
this._addImport('webpack.optimize', 'ModuleConcatenationPlugin');
169+
break;
167170
case angularCliPlugins.BaseHrefWebpackPlugin:
168171
case angularCliPlugins.GlobCopyWebpackPlugin:
169172
case angularCliPlugins.SuppressExtractedTextChunksWebpackPlugin:
@@ -413,6 +416,8 @@ export default Task.extend({
413416
}
414417

415418
const webpackConfig = new NgCliWebpackConfig(runTaskOptions, appConfig).buildConfig();
419+
// Without node['global'] = true, webpack-dev-server will break at runtime due to sockjs.
420+
webpackConfig.node['global'] = true;
416421
const serializer = new JsonWebpackSerializer(process.cwd(), outputPath, appConfig.root);
417422
const output = serializer.serialize(webpackConfig);
418423
const webpackConfigStr = `${serializer.generateVariables()}\n\nmodule.exports = ${output};\n`;

packages/@angular/cli/tasks/serve.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,12 @@ export default Task.extend({
103103
`);
104104
}
105105
}
106+
// Live reload needs an additional entry point.
106107
if (!webpackConfig.entry.main) { webpackConfig.entry.main = []; }
107108
webpackConfig.entry.main.unshift(...entryPoints);
109+
// Live reload required the node `global` to be set to true.
110+
if (!webpackConfig.node) { webpackConfig.node = {}; }
111+
webpackConfig.node.global = true;
108112
} else if (serveTaskOptions.hmr) {
109113
ui.writeLine(yellow('Live reload is disabled. HMR option ignored.'));
110114
}

tests/e2e/tests/build/chunk-hash.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ export default function() {
6161
`, '@angular/router'))
6262
.then(() => addImportToModule(
6363
'src/app/app.module.ts', 'ReactiveFormsModule', '@angular/forms'))
64-
.then(() => ng('build', '--prod'))
64+
.then(() => ng('build', '--output-hashing=all'))
6565
.then(() => {
6666
oldHashes = generateFileHashMap();
6767
})
68-
.then(() => ng('build', '--prod'))
68+
.then(() => ng('build', '--output-hashing=all'))
6969
.then(() => {
7070
newHashes = generateFileHashMap();
7171
})
@@ -74,16 +74,16 @@ export default function() {
7474
oldHashes = newHashes;
7575
})
7676
.then(() => writeFile('src/styles.css', 'body { background: blue; }'))
77-
.then(() => ng('build', '--prod'))
77+
.then(() => ng('build', '--output-hashing=all'))
7878
.then(() => {
7979
newHashes = generateFileHashMap();
8080
})
8181
.then(() => {
82-
validateHashes(oldHashes, newHashes, ['styles']);
82+
validateHashes(oldHashes, newHashes, ['inline', 'styles']);
8383
oldHashes = newHashes;
8484
})
8585
.then(() => writeFile('src/app/app.component.css', 'h1 { margin: 10px; }'))
86-
.then(() => ng('build', '--prod'))
86+
.then(() => ng('build', '--output-hashing=all'))
8787
.then(() => {
8888
newHashes = generateFileHashMap();
8989
})
@@ -93,7 +93,7 @@ export default function() {
9393
})
9494
.then(() => addImportToModule(
9595
'src/app/lazy/lazy.module.ts', 'ReactiveFormsModule', '@angular/forms'))
96-
.then(() => ng('build', '--prod'))
96+
.then(() => ng('build', '--output-hashing=all'))
9797
.then(() => {
9898
newHashes = generateFileHashMap();
9999
})

tests/e2e/tests/misc/common-async.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ import {appendToFile} from '../../utils/fs';
88

99
export default function() {
1010
let oldNumberOfFiles = 0;
11+
12+
// webpack 2.5.1+ has a bug with CommonsChunkPlugin
13+
// https://github.com/webpack/webpack/issues/4850
14+
1115
return Promise.resolve()
1216
.then(() => ng('build'))
1317
.then(() => oldNumberOfFiles = readdirSync('dist').length)

tests/e2e/tests/test/test-assets.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export default function () {
1919
// Not using `async()` in tests as it seemed to swallow `fetch()` errors
2020
'src/app/app.component.spec.ts': stripIndent`
2121
describe('Test Runner', () => {
22-
const fetch = global['fetch'];
22+
const fetch = window['fetch'];
2323
it('should serve files in assets folder', (done) => {
2424
fetch('/assets/file.txt')
2525
.then(response => response.text())

0 commit comments

Comments
 (0)