Невозможно заполнить Object.fromEntries в Ember

У меня есть простое приложение Ember, и мне нужно заполнить Object.fromEntries в компоненте.

Для справки я использую Safari 12.1.1, который поддерживает fromEntries изначально и Safari 11.1.1 этого не делает.

AFAIK, все, что мне нужно, это правильный ember-cli-build.js конфигурации.

Я был бы признателен, если бы кто-то мог сказать мне, почему следующие настройки не правильно заполняют функцию:

const app = new EmberApp(defaults, {

  'ember-cli-babel': {
    // supposedly should inject core-js/stable into app
    // @see https://github.com/babel/ember-cli-babel#polyfill
    includePolyfill: true,
  },

  babel: {
    // should replace injected core-js/stable with imports
    // that are not natively supported by config/targets.js
    // @see https://babeljs.io/docs/en/babel-preset-env#usebuiltins-entry
    useBuiltIns: 'entry',

    // explicitly use corejs v3 per babel-preset-env docs
    corejs: 3,

    // force inclusion of fromEntries regardless of config/targets.js
    include: [
      'es.object.from-entries',
    ],
  },

  //...
});

Я могу видеть это там: https://github.com/babel/babel/blob/v7.5.5/packages/babel-preset-env/src/polyfills/corejs3/built-in-definitions.js#L265


Версии пакета:

  • ember-source@3.7.2
  • ember-cli@3.5.0
  • ember-cli-babel@7.5.0
  • @ Столпотворение / ядро ​​@ 7.5.5
  • core-js@3.2.1

1 ответ

У меня такая же проблема, за исключением того, что IE11 находится в моем списке, и он все еще не может использовать Object.fromEntries метод.

Итак, проблема в том, что:

  1. Ember / Broccoli использует забавную модульную систему, которая делает useBuiltIns: 'entry' а также useBuiltIns: 'usage'невозможно. На момент написания эта проблема еще не прорабатывалась. https://github.com/babel/ember-cli-babel/issues/298
  2. Синтаксис include в основном не работает. https://github.com/babel/babel/issues/8932

Решение, которое я нашел, заключалось в том, чтобы просто обойти систему babel / ember / broccoli, как и @babel/polyfilуведомление об устаревании говорит делать sorta.

  1. Удалите все новое babel вещи в ember-cli.build.js файл, который вы добавили, чтобы попытаться заставить его работать, но оставьте includePolyfill: true.
  2. npm install core-js --save-dev установить corejs напрямую
  3. Импортируйте именно тот полифилл, который взрывается.
import "core-js/es/object/from-entries";

Это единственный способ заставить его работать.

Что делает твой config/targets.js файл похож? Мне интересно, не включен ли polyfill, потому что конфигурация вашего браузера включает только самую последнюю версию Safari, поэтому Ember и Babel умны и не отправляют дополнительный код.

По умолчанию для новых приложений:

'use strict';

const browsers = [
  'last 1 Chrome versions',
  'last 1 Firefox versions',
  'last 1 Safari versions'
];

const isCI = !!process.env.CI;
const isProduction = process.env.EMBER_ENV === 'production';

if (isCI || isProduction) {
  browsers.push('ie 11');
}

module.exports = {
  browsers
};

Включает IE11 только в производственные сборки. Если вы тестируете Safari 11 локально, он не будет включен в этот список.

Попробуйте изменить его на последние 2 версии Safari.

const browsers = [
  'last 1 Chrome versions',
  'last 1 Firefox versions',
  'last 2 Safari versions'
];

И посмотри, поможет ли это.

Другие вопросы по тегам