'i tried to Polyfill modules in webpack 5 but not working (Reactjs)
Hi guys am a newbie in React when i start my project i get the Wepback V5 Error Message
Resolve updated : https://github.com/facebook/create-react-app/issues/11756#issuecomment-1001162736
This What am using!
Os: Win11
Node : v16
React:v17
React-script : v5
Webpack:v5
This Error Message Contains
Crypto
Http
Https
Stream
Error Output
Compiled with problems:X
ERROR in ./node_modules/eth-lib/lib/bytes.js 9:193-227
Module not found: Error: Can't resolve 'crypto' in 'C:\Users\PC\Desktop\Portfolio\portfolio_app\node_modules\eth-lib\lib'
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: { "crypto": require.resolve("crypto-browserify") }'
- install 'crypto-browserify'
If you don't want to include a polyfill, you can use an empty module like this:
resolve.fallback: { "crypto": false }
ERROR in ./node_modules/web3-eth-accounts/lib/index.js 31:74-91
Module not found: Error: Can't resolve 'crypto' in 'C:\Users\PC\Desktop\Portfolio\portfolio_app\node_modules\web3-eth-accounts\lib'
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: { "crypto": require.resolve("crypto-browserify") }'
- install 'crypto-browserify'
If you don't want to include a polyfill, you can use an empty module like this:
resolve.fallback: { "crypto": false }
ERROR in ./node_modules/web3-eth-accounts/node_modules/eth-lib/lib/bytes.js 7:193-227
Module not found: Error: Can't resolve 'crypto' in 'C:\Users\PC\Desktop\Portfolio\portfolio_app\node_modules\web3-eth-accounts\node_modules\eth-lib\lib'
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: { "crypto": require.resolve("crypto-browserify") }'
- install 'crypto-browserify'
If you don't want to include a polyfill, you can use an empty module like this:
resolve.fallback: { "crypto": false }
Image Contain Output
Solution 1:[1]
I resolve these errors but my app did not render.
If you are interested to clear these errors you can paste code right into your-project/node_modules/react-scripts/config/webpack.config.js
but these changes can be overwritten after rebuilding your app.
Find in module.exports object resolve and write fallback,in your case it's "crypto": require.resolve("crypto-browserify")
.
And install dependency npm install crypto-browserify
.
resolve: {
// fallback: {
// "fs": false,
// "tls": false,
// "net": false,
// "http": require.resolve("stream-http"),
// "https": false,
// "zlib": require.resolve("browserify-zlib") ,
// "path": require.resolve("path-browserify"),
// "stream": require.resolve("stream-browserify"),
// "util": require.resolve("util/"),
"crypto": require.resolve("crypto-browserify")
}
Or you can add fallback using react-app-rewired as was described in Github https://github.com/facebook/create-react-app/issues/11756
Install react-app-rewired, create config-overrides.js
file in the root of your project.
My code in the file
module.exports = function override (config, env) {
console.log('override')
let loaders = config.resolve
loaders.fallback = {
"fs": false,
"tls": false,
"net": false,
"http": require.resolve("stream-http"),
"https": false,
"zlib": require.resolve("browserify-zlib") ,
"path": require.resolve("path-browserify"),
"stream": require.resolve("stream-browserify"),
"util": require.resolve("util/"),
"crypto": require.resolve("crypto-browserify")
}
return config
}
In package.json change scripts from
'start': 'react-scripts start'
to
'start': 'react-app-rewired start'
.
Then start project npm run start or yarn start
Solution 2:[2]
Solution 3:[3]
This looks like a new issue with many packages including web3 as these are not compatible with Webpack v5 without adding fallbacks for the polyfils.
Issue noted here: https://github.com/facebook/create-react-app/issues/11756
I solved this issue by adding the fallback to my webpack.config.js file;
module.exports = {
resolve: {
fallback: {
assert: require.resolve('assert'),
crypto: require.resolve('crypto-browserify'),
http: require.resolve('stream-http'),
https: require.resolve('https-browserify'),
os: require.resolve('os-browserify/browser'),
stream: require.resolve('stream-browserify'),
},
},
};
but also need but got compilation errors on the build process:
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory" error
this was resolved by adding to my .env file;
GENERATE_SOURCEMAP=false
hope this helps.
Solution 4:[4]
To use polyfill in webpack 5 in reactjs Follow the below steps:
First Install
npm install node-polyfill-webpack-plugin
module.(reference link: https://www.npmjs.com/package/node-polyfill-webpack-plugin)Then go to follow webpack.config.js --> node-module -> react-scripts -> config -> webpack.config.js
Then add below code:
const NodePolyfillPlugin = require("node-polyfill-webpack-plugin")
module.exports = {
// Other rules...
plugins: [
new NodePolyfillPlugin()
]
}
Solution 5:[5]
i overcame this problem by typing
npm audit fix --force
Solution 6:[6]
step 1) add in package.json "webpack": "^4.44.2" step 2) delete node modules and npm i again or yarn install
close app and run again, yarn start or npm start
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Aleksei Matiushkin |
Solution 2 | Zohab Ali |
Solution 3 | |
Solution 4 | Jay Patel |
Solution 5 | Brindle |
Solution 6 |