Почему Object.assign() требует polyfill, когда используется загрузчик babel?
Я пытаюсь использовать Object.assign()
в веб-приложении ES6, скомпилированном Babel с webpack, но я получаю сообщение об ошибке:
Uncaught TypeError: Object.assign is not a function
Я уже использую babel-loader
, чтобы перевести ES6 на ES5, так что все мои другие ES6-коды работают. Тем не менее, Object.assign()
работает только после того, как я также import "babel-core/polyfill"
в моей кодовой базе. Я вижу, что я также могу исправить эту импортируя babel-runtime, но я хотел бы понять, почему Object.assign()
требует больше, чем выполняет babel-loader
- shouldn ' t babel-loader
препроцесс всего, включая Object.assign()
?
Ответы
Ответ 1
Вавилон через babel-loader
переносит различия в синтаксисе ES6. Babel сам по себе абсолютно ничего не добавляет в стандартную библиотечную функциональность ES6 (например, Object.assign
). Загрузка polyfill загружает отдельный polyfill core-js
для вас, но вы можете загрузить любой polyfill, который вы хотите.
Даже некоторые преобразования синтаксиса полагаются на определенные функциональные возможности polyfill, чтобы быть загруженными, поскольку некоторый синтаксис основан на алгоритмах и поведении, реализованных в библиотечном коде. Элементы ES6 на http://babeljs.io/docs/learn-es2015/ перечисляют, какие стандартные функции библиотеки предполагается загруженными.
Ответ 2
Object.assign()
- это новый API, который является частью спецификации ES6, поэтому он еще не реализован в большинстве браузеров. См.: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
Поэтому, когда вы импортируете babel-core/polyfill
, он добавляет к нему и другие новые API, чтобы ваш ES6-код мог их использовать.
babel-loader
- это просто транспилятор, который преобразует синтаксис ES6 в код, совместимый с ES5.
Ответ 3
Если вы перейдете к "Совместимость", вы увидите, что IE 11 не поддерживается как в Web, так и в Mobile для объекта object.assign. Это также дает вам почин для этого.
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
if (typeof Object.assign != 'function') {
Object.assign = function(target, varArgs) {
'use strict';
if (target == null) { // TypeError if undefined or null
throw new TypeError('Cannot convert undefined or null to object');
}
var to = Object(target);
for (var index = 1; index < arguments.length; index++) {
var nextSource = arguments[index];
if (nextSource != null) { // Skip over if undefined or null
for (var nextKey in nextSource) {
// Avoid bugs when hasOwnProperty is shadowed
if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
to[nextKey] = nextSource[nextKey];
}
}
}
}
return to;
};
}
Если вы используете Babel
https://babeljs.io/docs/plugins/transform-object-assign/
Если вы используете NPM
https://www.npmjs.com/package/object-assign