最新消息:Welcome to the puzzle paradise for programmers! Here, a well-designed puzzle awaits you. From code logic puzzles to algorithmic challenges, each level is closely centered on the programmer's expertise and skills. Whether you're a novice programmer or an experienced tech guru, you'll find your own challenges on this site. In the process of solving puzzles, you can not only exercise your thinking skills, but also deepen your understanding and application of programming knowledge. Come to start this puzzle journey full of wisdom and challenges, with many programmers to compete with each other and show your programming wisdom! Translated with DeepL.com (free version)

javascript - React Babel polyfill for Object.values() - Stack Overflow

matteradmin5PV0评论

In our project we have been using Object.keys() and Object.values() a lot! Since it's Magento (1) based we've had it polyfilled with Prototype.js (without knowing that it came from that).

We have however discovered some performance issues that seem directly related to Prototype.js so we want to remove it.

I don't want to change every placed they are used. Instead I want a good polyfill that is loaded only for browsers which doesn't support it by default. I want the polyfill to be hosted on our servers also to avoid any strange bugs if the cdn were to be down (we have an own cdn solution).

Everything Babel is kind of confusing to me. Webpack is also semi-new to me and confusing at times.. There seems to have been a change in the syntax of the webpack.config, and as we are using some older spec. it's even more confusing trying to follow documentation and googling for answers. I guess we should update to the new spec. some time soon.

We have this today, relevant sections,

webpack.config.js:

const path = require('path');
const webpack = require('webpack');

const BUILD_DIR = path.resolve(__dirname, 'build/');
const APP_DIR = path.resolve(__dirname, 'src/');

