Angular11 + webcomponents/polyfills + IE11 == nojoy



我们正在开发一个W3C自定义元素库(又名Web组件),使用Angular 11作为开发工具,使用createCustomElement。我们需要支持IE11,所以我们尝试使用webcomponents/polyfills。我们需要支持<slot>s,所以我们的组件使用encapsulation: ViewEncapsulation.ShadowDom。我以这种方式制作了一个非常简化的组件(来源于此),并有一个简单的无框架页面来呈现这个web组件。当使用webcomponents-loader时,该页面在IE中,页面错误提示"IE11 SCRIPT28 Out of stack space";——这个错误有一些深入的分析在这个问题上,然而,没有解决办法。有一些修复(链接在那个线程)Object.getOwnPropertySymbols,但那些是2.5年前;我正在使用最新的@webcomponents/webcomponentsjs@2.5.0,但堆栈空间错误仍然存在。我尝试过通过不同的方式加载多边形,包括webcomponents-loader.js,webcomponents-bundle.jswebcomponents-sd-ce-pf.js的变体,但每个都有不同的问题。

最终,紧迫的问题是加载webcomponents-loader.js时,我得到:

SCRIPT28: Out of stack space
webcomponents-sd-ce-pf.js (65,290)
SCRIPT2343: Stack overflow at line: 65

非常偶然,我得到错误:

Object doesn't support property or method 'attachShadow'

…但我不是异步加载脚本,我每次清除我的IE浏览器缓存,所以我不明白为什么会发生这种变化。为了解决这个错误,我在webcomponentsjs之前加载了shadydom(这应该不是必要的),我又回到了堆栈空间错误。

从Angular 11构建的角度来看,我的tsconfig.json"compilerOptions.target": "es2015",这给了我不同的加载脚本。

polyfills.tshas

(window as any).__Zone_enable_cross_context_check = true;
import 'document-register-element';

我有一个小的,完整的示范项目在这里。这个web组件在Chrome浏览器中呈现无错误,不用说。

有很多关于Stack Overflow和Angular和Webcomponents的问题;许多人都很老了,他们的决心也不明确。我使用了一个非常简单的例子,我使用的是所有东西的最新版本(angular、webcomponents和IE11),但无法让它工作。我不清楚解决方案是在Angular还是Webcomponents中,所以我在这里发布,如果我们可以在这个问题上归零,可以去适当的github问题。

提前感谢!


额外的信息:通过从polyfills.ts中删除document-register-element并将//unpkg.com/@ungap/custom-elements添加为index.html中的第一个脚本,我得到错误ERROR TypeError: Object doesn't support property or method 'attachShadow',然后我添加//unpkg.com/@webcomponents/shadydom@1.8.0/shadydom.min.js,然后错误变成NotFoundError。除了许多常量之外,该错误中唯一的信息似乎是Symbol()_8.lacmbwvaqyq: undefined, Symbol(rxSubscriber)_i.lacmbwvaqyq: undefined,)。我唯一能找到Symbol实现的地方似乎是@webcomponents/webcomponentsjs@2.5.0填充,显然是在他们的"平台"中。代码。对这种情况有什么想法吗?或者我应该追求的其他方面的建议?

我无法找到区分的一件事是@ungap/custom-elements的实现是否是@webcomponents/webcomponentsjs的替代方案-我怀疑它是,然而,ungap似乎没有shadyDOM实现。

尽管stackoverflow不鼓励感谢评论,但对于任何在这件事上的帮助,我的评论是很高的!

我在IE11中遇到了这个问题,为了修复它,我从polyfills.ts中删除了'document-register-element',并在之前将其加载到页面上

问题是'document-register-element'必须在之前运行IE11充满了ES6+的功能(由core-js)。

由于core-js现在被CLI隐藏了(以前是在polyfills.ts中),无法调整浏览器解析功能的顺序,而'document-register-element'的工作原理是基于es2015+的函数在加载时可用,如果Angular已经屏蔽了缺失的部分,'document-register-element'就无法确定它需要正确做什么,所以失败了。

还需要注意的是,作者现在已经弃用了这个库,并在GitHub上提供了替换库的建议。

最新更新