BREAKING CHANGE: webpack < 5 used to include polyfills for node.js core modules by default

Viewed 33633

I'm trying to use Socket.io in my Laravel/Vue.js app. But I'm getting this error when running npm run dev.

Module not found: Error: Can't resolve 'path' in '/home/nicolas/LaravelProjects/Chess/node_modules/socket.io/dist'

BREAKING CHANGE: webpack < 5 used to include polyfills for node.js core modules by default.
This is no longer the case. Verify if you need this module and configure a polyfill for it.

If you want to include a polyfill, you need to:
    - add a fallback 'resolve.fallback: { "path": require.resolve("path-browserify") }'
    - install 'path-browserify'
If you don't want to include a polyfill, you can use an empty module like this:
    resolve.fallback: { "path": false }

webpack compiled with 9 errors

I tried changing the webpack.config.js file by adding resolve.fallback: { "path": false }, but it doesn't seem to help. It is possible that I'm doing it wrong since I have 4 webpack.config.js files in my project (I don't know why).

Maybe can I downgrade webpack? Thanks!

12 Answers

This fix worked for me (Vue 3):

  1. In vue.config.js, add:
const { defineConfig } = require('@vue/cli-service')
const NodePolyfillPlugin = require("node-polyfill-webpack-plugin")
module.exports = defineConfig({
  transpileDependencies: true,
  configureWebpack: {
    plugins: [
      new NodePolyfillPlugin()
    ]
  }

})
  1. Followed by npm install node-polyfill-webpack-plugin

I have the same issue with crypto. Some say that adding a proper path in TS config (and installing a polyfill) should resolve the issue.

tsconfig.json
{
  "compilerOptions": {
    "paths": {
      "crypto": [
        "./node_modules/crypto-browserify"
      ],
}

Details https://github.com/angular/angular-cli/issues/20819

I'm still fighting with crypto, but above link might help in your struggles.

I had this problem in ReactJS with create-react-app(facebook) but other packages (crypto-browserify)

Solution:

  1. First install the necessary packages in this problem "path-browserify" but in my case "crypto-browserify"

  2. Modify webpack.config.js in reactjs with create-react-app this file is inside:

node_modules/react-scripts/config/webpack.config.js

  • Search module.exports and inside this function there is a return:
module.exports = function (webpackEnv) {
  ...
  return {
   ...
    resolve: {
      ...
      fallback: {
        // Here paste
        path: require.resolve("path-browserify"),
        // But in mi case I paste
        crypto: require.resolve("crypto-browserify"),

      }
    }
  }
}

Note: This solution works, but when the webpack project starts it shows warnings

Pd: I am not native speaker English, but I hope understand me.

I have the same issue in React (feb-2022) using Real (realm-web) from Mongo.

I solve this in two steps:

  1. npm i stream-browserify crypto-browserify
  2. create fallback object into webpack.config.js at node_modules/react-scripts/config/webpack.config.js
module.exports = function (webpackEnv) {
  ...
  return {
   ...
    resolve: {
      ...
      fallback: { // not present by default
        "crypto": false,
        "stream": false

      }
    }
  }

I had the same issue, Strangely an import {script} from 'laravel-mix' in my app.js. I removed it and everything went back to normal.

I could not get the other answers to work with React on a new project with rss-parser. The error messages aren't clear. I fixed it by adding this line to the webpack configuration:

  resolve: {
    extensions: ['.tsx', '.ts', '.js'],
    fallback: { "http": false, "browser": false, "https": false, 
      "stream": false, "url": false, "buffer": false, "timers": false
    }
  },

Watch out for this import in your app.js. Removing it fixed my issue.

Watch out for this import in your app.js

use the version of webpack 4.46.0 to remove the error

I had to delete this line in a Vue component to solve the problem:

import { ContextReplacementPlugin } from "webpack";

If you use create-react-app(cra)

  1. You have to overwrite the default webpack file to do that you need to install a package like "react-app-rewired" that will help overwriting and merge your configuration with the ones were added by react scripts First
 npm install --D react-app-rewired
  1. create a new file in the root directory called "config-overrides.js"
  2. Install(using npm) and Add the required dependencies to the created config file
npm i -D path-browserify
install other packages as the error message shows
const webpack = require('webpack');

module.exports = function override(config) {
  const fallback = config.resolve.fallback || {};
  Object.assign(fallback, {
    path: require.resolve('path-browserify'),
    add others as shown in the error if there are more
  });
  config.resolve.fallback = fallback;
  config.plugins = (config.plugins || []).concat([
    new webpack.ProvidePlugin({
      process: 'process/browser',
      Buffer: ['buffer', 'Buffer'],
    }),
  ]);
  return config;
};

  1. Update your package.json scripts
 "scripts": {
    "build": "react-app-rewired build",
     ....
    "start": "react-app-rewired start",
    "test": "react-app-rewired test"
  },

Also please note that a new version of react-scripts(newer than 5.0.1) might solve the issue.

had this issue in a react-app.
installation of stream-browserify crypto-browserify didn't work for me

went through with hjpithadia's answer in Reactjs with a slight change in webpack.config.js

  1. install the package npm install node-polyfill-webpack-plugin
  2. find the webpack configuration file here
node_modules/react-scripts/config/webpack.config.js
  1. import the package const NodePolyfillPlugin = require("node-polyfill-webpack-plugin");
  2. search for module.exports
  3. in plugin array add this new NodePolyfillPlugin(),
module.exports = function (webpackEnv) {
  ...
  return {
   ...
    plugins: [
      new NodePolyfillPlugin(),
      ...
    ]
  }
}

I finally found the solution. With laravel, you have to change the webpack.mix.js file and not webpack.config.js.

Related