Next.js: Полифилл Babel не вводится

Созданный на 5 июл. 2017  ·  34Комментарии  ·  Источник: vercel/next.js

Я пытаюсь поддерживать IE11 для своего приложения, чтобы исправить ошибку
TypeError: Object doesn't support property or method 'find'

Используется следующий 2.4.6 но не работает с последней бета-версией

Добавлен пользовательский .babelerc вместе с babel-preset-env со следующей конфигурацией:

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

Включен флаг отладки, поэтому при запуске я получаю следующий журнал, который, кажется, означает, что полифилы добавлены.

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"}

Однако во время выполнения я все еще получаю ошибку в IE11, когда вызываю метод .find () для массива.

Что я могу сделать, чтобы дважды проверить, правильно ли введены полифилы?

Самый полезный комментарий

Единственное исправление, которое у меня есть, - это добавить собственный layout.js и добавить
<script src='https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.23.0/polyfill.min.js' />

Все 34 Комментарий

Пример проекта @ https://github.com/jonaswindey/next-polyfill-bug

Единственное исправление, которое у меня есть, - это добавить собственный layout.js и добавить
<script src='https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.23.0/polyfill.min.js' />

@arunoda Мы уже видели это раньше

В качестве исправления вы можете сделать следующее:

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

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

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

Дай мне посмотреть, что здесь происходит.

Я проверил это с помощью обычного приложения babel, и поведение такое же.
Вам нужно добавить полифилл, как я упоминал выше.

Итак, я закрываю это, поскольку это не совсем конкретная проблема Next.

Но я открыт для других предложений.
Не стесняйтесь открывать заново.

@arunoda Я пробовал это исправление с import 'core-js/fn/array/find' внутри _document.js, чтобы исправить его для всех файлов, но это не сработало для IE11.

Мне пришлось пойти с решением, чтобы включить его вот так:
<script src='https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.23.0/polyfill.min.js' />

Я использую Next.js V3.0.6.

Любая идея, как я могу решить эту проблему лучше?

Всем привет.
Я экспериментировал со свойством entry в next.config.js .
Это то, что у меня есть
(согласно 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
    )
  }
}

К сожалению, этот файл не передается через babel, поэтому он пока не работает .

Лучше всего было бы включить babel-polyfill в конфигурацию веб-пакета Next? Его включать довольно часто.

@arunoda что ты думаешь?

какие-нибудь обновления по этому поводу? Включение полифила - не лучшее решение

Тоже интересует 🤔

Я исправил этот импорт полифиллов babel:

import 'babel-polyfill';

Импорт всего babel-polyfill чрезвычайно расточителен и будет плохим вариантом по умолчанию для next.js, imho. Он добавляет 87 КБ в пакет независимо от того, действительно ли вам нужны какие-либо полифилированные функции или нет.

@sholzmayer где вы использовали import 'babel-polyfill'; . Я пробовал в _document.js, но это не помогло

@klaemo, что ты

Добавление transform-runtime к плагинам .babelrc кажется, делает это за меня. Мы разрабатываем приложение для Opera 36, ​​в которое не встроены Object.entries.

"plugins": [
    "transform-runtime"
]

@hugotox, как разработчик приложений, вы можете использовать https://polyfill.io только для загрузки необходимых полифиллов или делать это вручную. В нашем приложении есть polyfills.js который выглядит примерно так:

// 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'

В качестве альтернативы nextjs может импортировать и связывать все необходимые полифиллы из core-js .

@igimanaloto, это решение сработало для меня

Я также использую плагин transform-runtime но по какой-то причине я получаю ошибку в 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 Не импортируйте babel-polyfill в _document.js , потому что _document.js отображается только на сервере.

Обычно рекомендуется включать его в свой макет, в основном любой файл, загружаемый всеми страницами, подойдет.

Обновление: исправлен мой пример для IE 10, 11: изменена зависимость core-js/library/fn/object/assign в client/polyfill.js на core-js/fn/object/assign (как это было у


Вот Dockerized next 5.1.0 попытка использовать комбинацию подхода, указанного выше @klaemo, и официального примера, canary / examples / with-polyfills :

[Исходный вопрос] Какое использование core-js в моем файле client / polyfills.js дает мне IE11? (Я мог бы ожидать, что подход будет исходить из импорта, который охватывает все, что отсутствует в IE11, а затем постепенно сокращает диапазон до тех элементов, которые нужны приложению.)

Вот первоначальный результат. Я проверил результат в нескольких комбинациях ОС + браузер (в стеке браузера), и он не работает, когда он не работает в Windows 10 + IE11 (показано ниже) и, возможно, в других комбинациях IE.

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

Я пытался запустить next 5.1.0 на chrome 43 с настраиваемым сервером, конфигурацией .babelrc и webpack. import 'core-js/fn/object/assign'; сделали свое дело.

Кажется, эта ошибка все еще существует! Я столкнулся с той же проблемой в IE 11, и ни одно из решений не помогает. Проблемы, похоже, связаны с пакетом ansi-regex, который использует стрелочную функцию, и это является зависимостью от next.js.

@arunoda @timneutkens, можем ли мы снова открыть эту проблему?

Да еще существует. Я использую разрешение пряжи для понижения версии

import 'core-js/fn/object/assign' у меня тоже сработало.

Пришлось сначала добавить core-js ( yarn add core-js ) - конечно.

Я нашел это полезным: https://github.com/aspnet/JavaScriptServices/wiki/Supporting-Internet-Explorer-11- (или старше)

Добавьте официальную документацию о транспиляции ES6 для узловых модулей.

вот обходной путь, но эту ошибку необходимо повторно открыть. @arunoda

у меня были ошибки с Object.assign, String.endsWith на ie11 (на [email protected])

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

// полифиллы, необходимые для не вечнозеленых браузеров (в основном, т.е.)
const polyfills = [
'core-js / fn / object / assign',
'core-js / fn / string / заканчивается на',
'core-js / fn / строка / начинается с',
'core-js / fn / string / includes',
'core-js / fn / array / includes',
'core-js / fn / weak-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;
  },
};

на самом деле я иногда получаю

Cannot redefine non-configurable property 'endsWith'

Я последовал этому примеру и включил полифиллы.
Чтобы IE11 работал, мне пришлось включить их в свой 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';

Я не уверен, есть ли какие-то библиотеки, которые, например, нужны isFinite, но мое приложение довольно минималистично.

Это работает, но очень сложно определить, какие полифилы действительно нужны.

кто-нибудь знает, какой полифилл необходим, чтобы синтаксис класса работал в IE11?

класс Foo расширяется ...

раскомментируйте в полифиллах 'import' core-js / es6 / object ';' линия

Я последовал примеру, который вы упомянули @peec, и у меня это сработало.

@peec , это ожидаемое поведение? Зачем мне нужно повторно заполнять полифиллом то, что было включено?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги