Angular 8名网络工作者在IE中失败
从Angular 7迁移到Angular 8,发现我们为运行后台任务而设置的web worker在IE 11中运行时不再执行(可能更早)。Edge,Chrome,所有其他的都很好,只有IE 11Angular 8名网络工作者在IE中失败,angular,internet-explorer,angular8,web-worker,ecmascript-5,Angular,Internet Explorer,Angular8,Web Worker,Ecmascript 5,从Angular 7迁移到Angular 8,发现我们为运行后台任务而设置的web worker在IE 11中运行时不再执行(可能更早)。Edge,Chrome,所有其他的都很好,只有IE 11 Devtools抱怨语法错误并引用了一个es-2015.js文件。Angular 8摒弃了传统的polyfill技术,使用差异构建来分离ES5和ES6+脚本,以实现与ES6+和ES5的兼容性。这在主要的应用程序组件中运行良好,但是web工作人员在他们自己的线程中运行他们自己的进程,并且不再能够访问应用程
Devtools抱怨语法错误并引用了一个es-2015.js文件。Angular 8摒弃了传统的polyfill技术,使用差异构建来分离ES5和ES6+脚本,以实现与ES6+和ES5的兼容性。这在主要的应用程序组件中运行良好,但是web工作人员在他们自己的线程中运行他们自己的进程,并且不再能够访问应用程序 最终的解决方案比我想象的要简单得多。确保WebWorker中的代码符合ES5,并且它将在IE中运行 对于我们的web工作者来说,这意味着删除任何箭头函数(=>),并用传统的函数声明和带有老式连接的字符串插值替换它们
// instead of
myClass.doSomething( myVar => { console.log(`Look what I have in ${myVar}` } );
// do it old school
myClass.doSomething( function (myVar) { console.log('Look what I have in ' + myVar } );
(还有一些帖子建议手动输入polyfill(),但我无法在web worker中成功导入和加载polyfill。)默认情况下,angular版本8中启用了ng build的差异加载。但是,对于ng test和ng serve,它只生成一个ES2015版本,无法在IE11中运行 有两种方法可以在发球时使用ES5代码,使angular 8应用程序在IE11中工作
{
"extends": "./tsconfig.app.json",
"compilerOptions": {
"target": "es5"
}
}
在angular.json中,在构建和服务目标下添加两个新的配置部分(es5节点),以提供新的tsconfig
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
...
},
"configurations": {
"production": {
...
},
"es5": {
"tsConfig": "./tsconfig-es5.app.json"
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
...
},
"configurations": {
"production": {
...
},
"es5": {
"browserTarget": "<your application name>:build:es5"
}
}
},
此外,browserslist文件内容如下:
> 0.5%
last 2 versions
Firefox ESR
not dead
IE 9-11 # For IE 9-11 support, remove 'not'.
这并不是真正解决专门针对web工作者的问题,而不是如何通过ng serve提供内容。
> 0.5%
last 2 versions
Firefox ESR
not dead
IE 9-11 # For IE 9-11 support, remove 'not'.