React 17 and webpack 5 not working in IE11

Viewed 1397

I have looked into everything I could about the migration to react 17 and webpack 5. This for an application that is also running on IE11. And after all the changes (as you will see in the code) , according to evrything I read, it still doesnt work. I get the same error enter image description here. When I look at the bundle and open it, there is a const there, which belongs to es6. It means that there was not translation, despite all the babel change I made.

If someone has an idea what could be done it would great!

Here is my webpack fike:

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

const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');
const autoprefixer = require('autoprefixer');

const Dotenv = require('dotenv-webpack')
const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");

const smp = new SpeedMeasurePlugin();

const nodeEnv = process.env.NODE_ENV || "development"
const simulateProd = process.env.SIMULATE_PROD
const isProdEnv = nodeEnv === 'production'
const isNotDevEnv = nodeEnv !== "development"

const buildPath = 
const sourcePath = 
const imagesPath = 
const iconsPath =
const soundsPath = ;


// Common plugins
const plugins = [
  new webpack.ProvidePlugin({
    Buffer: ['buffer', 'Buffer'],
    process: 'process/browser',
  }),
  new MiniCssExtractPlugin(),
  new webpack.LoaderOptionsPlugin({
    options: {
      postcss: [
        autoprefixer(),
      ],
      context: sourcePath,
    },
  }),
  new CopyWebpackPlugin(
    { 
      patterns: [
        {from: iconsPath, to: 'icons'},
        {from: imagesPath, to: 'images'}
      ]
    }
  ),
  new Dotenv({
    systemvars: true
  }),
  new HtmlWebpackPlugin({
    template: path.join(sourcePath, 'index.html'),
    path: buildPath,
    filename: 'index.html',
  }),
]


// Common rules
const rules = [
  {
    test: /\.(js|jsx)$/,
    loader: 'babel-loader',
    exclude: /node_modules/,
    options: {
      plugins: ['react-hot-loader/babel'],
      presets: ["@babel/preset-env"]  //Preset used for env setup
    }
    // use: [
    //   'babel-loader',
    // ],
  },
  {
    test: /\.s[ac]ss$/i,
    exclude: /node_modules/,
    use: [
      {
        // creates style nodes from JS strings
        loader: "style-loader",
        // options: {sourceMap: true}
      },
      // Translates CSS into CommonJS
      {
        loader: 'css-loader',
        options: {
          importLoaders: 1,
          url: false,
          modules: {localIdentName: "[path]___[name]__[local]___[hash:base64:5]"}
          
        }
      },
      {
        loader:"resolve-url-loader"
      },
      {
        // compiles Sass to CSS
        loader: "sass-loader",
        options: {
          sourceMap: true
        }
      },
    ],
  },
  {
    test: /\.css$/,
    use: [MiniCssExtractPlugin.loader, "style-loader", 'css-loader'],
  },
  {
    test: /\.(ico|jpe?g|png|gif|svg|mp3|html)$/,
    include: [imagesPath, soundsPath],
    type: 'asset/resource',
    // use: 'file-loader',
    // generator: {
    //   filename: '[path][name].[ext]'
    // },
  },
  {
    test: /\.md$/,
    use: 'raw-loader'
  }
]


if (isProdEnv) {
  // Production plugins
  plugins.push(
    new TerserPlugin({
      // cache: true,
      parallel: true,
      // sourceMap: true
    })
  )
} 
else {
  // Development plugins

}

module.exports = smp.wrap({ 
  mode : isNotDevEnv ? 'production' : 'development',
  target: ['web', 'es5'],
  experiments: {
    asset: true
  },
  devtool: isNotDevEnv ? false : 'source-map',
  context: sourcePath,
  
  entry: {
    js: ['react-hot-loader/patch','./index.js'],
  },
  output: {
    path: buildPath,
    publicPath: '/',
    filename: "bundle.js",
    assetModuleFilename: '[path][name].[ext]'
  },
  module: {
    rules,
  },
  resolve: {
   
    extensions: ['.webpack-loader.js', '.web-loader.js', '.loader.js', '.js', '.jsx', '.md', '.scss', '.css'],
    modules: [
      path.resolve(__dirname, 'node_modules'),
      sourcePath,
    ],
    fallback: {
      "buffer": require.resolve('buffers'),
      "assert": require.resolve('assert/'),
      "fs": false,
      "os": false,
      "path": false,
      "zlib": require.resolve('browserify-zlib'),
      "stream": require.resolve('stream-browserify'),
      "crypto": false,

    } ,
  },
  plugins,
  optimization : {
    moduleIds: 'named',
    sideEffects: isProdEnv,
  },
  devServer: {
    contentBase: isNotDevEnv ? buildPath : sourcePath,
    historyApiFallback: true,
    port: 8080,
    compress: isNotDevEnv,
    inline: !isNotDevEnv,
    hot: !isNotDevEnv,
    host: "localhost",
    disableHostCheck: true,
    stats: {
      assets: true,
      children: false,
      chunks: false,
      hash: false,
      modules: false,
      publicPath: false,
      timings: true,
      version: false,
      warnings: true,
      colors: {
        green: '\u001b[32m',
      },
    },
  },
});

Here is my babel.config.json file:

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "useBuiltIns": "usage",
        "corejs": "3",
        "targets": {
          "browsers": ["last 5 versions", "ie >= 9"]
        }
      }
    ],
    "@babel/preset-typescript",
    "@babel/preset-react"
  ],
  "plugins": [
    "@babel/plugin-proposal-object-rest-spread",
    ["@babel/plugin-proposal-decorators", { "legacy": true }],
    "react-hot-loader/babel",
    "@babel/plugin-transform-arrow-functions",
    "@babel/plugin-proposal-optional-chaining",
    "@babel/plugin-proposal-nullish-coalescing-operator",
        "@babel/plugin-proposal-class-properties",
    [
      "@babel/plugin-transform-modules-commonjs",
      {
        "allowTopLevelThis": true
      }
    ]
  ]
}

at the start of my src/index.js

there is that :

require('es6-promise/auto')
require('string.prototype.startswith')
require('string.prototype.endswith')
import 'react-app-polyfill/ie11';
import "react-app-polyfill/stable";
import "core-js/stable";
import "regenerator-runtime/runtime";

in my package.json I added that:

"browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all",
      "IE 11"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version",
      "IE 11"
    ]
  },

Thank you !

0 Answers
Related