Next.js: Babel Polyfill scheint nicht injiziert zu werden

Erstellt am 5. Juli 2017  ·  34Kommentare  ·  Quelle: vercel/next.js

Ich versuche, IE11 für meine App zu unterstützen, um den Fehler zu beheben
TypeError: Object doesn't support property or method 'find'

Verwenden Sie das nächste 2.4.6 aber arbeiten Sie auch nicht an der neuesten Beta

Ein benutzerdefiniertes .babelerc wurde zusammen mit babel-preset-env mit der folgenden Konfiguration hinzugefügt:

{
  "presets": [
    "es2015",
    "react",
    "next/babel",
    "stage-0",
    [ "env", {
      "targets": {
        "safari": 10,
        "ie": 11
      },
      "modules": false,
      "useBuiltIns": true,
      "debug": true
    }]
  ],
}

Das Debug-Flag wurde aktiviert, sodass beim Start das folgende Protokoll angezeigt wird, was zu bedeuten scheint, dass die Polyfüllung hinzugefügt wird.

babel-preset-env: `DEBUG` option

Using targets:
{
  "safari": "10",
  "ie": "11"
}

Modules transform: false

Using plugins:
  check-es2015-constants {"ie":"11"}
  transform-es2015-arrow-functions {"ie":"11"}
  transform-es2015-block-scoping {"ie":"11"}
  transform-es2015-classes {"ie":"11"}
  transform-es2015-computed-properties {"ie":"11"}
  transform-es2015-destructuring {"ie":"11"}
  transform-es2015-duplicate-keys {"ie":"11"}
  transform-es2015-for-of {"ie":"11"}
  transform-es2015-function-name {"ie":"11"}
  transform-es2015-literals {"ie":"11"}
  transform-es2015-object-super {"ie":"11"}
  transform-es2015-parameters {"ie":"11"}
  transform-es2015-shorthand-properties {"ie":"11"}
  transform-es2015-spread {"ie":"11"}
  transform-es2015-sticky-regex {"ie":"11"}
  transform-es2015-template-literals {"ie":"11"}
  transform-es2015-typeof-symbol {"ie":"11"}
  transform-es2015-unicode-regex {"ie":"11"}
  transform-regenerator {"ie":"11"}
  transform-exponentiation-operator {"safari":"10","ie":"11"}
  transform-async-to-generator {"safari":"10","ie":"11"}
  syntax-trailing-function-commas {"ie":"11"}

