导入文本编码的polyfill后,为什么在IE11中出现“ ReferenceError:'TextEncoder'未定义”的问题?

时间:2019-02-13 17:22:29

标签: angular polyfills

我正在尝试对库的fetch-可读流(https://github.com/jonnyreeves/fetch-readablestream)进行轮询。我已经添加了polyfills,并且大多数功能都可以使用,但是我仍然收到有关TextEncoder ERROR ReferenceError: 'TextEncoder' is undefined

的错误消息

我已经添加了必需的pollyfills:web-streams-polyfill,文本编码和babel-polyfill。我尝试了其他等效的这些polyfill,但遇到了同样的问题。

在我未注释的必需IE导入后,我的polyfills.ts文件。

import 'web-streams-polyfill'; // Run `npm install --save web-streams-polyfill`.
import 'text-encoding'; // Run `npm install --save text-encoding`.
import 'babel-polyfill'; // Run `npm install --save babel-polyfill`.

我还尝试将脚本添加到index.html

<script src="node_modules/text-encoding/lib/encoding-indexes.js"></script>
<script src="node_modules/text-encoding/lib/encoding.js"></script>

我不希望有任何错误,但是我得到了:

ERROR ReferenceError: 'TextEncoder' is undefined
   "ERROR"
   {
      [functions]: ,
      __proto__: { },
      description: "'TextEncoder' is undefined",
      message: "'TextEncoder' is undefined",
      name: "ReferenceError",
      number: -2146823279,
      stack: "ReferenceError: 'TextEncoder' is undefined
   at responseParserFactory (http://localhost:4200/vendor.js:139703:3)
   at xhrTransport (http://localhost:4200/vendor.js:139960:1)
   at fetchStream (http://localhost:4200/vendor.js:139795:4)
   at DevicewiseService.prototype.getNotifications (http://localhost:4200/main.js:6577:9)
   at Anonymous function (http://localhost:4200/main.js:159:17)
   at SafeSubscriber.prototype.__tryOrUnsub (http://localhost:4200/vendor.js:145834:9)
   at SafeSubscriber.prototype.next (http://localhost:4200/vendor.js:145772:13)
   at Subscriber.prototype._next (http://localhost:4200/vendor.js:145715:5)
   at Subscriber.prototype.next (http://localhost:4200/vendor.js:145692:9)
   at MapSubscriber.prototype._next (http://localhost:4200/vendor.js:150984:5)",
      Symbol([[Cancel]])_g.r6fxkqwxet3: undefined,
      Symbol([[Pull]])_h.r6fxkqwxet3: undefined,
      Symbol(INITIAL_VALUE)_p.r6fxkqwxet3: undefined,
      Symbol(rxSubscriber)_o.r6fxkqwxet3: undefined
   }

我们可以在fetchStream调用中看到这种情况。

3 个答案:

答案 0 :(得分:2)

使用npm软件包:https://www.npmjs.com/package/text-encoding(已不推荐使用,但是像超级按钮一样工作。)

然后添加到 polyfills.ts 代码:

if (typeof window['TextEncoder'] !== 'function') {
  const TextEncodingPolyfill = require('text-encoding');
  window['TextEncoder'] = TextEncodingPolyfill.TextEncoder;
  window['TextDecoder'] = TextEncodingPolyfill.TextDecoder;
}

请勿使用 import 'text-encoding';

答案 1 :(得分:0)

通过将此脚本包含在index.html标头中,我可以进行文本填充。

<script src="https://cdn.jsdelivr.net/npm/text-encoding@0.6.4/lib/encoding.min.js"></script>

我还没有尝试@iCrow的建议。这可能是一个更好的解决方案。

答案 2 :(得分:0)

感谢iCrow的回答,真的很有帮助。 我的项目基于Vue,但我发现该网站无法在IE Edge 44上正常运行。caniuse;

我按照iCrow的回答,将代码放入文件中。

// text-encoding-polyfill.js
;(function (window) {
  if (typeof window.TextEncoder !== 'function') {
    const TextEncodingPolyfill = require('text-encoding');
    window.TextEncoder = TextEncodingPolyfill.TextEncoder;
    window.TextDecoder = TextEncodingPolyfill.TextDecoder;
  }
}(window));

并将其导入应用条目文件的顶部。

// main.js
import 'text-encoding-polyfill.js';

// ...

在webpack打包代码之后,最终IE Edge可以识别TextEncoder!