module.exports = function config(env, argv = {}) {
  return {
    entry: ['core-js', 'formdata-polyfill', 'whatwg-fetch', `${APP_DIR}/index.js`],
    output: {
      path: BUILD_DIR,
      filename: 'react-frontend.js',
    },
    resolve: {
      extensions: ['.js', '.jsx'],
      modules: [
        path.resolve(__dirname, 'src/'),
        'node_modules',
      ],
      alias: {
        panyName: path.resolve(__dirname, './src/panyName.js'),
      },
    },
    module: {
      loaders: [
        {
          test: /\.jsx?$/,
          include: APP_DIR,
          loader: ['babel-loader', 'eslint-loader'],
        },

packages.json

{
  "dependencies": {
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.4",
    "babel-plugin-transform-object-assign": "^6.22.0",
    "babel-plugin-transform-proto-to-assign": "^6.26.0",
    "babel-plugin-transform-runtime": "^6.23.0",
    "babel-preset-env": "^1.6.1",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-es2017-node7": "^0.5.2",
    "babel-preset-react": "^6.24.1",
    "babel-preset-stage-0": "^6.24.1",
    "babel-runtime": "^6.26.0",
    "core-js-bundle": "^3.0.0-alpha.1",
    "formdata-polyfill": "^3.0.12",
    "react": "^16.3.0",
    "webpack": "^3.11.0",
    "whatwg-fetch": "^2.0.4"

I'm afraid of just adding / if it adds polyfills for things we already have polyfills for..

Except for Object.values() we seem to have working polyfills for everything else we need, supporting the most used browsers latest 2 versions + IE11.

Or should we just add: ?

Edit: Updated question, I saw that Object.keys() was already working but not Object.values().

In our project we have been using Object.keys() and Object.values() a lot! Since it's Magento (1) based we've had it polyfilled with Prototype.js (without knowing that it came from that).

We have however discovered some performance issues that seem directly related to Prototype.js so we want to remove it.

I don't want to change every placed they are used. Instead I want a good polyfill that is loaded only for browsers which doesn't support it by default. I want the polyfill to be hosted on our servers also to avoid any strange bugs if the cdn were to be down (we have an own cdn solution).

Everything Babel is kind of confusing to me. Webpack is also semi-new to me and confusing at times.. There seems to have been a change in the syntax of the webpack.config, and as we are using some older spec. it's even more confusing trying to follow documentation and googling for answers. I guess we should update to the new spec. some time soon.

We have this today, relevant sections,

webpack.config.js:

const path = require('path');
const webpack = require('webpack');

const BUILD_DIR = path.resolve(__dirname, 'build/');
const APP_DIR = path.resolve(__dirname, 'src/');

module.exports = function config(env, argv = {}) {
  return {
    entry: ['core-js', 'formdata-polyfill', 'whatwg-fetch', `${APP_DIR}/index.js`],
    output: {
      path: BUILD_DIR,
      filename: 'react-frontend.js',
    },
    resolve: {
      extensions: ['.js', '.jsx'],
      modules: [
        path.resolve(__dirname, 'src/'),
        'node_modules',
      ],
      alias: {
        panyName: path.resolve(__dirname, './src/panyName.js'),
      },
    },
    module: {
      loaders: [
        {
          test: /\.jsx?$/,
          include: APP_DIR,
          loader: ['babel-loader', 'eslint-loader'],
        },

packages.json

{
  "dependencies": {
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.4",
    "babel-plugin-transform-object-assign": "^6.22.0",
    "babel-plugin-transform-proto-to-assign": "^6.26.0",
    "babel-plugin-transform-runtime": "^6.23.0",
    "babel-preset-env": "^1.6.1",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-es2017-node7": "^0.5.2",
    "babel-preset-react": "^6.24.1",
    "babel-preset-stage-0": "^6.24.1",
    "babel-runtime": "^6.26.0",
    "core-js-bundle": "^3.0.0-alpha.1",
    "formdata-polyfill": "^3.0.12",
    "react": "^16.3.0",
    "webpack": "^3.11.0",
    "whatwg-fetch": "^2.0.4"

I'm afraid of just adding https://babeljs.io/docs/en/babel-polyfill/ if it adds polyfills for things we already have polyfills for..

Except for Object.values() we seem to have working polyfills for everything else we need, supporting the most used browsers latest 2 versions + IE11.

Or should we just add: https://www.npmjs./package/es7-object-polyfill ?

Edit: Updated question, I saw that Object.keys() was already working but not Object.values().

Share Improve this question edited Dec 10, 2018 at 10:44 OZZIE asked Dec 9, 2018 at 14:20 OZZIEOZZIE 7,41810 gold badges63 silver badges64 bronze badges 4
  • 2 Babel polyfill is a wrapper for core-js. Use it directly the way you want. keys is ES5. It's doesn't fall under same category as values. Did you mean entries? – Estus Flask Commented Dec 9, 2018 at 14:25
  • @estus thanks, I noticed now that Object.keys() was already working fine, not Object.values() though, which seems to be slightly different from Object.entries(). – OZZIE Commented Dec 10, 2018 at 10:45
  • You're already using core-js which is reliable source for polyfills. What you're trying to do with Object.values is a hack, I'd suggest to fix problems with core-js instead. Object.values is one of many things that may go wrong if you applied polyfills incorrectly. if it adds polyfills for things we already have polyfills for.. - it uses core-js any way, and core-js doesn't add polyfills for things that are already properly polyfilled. – Estus Flask Commented Dec 10, 2018 at 11:09
  • useful background: github./IBM/carbon-ponents-react/issues/… – ptim Commented Mar 19, 2019 at 3:31
Add a ment  | 

1 Answer 1

Reset to default 5

I noticed now that Object.keys() was already working fine, not Object.values() though, which seems to be slightly different from Object.entries()

So I added a simple polyfill for it like this.

index.js

import './polyfills';

polyfills.js

const objectToValuesPolyfill = (object) => {
  return Object.keys(object).map(key => object[key]);
};
Object.values = Object.values || objectToValuesPolyfill;
Post a comment

comment list (0)

  1. No comments so far