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

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

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

Насколько мне известно, все, что мне нужно, это правильная конфигурация 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


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


person krukid    schedule 14.08.2019    source источник
comment
Это выглядит правильно для меня. Убедитесь, что вы останавливаете и перезапускаете команду ember serve, чтобы зарегистрировать изменения в этом специальном файле. Не могли бы вы уточнить ошибку, которую вы видите? Просто не работает в сафари?   -  person jrjohnson    schedule 14.08.2019
comment
@jrjohnson Да, я перезагружался после каждого изменения конфигурации, перезагружался без кеша. Это кажется довольно простым, однако, когда я использую Object.fromEntries, независимо от моей конфигурации полифилла, Safari 11 говорит, что Object.fromEntries не является функцией, и Safari 12 отлично работает на странице, которая ее использует. Когда я использую инструменты разработки Safari, я вижу, что v12 имеет собственную реализацию Object.fromEntries, а v11 не определяет ее. Возможно, мои предположения о том, как работают эти опции, неверны. Я не смог найти исчерпывающего руководства по Ember по этому делу.   -  person krukid    schedule 15.08.2019
comment
Чтобы было ясно, я вижу эффект изменения конфигурации, например. если я изменю useBuiltIns на usage, то сборка не сможет найти некоторый импорт core-js (что тоже кажется странным, но это другой случай), и если я добавлю несуществующий полифилл как include, то он выдаст ошибку сборки, как и следовало ожидать .   -  person krukid    schedule 15.08.2019


Ответы (2)


Как выглядит ваш файл config/targets.js? Мне интересно, не включен ли полифил, потому что конфигурация вашего браузера включает только самую последнюю версию 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'
];

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

person jrjohnson    schedule 16.08.2019

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

Итак, проблема здесь в том, что:

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

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

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

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

person Chris Rice    schedule 04.05.2020