Skip to content

Commit 611b655

Browse files
committed
fix(polyfills): move polyfills to scripts array
Polyfills found in polyfills.ts would not be available for scripts due to being loaded in the main bundle only. Fix angular#2752 Fix angular#3309
1 parent f4b5773 commit 611b655

File tree

12 files changed

+72
-17
lines changed

12 files changed

+72
-17
lines changed

packages/angular-cli/blueprints/ng2/files/__path__/main.ts

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import './polyfills.ts';
2-
31
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
42
import { enableProdMode } from '@angular/core';
53
import { environment } from './environments/environment';

packages/angular-cli/blueprints/ng2/files/__path__/test.ts

-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
// This file is required by karma.conf.js and loads recursively all the .spec and framework files
22

3-
import './polyfills.ts';
4-
53
import 'zone.js/dist/long-stack-trace-zone';
64
import 'zone.js/dist/proxy.js';
75
import 'zone.js/dist/sync-test';

packages/angular-cli/blueprints/ng2/files/angular-cli.json

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
],
1414
"index": "index.html",
1515
"main": "main.ts",
16+
"polyfills": "polyfills.ts",
1617
"test": "test.ts",
1718
"tsconfig": "tsconfig.json",
1819
"prefix": "<%= prefix %>",

packages/angular-cli/lib/config/schema.json

+3
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@
5555
"main": {
5656
"type": "string"
5757
},
58+
"polyfills": {
59+
"type": "string"
60+
},
5861
"test": {
5962
"type": "string"
6063
},

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

+5-1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ export function getWebpackCommonConfig(
5252
entryPoints['main'] = [path.resolve(appRoot, appConfig.main)];
5353
}
5454

55+
if (appConfig.polyfills) {
56+
entryPoints['polyfills'] = [path.resolve(appRoot, appConfig.polyfills)];
57+
}
58+
5559
// determine hashing format
5660
const hashFormat = getOutputHashFormat(outputHashing);
5761