Using polyfills:
  es6.typed.array-buffer {"ie":"11"}
  es6.typed.int8-array {"ie":"11"}
  es6.typed.uint8-array {"ie":"11"}
  es6.typed.uint8-clamped-array {"ie":"11"}
  es6.typed.int16-array {"ie":"11"}
  es6.typed.uint16-array {"ie":"11"}
  es6.typed.int32-array {"ie":"11"}
  es6.typed.uint32-array {"ie":"11"}
  es6.typed.float32-array {"ie":"11"}
  es6.typed.float64-array {"ie":"11"}
  es6.map {"ie":"11"}
  es6.set {"ie":"11"}
  es6.weak-map {"ie":"11"}
  es6.weak-set {"ie":"11"}
  es6.reflect.apply {"ie":"11"}
  es6.reflect.construct {"ie":"11"}
  es6.reflect.define-property {"ie":"11"}
  es6.reflect.delete-property {"ie":"11"}
  es6.reflect.get {"ie":"11"}
  es6.reflect.get-own-property-descriptor {"ie":"11"}
  es6.reflect.get-prototype-of {"ie":"11"}
  es6.reflect.has {"ie":"11"}
  es6.reflect.is-extensible {"ie":"11"}
  es6.reflect.own-keys {"ie":"11"}
  es6.reflect.prevent-extensions {"ie":"11"}
  es6.reflect.set {"ie":"11"}
  es6.reflect.set-prototype-of {"ie":"11"}
  es6.promise {"ie":"11"}
  es6.symbol {"ie":"11"}
  es6.object.assign {"ie":"11"}
  es6.object.is {"ie":"11"}
  es6.function.name {"ie":"11"}
  es6.string.raw {"ie":"11"}
  es6.string.from-code-point {"ie":"11"}
  es6.string.code-point-at {"ie":"11"}
  es6.string.repeat {"ie":"11"}
  es6.string.starts-with {"ie":"11"}
  es6.string.ends-with {"ie":"11"}
  es6.string.includes {"ie":"11"}
  es6.regexp.flags {"ie":"11"}
  es6.regexp.match {"ie":"11"}
  es6.regexp.replace {"ie":"11"}
  es6.regexp.split {"ie":"11"}
  es6.regexp.search {"ie":"11"}
  es6.array.from {"ie":"11"}
  es6.array.of {"ie":"11"}
  es6.array.copy-within {"ie":"11"}
  es6.array.find {"ie":"11"}
  es6.array.find-index {"ie":"11"}
  es6.array.fill {"ie":"11"}
  es6.array.iterator {"ie":"11"}
  es6.number.is-finite {"ie":"11"}
  es6.number.is-integer {"ie":"11"}
  es6.number.is-safe-integer {"ie":"11"}
  es6.number.is-nan {"ie":"11"}
  es6.number.epsilon {"ie":"11"}
  es6.number.min-safe-integer {"ie":"11"}
  es6.number.max-safe-integer {"ie":"11"}
  es6.math.acosh {"ie":"11"}
  es6.math.asinh {"ie":"11"}
  es6.math.atanh {"ie":"11"}
  es6.math.cbrt {"ie":"11"}
  es6.math.clz32 {"ie":"11"}
  es6.math.cosh {"ie":"11"}
  es6.math.expm1 {"ie":"11"}
  es6.math.fround {"ie":"11"}
  es6.math.hypot {"ie":"11"}
  es6.math.imul {"ie":"11"}
  es6.math.log1p {"ie":"11"}
  es6.math.log10 {"ie":"11"}
  es6.math.log2 {"ie":"11"}
  es6.math.sign {"ie":"11"}
  es6.math.sinh {"ie":"11"}
  es6.math.tanh {"ie":"11"}
  es6.math.trunc {"ie":"11"}
  es7.array.includes {"ie":"11"}
  es7.object.values {"safari":"10","ie":"11"}
  es7.object.entries {"safari":"10","ie":"11"}
  es7.object.get-own-property-descriptors {"safari":"10","ie":"11"}
  es7.string.pad-start {"ie":"11"}
  es7.string.pad-end {"ie":"11"}
  web.timers {"safari":"10","ie":"11"}
  web.immediate {"safari":"10","ie":"11"}
  web.dom.iterable {"safari":"10","ie":"11"}

Zur Laufzeit wird jedoch immer noch der Fehler in IE11 angezeigt, wenn ich die .find () -Methode für ein Array aufrufe.

Was kann ich tun, um zu überprüfen, ob die Polyfills richtig injiziert wurden?

bug

Hilfreichster Kommentar

Die einzige Lösung, die ich habe, ist das Hinzufügen einer benutzerdefinierten layout.js und das Hinzufügen
<script src='https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.23.0/polyfill.min.js' />

Alle 34 Kommentare

Die einzige Lösung, die ich habe, ist das Hinzufügen einer benutzerdefinierten layout.js und das Hinzufügen
<script src='https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.23.0/polyfill.min.js' />

@arunoda Wir haben das schon mal gesehen right

Als Hotfix könnten Sie dies tun:

import 'core-js/fn/array/find'

const test = ['hi', 'there'].find(item => item === 'hi')

export default () => (
  <div>{test}, welcome to next.js!</div>
)

Lassen Sie mich sehen, was hier los ist.

Ich habe dies mit einer normalen Babel-App überprüft und das Verhalten ist das gleiche.
Sie müssen die Polyfüllung wie oben erwähnt hinzufügen.

Ich schließe dies ab, da es sich nicht gerade um ein Next-spezifisches Problem handelt.

Aber ich bin offen für weitere Vorschläge.
Fühlen Sie sich frei, wieder zu öffnen.

@arunoda Ich habe versucht, diesen Hotfix mit import 'core-js/fn/array/find' in der Datei _document.js für alle Dateien zu reparieren, aber für IE11 hat es nicht funktioniert.

