在运行ng serve与ng build时,index.html中的差异加载脚本引用有所不同 [英] Differential loading script references in index.html different when running ng serve vs. ng build
问题描述
升级到Angular 8后,ng build
会生成一个支持差异加载的适当index.html,但是ng serve
会生成一个仅包含对某些生成的"es5"脚本的引用的index.html.因此,该应用程序无法在IE 11等ES5浏览器中使用.
After upgrading to Angular 8, ng build
generates a proper index.html that supports differential loading however ng serve
generates a different index.html that contains references to only some of the generated 'es5' scripts. As a result, the app does not work in ES5 browsers like IE 11.
到目前为止,我有:
- 确认该应用程序在现代ES2015 +浏览器(如Chrome)中按预期运行
- 确认该应用在Angular 8升级之前可在IE 11上运行
- 将IE 11中的index.html源与从
ng build
在dist目录中生成的源进行了比较,可以看到脚本引用中的差异(请参见下面的示例代码) - 在Github和stackoverflow上搜索Angle和angular-cli问题以寻找类似问题
- 尝试使用angular.json中的es5BrowserSupport选项(无论是否即将弃用)来构建和提供服务
- 已更新为@ angular-devkit和@angular软件包的最新版本
- confirmed the app runs as expected in modern ES2015+ browsers like Chrome
- confirmed the app worked on IE 11 prior to the Angular 8 upgrade
- compared index.html source in IE 11 to source generated in dist directory from
ng build
, can see differences in script references (see sample code below) - searched angular and angular-cli issues on Github and stackoverflow for similar problems
- tried building and serving with and without the soon to be deprecated es5BrowserSupport option in angular.json
- updated to the latest versions of @angular-devkit and @angular packages
我正在使用的存储库包含一个应用程序项目和一个库项目.以下是Angular 8升级后angular.json中的相关架构师目标:
The repository I am working on contains an application project and a library project. Here are the relevant architect targets from angular.json after the Angular 8 upgrade:
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/ng-shared-components-tester",
"index": "projects/ng-shared-components-tester/src/index.html",
"main": "projects/ng-shared-components-tester/src/main.ts",
"polyfills": "projects/ng-shared-components-tester/src/polyfills.ts",
"tsConfig": "projects/ng-shared-components-tester/tsconfig.app.json",
"assets": [
"projects/ng-shared-components-tester/src/favicon.ico",
"projects/ng-shared-components-tester/src/assets"
],
"styles": [
"node_modules/bootstrap/dist/css/bootstrap.min.css",
"projects/ng-shared-components-tester/src/styles.css",
"node_modules/abc-emerald-standards/dist/emerald/assets/css/default.css",
"node_modules/abc-emerald-standards/dist/emerald/assets/css/forms.css"
],
"scripts": [],
"es5BrowserSupport": true
},
"configurations": {
"production": {
"fileReplacements": [
{
"replace": "projects/ng-shared-components-tester/src/environments/environment.ts",
"with": "projects/ng-shared-components-tester/src/environments/environment.prod.ts"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"budgets": [
{
"type": "initial",
"maximumWarning": "2mb",
"maximumError": "5mb"
}
]
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "ng-shared-components-tester:build"
},
"configurations": {
"production": {
"browserTarget": "ng-shared-components-tester:build:production"
}
}
},
以下是启用了IE 11支持的浏览器列表文件:
Here is the browserlist file with IE 11 support enabled:
> 0.5%
last 4 versions
IE 11
not dead
tsconfig.json:
tsconfig.json:
{
"compileOnSave": false,
"compilerOptions": {
"importHelpers": true,
"outDir": "./dist/out-tsc",
"baseUrl": "./",
"sourceMap": true,
"declaration": false,
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"target": "es2015",
"typeRoots": [
"node_modules/@types"
],
"lib": [
"es2018",
"dom"
],
"module": "esnext",
"paths": {
"@abc/ng-shared-components": [
"dist/abc/ng-shared-components"
],
"@abc/ng-shared-components/*": [
"dist/abc/ng-shared-components/*"
]
}
},
"angularCompilerOptions": {
"annotateForClosureCompiler": true,
"skipTemplateCodegen": true,
"strictMetadataEmit": true,
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true
},
}
预期结果
ng build
在dist/ng-shared-components-tester/index.html中生成预期结果:
Expected Result
ng build
is generated the expected result in dist/ng-shared-components-tester/index.html:
<body>
<app-root></app-root>
<script src="runtime-es2015.js" type="module"></script>
<script src="polyfills-es2015.js" type="module"></script>
<script src="runtime-es5.js" nomodule></script>
<script src="polyfills-es5.js" nomodule></script>
<script src="styles-es2015.js" type="module"></script>
<script src="styles-es5.js" nomodule></script>
<script src="vendor-es2015.js" type="module"></script>
<script src="main-es2015.js" type="module"></script>
<script src="vendor-es5.js" nomodule></script>
<script src="main-es5.js" nomodule></script>
</body>
实际结果
ng serve
正在向IE 11提供一个index.html,该IE 11仅包含pollfills.js的ES5版本:
Actual Result
ng serve
is serving up an index.html to IE 11 that only contains the ES5 version of pollfills.js:
<body>
<app-root></app-root>
<script src="runtime.js"></script>
<script src="polyfills-es5.js" nomodule></script>
<script src="polyfills.js"></script><script src="styles.js"></script>
<script src="vendor.js"></script>
<script src="main.js"></script>
</body>
推荐答案
After a little more digging I found this discussion on GitHub that indicates differential loading is disabled by default for ng serve
and ng build --watch
by design. This appears to be done for performance reasons (differential loading requires 2 builds to run, ES5 and non-ES5). There is a workaround to use ES5 bundles instead of the default bundles.
这篇关于在运行ng serve与ng build时,index.html中的差异加载脚本引用有所不同的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!