@@ -143,7 +147,7 @@ export function getWebpackCommonConfig(
143147
new HtmlWebpackPlugin({
144148
template: path.resolve(appRoot, appConfig.index),
145149
filename: path.resolve(appConfig.outDir, appConfig.index),
146-
chunksSortMode: packageChunkSort(['inline', 'styles', 'scripts', 'vendor', 'main']),
150+
chunksSortMode: packageChunkSort(appConfig),
147151
excludeChunks: lazyChunks,
148152
xhtml: true
149153
}),

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ export class NgCliWebpackConfig {
6969

7070
let config = webpackMerge(baseConfig, targetConfigPartial);
7171

72-
if (appConfig.main) {
72+
if (appConfig.main || appConfig.polyfills) {
7373
const typescriptConfigPartial = isAoT
7474
? getWebpackAotConfigPartial(projectRoot, appConfig, i18nFile, i18nFormat, locale)
7575
: getWebpackNonAotConfigPartial(projectRoot, appConfig);

packages/angular-cli/plugins/karma.js

+13
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,19 @@ const init = (config) => {
6868
.map((file) => config.preprocessors[file])
6969
.map((arr) => arr.splice(arr.indexOf('angular-cli'), 1, 'webpack', 'sourcemap'));
7070

71+
// Add polyfills file
72+
if (appConfig.polyfills) {
73+
const polyfillsFile = path.resolve(appRoot, appConfig.polyfills);
74+
const polyfillsPattern = {
75+
pattern: polyfillsFile,
76+
included: true,
77+
served: true,
78+
watched: true
79+
}
80+
Array.prototype.unshift.apply(config.files, [polyfillsPattern]);
81+
config.preprocessors[polyfillsFile] = ['webpack', 'sourcemap'];
82+
}
83+
7184
// Add global scripts
7285
if (appConfig.scripts && appConfig.scripts.length > 0) {
7386
const globalScriptPatterns = appConfig.scripts
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,36 @@
1-
export function packageChunkSort(packages: string[]) {
2-
return function sort(left: any, right: any) {
3-
let leftIndex = packages.indexOf(left.names[0]);
4-
let rightindex = packages.indexOf(right.names[0]);
1+
import { ExtraEntry, extraEntryParser } from '../models/webpack-build-utils';
52

6-
if ( leftIndex < 0 || rightindex < 0) {
7-
// Unknown packages are loaded last
8-
return 1;
3+
// Sort chunks according to a predefined order:
4+
// inline, polyfills, all scripts, all styles, vendor, main
5+
export function packageChunkSort(appConfig: any) {
6+
let entryPoints = ['inline', 'polyfills'];
7+
8+
const pushExtraEntries = (extraEntry: ExtraEntry) => {
9+
if (entryPoints.indexOf(extraEntry.entry) === -1) {
10+
entryPoints.push(extraEntry.entry);
911
}
12+
};
13+
14+
if (appConfig.scripts) {
15+
extraEntryParser(appConfig.scripts, './', 'scripts').forEach(pushExtraEntries);
16+
}
17+
18+
if (appConfig.styles) {
19+
extraEntryParser(appConfig.styles, './', 'styles').forEach(pushExtraEntries);
20+
}
21+
22+
entryPoints.push(...['vendor', 'main']);
23+
24+
return function sort(left: any, right: any) {
25+
let leftIndex = entryPoints.indexOf(left.names[0]);
26+
let rightindex = entryPoints.indexOf(right.names[0]);
1027

1128
if (leftIndex > rightindex) {
1229
return 1;
30+
} else if (leftIndex < rightindex) {
31+
return -1;
32+
} else {
33+
return 0;
1334
}
14-
15-
return -1;
1635
};
1736
}

tests/e2e/tests/build/polyfills.ts

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { expectFileToMatch } from '../../utils/fs';
2+
import { ng } from '../../utils/process';
3+
import { oneLineTrim } from 'common-tags';
4+
5+
export default function () {
6+
return Promise.resolve()
7+
.then(() => ng('build'))
8+
// files were created successfully
9+
.then(() => expectFileToMatch('dist/polyfills.bundle.js', 'core-js'))
10+
.then(() => expectFileToMatch('dist/polyfills.bundle.js', 'zone.js'))
11+
// index.html lists the right bundles
12+
.then(() => expectFileToMatch('dist/index.html', oneLineTrim`
13+
<script type="text/javascript" src="inline.bundle.js"></script>
14+
<script type="text/javascript" src="polyfills.bundle.js"></script>
15+
`));
16+
}

tests/e2e/tests/build/scripts-array.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,10 @@ export default function () {
4343
`))
4444
.then(() => expectFileToMatch('dist/index.html', oneLineTrim`
4545
<script type="text/javascript" src="inline.bundle.js"></script>
46+
<script type="text/javascript" src="polyfills.bundle.js"></script>
47+
<script type="text/javascript" src="scripts.bundle.js"></script>
4648
<script type="text/javascript" src="renamed-script.bundle.js"></script>
4749
<script type="text/javascript" src="common-entry.bundle.js"></script>
48-
<script type="text/javascript" src="scripts.bundle.js"></script>
4950
<script type="text/javascript" src="vendor.bundle.js"></script>
5051
<script type="text/javascript" src="main.bundle.js"></script>
5152
`));

tests/e2e/tests/build/styles/styles-array.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,9 @@ export default function () {
5252
`))
5353
.then(() => expectFileToMatch('dist/index.html', oneLineTrim`
5454
<script type="text/javascript" src="inline.bundle.js"></script>
55-
<script type="text/javascript" src="vendor.bundle.js"></script>
55+
<script type="text/javascript" src="polyfills.bundle.js"></script>
5656
<script type="text/javascript" src="common-entry.bundle.js"></script>
57+
<script type="text/javascript" src="vendor.bundle.js"></script>
5758
<script type="text/javascript" src="main.bundle.js"></script>
5859
`))
5960
.then(() => ng('build', '--no-extract-css'))

tests/e2e/tests/third-party/bootstrap.ts

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export default function() {
2323
.then(() => expectFileToMatch('dist/styles.bundle.css', '* Bootstrap'))
2424
.then(() => expectFileToMatch('dist/index.html', oneLineTrim`
2525
<script type="text/javascript" src="inline.bundle.js"></script>
26+
<script type="text/javascript" src="polyfills.bundle.js"></script>
2627
<script type="text/javascript" src="scripts.bundle.js"></script>
2728
<script type="text/javascript" src="vendor.bundle.js"></script>
2829
<script type="text/javascript" src="main.bundle.js"></script>

0 commit comments

Comments
 (0)