Ich musste mich für die Lösung entscheiden, um sie wie folgt einzuschließen:
<script src='https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.23.0/polyfill.min.js' />

Ich verwende Next.js V3.0.6.

Irgendeine Idee, wie ich das besser lösen könnte?

Hallo zusammen.
Ich habe mit der entry-Eigenschaft in next.config.js experimentiert.
Das habe ich
(gemäß https://github.com/zeit/next.js/blob/master/server/build/webpack.js#L42):

module.exports = {
  // eslint-disable-next-line no-unused-vars
  webpack(config, _) {
    const entry = async () => {
      const resolvedEntry = await config.entry()
      const entryWithPolyfill = Object.assign(
        { 'babel-polyfill': ['babel-polyfill'] },
        resolvedEntry
      )
      // console.log(entryWithPolyfill)
      return entryWithPolyfill
    }
    return Object.assign(
      config,
      entryWithPolyfill
    )
  }
}

Leider wird diese Datei nicht von babel transpiliert, weshalb sie noch nicht funktioniert .

Das Beste wäre, babel-polyfill in die Webpack-Konfiguration von Next aufzunehmen? Es ist durchaus üblich, es aufzunehmen.

@arunoda was denkst du?

irgendwelche Updates dazu? Das Einschließen der Polyfüllung ist nicht die beste Lösung

Auch daran interessiert 🤔

Ich habe diese importierenden Babel-Polyfills behoben:

import 'babel-polyfill';

Das Importieren des gesamten babel-polyfill ist äußerst verschwenderisch und wäre ein schlechter Standard für next.js, imho. Es fügt dem Bundle 87 KB hinzu, unabhängig davon, ob Sie tatsächlich eine der polygefüllten Funktionen benötigen oder nicht.

@sholzmayer wo hast du import 'babel-polyfill'; ? Ich habe es in der Datei _document.js versucht, aber es hat nicht geholfen

@klaemo also was ist dein vorschlag?

Das Hinzufügen von transform-runtime zu .babelrc Plugins scheint es für mich zu tun. Wir entwickeln eine App für Opera 36, ​​in die Object.entries nicht integriert ist.

"plugins": [
    "transform-runtime"
]

@hugotox Als App-Entwickler können Sie https://polyfill.io verwenden, um nur die benötigten Polyfills zu laden, oder Sie tun dies manuell. In unserer App haben wir ein polyfills.js , das ungefähr so ​​aussieht:

// Language features presented by https://github.com/zloirock/core-js
import 'core-js/fn/object/assign'
import 'core-js/fn/string/ends-with'
import 'core-js/fn/string/starts-with'
import 'core-js/fn/string/includes'
import 'core-js/fn/array/includes'
import 'core-js/fn/weak-map'

// browser features
import 'raf/polyfill'
import 'isomorphic-fetch'
import 'js-polyfills/url'

Alternativ könnte nextjs alle benötigten Polyfills aus core-js importieren und bündeln.

@igimanaloto Diese Lösung hat bei mir funktioniert

Ich benutze auch das Plugin transform-runtime , erhalte aber aus irgendeinem Grund den Fehler im IE.

{
  "plugins": [
    "source-map-support",
    "transform-runtime"
  ],
  "presets": [
    ["env", {
      "targets": {
        "node": "6.10"
      }
    }],
    ["stage-3"],
    [
      "next/babel",
      {
        "styled-jsx": {
          "optimizeForSpeed": true,
          "vendorPrefixes": true,
          "sourceMaps": true,
          "plugins": [
            "styled-jsx-plugin-sass"
          ]
        }
      }
    ]
  ]
}

@bliitzkrieg Importieren Sie babel-polyfill in _document.js , da _document.js nur auf dem Server gerendert wird.

Normalerweise wird empfohlen, es in Ihr Layout aufzunehmen. Grundsätzlich reicht jede Datei aus, die von allen Seiten geladen wird.

Update: Mein Beispiel für IE 10, 11 wurde behoben: Die Abhängigkeit von core-js/library/fn/object/assign in client/polyfill.js in core-js/fn/object/assign geändert (wie


Hier ist ein Dockerized next 5.1.0 Versuch, eine Kombination aus dem von @klaemo oben angegebenen canary / examples / with- polyfills, anzuwenden :

[Ursprüngliche Frage] Wie wird core-js in meiner Datei client / polyfills.js verwendet, um IE11 zu erhalten? (Ich könnte erwarten, dass der Ansatz von einem Import ausgeht, der alles abdeckt, was IE11 fehlt, und dann den Bereich schrittweise auf die Elemente reduziert, die die App benötigt.)

Hier ist das erste Ergebnis. Ich habe das Ergebnis bei einigen OS + Browserkombinationen (auf Browserstack) und es schlägt fehl, wenn es unter Windows 10 + IE11 (siehe unten) und möglicherweise anderen IE-Kombinationen fehlschlug.

screen shot 2018-04-21 at 3 49 31 pm

Ich habe versucht, next 5.1.0 auf Chrome 43 mit einem benutzerdefinierten Server, .babelrc und einer Webpack-Konfiguration auszuführen. import 'core-js/fn/object/assign'; hat es geschafft.

Dieser Fehler scheint immer noch zu bestehen! Ich habe das gleiche Problem in IE 11 und keine der Lösungen hilft. Probleme scheinen ein ansi-regex-Paket zu sein, das eine Pfeilfunktion verwendet und dies eine Abhängigkeit von next.js ist.

@arunoda @timneutkens Können wir dieses Problem erneut öffnen?

Ja existiert noch. Ich verwende Garnauflösungen zum Downgrade

import 'core-js/fn/object/assign' hat auch für mich funktioniert.

Musste zuerst core-js hinzufügen ( yarn add core-js ) - natürlich.

Ich fand das hilfreich: https://github.com/aspnet/JavaScriptServices/wiki/Supporting-Internet-Explorer-11- (oder älter)

Bitte fügen Sie eine offizielle Dokumentation zur ES6-Transpilation für Knotenmodule hinzu.

Hier ist eine Problemumgehung, aber dieser Fehler muss erneut geöffnet werden. @arunoda

Ich hatte Fehler mit Object.assign, String.endsWith auf ie11 (auf [email protected])

const {basedir} = require ('./ server / config');

// Polyfills für nicht immergrüne Browser erforderlich (hauptsächlich dh)
const polyfills = [
'core-js / fn / object / assign',
'core-js / fn / string / endet-mit',
'core-js / fn / string / beginnt-mit',
'core-js / fn / string / includes',
'core-js / fn / array / includes',
'core-js / fn / schwach-map',
];

module.exports = {
  webpack: (config, {dev, isServer}) => {
    const originalEntry = config.entry;
    if (!isServer) {
      config.entry = async () => {
        const entries = await originalEntry();
        Object.values(entries).forEach(entry => {
          entry.unshift(...polyfills);
          if (dev) {
            entry.unshift('eventsource-polyfill');
          }
        });
        return entries;
      };
    }

    return config;
  },
};

eigentlich bekomme ich manchmal

Cannot redefine non-configurable property 'endsWith'

Ich bin diesem Beispiel gefolgt, um Polyfills einzuschließen.
Damit IE11 funktioniert, musste ich diese in meine client/polyfills.js :

import 'core-js/es6/map';
import 'core-js/es6/set';

import 'core-js/fn/object/assign';
import 'core-js/fn/string/ends-with';
import 'core-js/fn/string/starts-with';
import 'core-js/fn/string/includes';
import 'core-js/fn/array/includes';
import 'core-js/fn/array/find';

import 'core-js/fn/number/is-finite';

Ich bin mir nicht sicher, wann es einige Bibliotheken gibt, die zB isFinite benötigen, aber meine App ist ziemlich minimal.

Dies funktioniert, ist jedoch sehr umständlich, um herauszufinden, welche Polyfills tatsächlich benötigt werden.

Weiß jemand, welche Polyfüllung erforderlich ist, damit die Klassensyntax in IE11 funktioniert?

Klasse Foo erweitert ...

Kommentieren Sie in Ihren Polyfills 'import' core-js / es6 / object ';' Linie

Ich bin dem Beispiel gefolgt, das Sie @peec erwähnt

@peec ist dies jedoch das erwartete Verhalten? Warum sollte ich etwas, das enthalten war, erneut füllen?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen