我一直在使用 Angular Elements 并尝试尽可能实现最佳的浏览器兼容性。但是我似乎走到了死胡同,因为当我为 Shadow DOM 添加 IE polyfill 时,它会破坏 chrome 中的元素。
最初我遇到错误“无法构造 HTML 元素”,因此我将 tsconfig.json 中的“目标”更改为 es2015/es6。
tsconfig.json
{
"compileOnSave": false,
"compilerOptions": {
"baseUrl": "./",
"outDir": "./dist/out-tsc",
"sourceMap": true,
"declaration": false,
"module": "es2015",
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"target": "es5",
"typeRoots": [
"node_modules/@types"
],
"lib": [
"es2018",
"dom"
]
}
}
零件
// @dynamic
@Component({
selector: 'flexybox-cardmanagement',
templateUrl: './card-management.component.html',
styleUrls: ['./card-management.component.scss'],
encapsulation: ViewEncapsulation.ShadowDom
})
更改目标碰巧破坏了 IE,因为不支持 es2015/es6+。所以我碰巧在@webcomponents 包中找到了custom-elements-es5-adapter,它包装了ES5,为需要它的浏览器提供必要的ES6 功能。然后我还必须添加对自定义元素的支持。
polyfills.ts
/*****************************************************************************************
* APPLICATION IMPORTS
*/
import '@webcomponents/webcomponentsjs/custom-elements-es5-adapter.js';
import '@webcomponents/custom-elements/custom-elements.min';
此时它可以在 Chrome 中运行,但我在 IE 中收到以下错误
SCRIPT438:对象不支持属性或方法“attachShadow”
所以我尝试通过在我的 polyfills.ts 中添加以下内容来为 Shadow DOM 添加 polyfill:
import '@webcomponents/shadydom';
这似乎解决了 IE 中的问题,但现在在 chrome 中给了我以下错误:
未捕获的类型错误:无法读取未定义的属性“defineProperties”